NginScript на практике

Thank you for reading this post, don't forget to subscribe!

NginScript — это сре­да выпол­не­ния JavaScript в Nginx. Его пар­сер в насто­я­щее вре­мя под­дер­жи­ва­ет ECMAScript 5 (обе­ща­ют в буду­щем рас­ши­рить под­держ­ку). Име­ет­ся ком­пи­ля­тор внут­рен­не­го байт­ко­да, кото­рый затем выпол­ня­ет­ся в Nginx каж­дый раз, когда вызы­ва­ет­ся JavaScript. Для это­го исполь­зу­ет­ся вир­ту­аль­ная маши­на на осно­ве регистров.

nginScript VM немно­го отли­ча­ет­ся от попу­ляр­ных вир­ту­аль­ных машин для JavaScript, так как сфо­ку­си­ро­ва­на на сер­вер­ных тре­бо­ва­ни­ях, а не опти­ми­за­ции для бра­у­зе­ров. Инте­рес­но, что каж­дый про­цесс запус­ка­ет­ся в отдель­ной вир­ту­аль­ной сре­де, поэто­му не потре­бу­ет­ся сбор­щик мусора.

Язык кон­фи­гов Nginx допол­ни­ли син­так­си­сом, при помо­щи кото­ро­го мож­но встра­и­вать бло­ки кода на JS непо­сред­ствен­но в файл кон­фи­гу­ра­ции. Для это­го исполь­зу­ет­ся две новых дирек­ти­вы: js_set и js_run. Они выпол­ня­ют­ся по мере обра­бот­ки тран­зак­ций HTTP, при этом для каж­до­го запро­са мож­но выпол­нить кор­рек­ти­ров­ку пара­мет­ров веб-сер­ве­ра, скор­рек­ти­ро­вать сам запрос или ответ, реа­ли­зо­вать весь­ма слож­ные условия.

Ко все­му про­че­му, мож­но при­оста­нав­ли­вать и воз­об­нов­лять любые бло­ки­ру­ю­щие опе­ра­ции, под­за­про­сы HTTP, к при­ме­ру. NginScript так­же при­го­дит­ся для созда­ния заглу­шек в каче­стве вре­мен­но­го (и не очень) реше­ния воз­ник­шей про­бле­му. Еще несколь­ко важ­ных при­ме­не­ний функ­ции: бло­ки­ров­ка нехороших/вредоносных запро­сов или уяз­ви­мо­стей, огра­ни­че­ние интен­сив­но­сти запросов.

Установка модуля nginScript

Для добав­ле­ния моду­ля потре­бу­ет­ся Nginx послед­ней версии:

# Закач­ка и рас­па­ков­ка Nginx с репо­зи­то­рия, тре­бу­ет­ся уста­нов­лен­ный Mercurial

Далее нуж­но полу­чить источ­ни­ки раз­ра­бот­ки nginScript:

# Кло­ни­ро­ва­ние репо­зи­то­рия c nginScript из Mercurial

После чего нуж­но пере­со­брать и обно­вить (уста­но­вить) Nginx:

# Ком­пи­ля­ция и уста­нов­ка Nginx с моду­лем nginScript

Учти­те, что nginScript все еще нахо­дит­ся в актив­ной раз­ра­бот­ке, так что сто­ит сле­дить за логом изме­не­ний и свое­вре­мен­но обнов­лять­ся до акту­аль­ных и более ста­биль­ных версий.

js_set

Дирек­ти­ва при­во­дит зна­че­ние пере­мен­ной к резуль­та­ту выпол­не­ния кода JS.nginScript js_set

Пере­мен­ная, назна­чен­ная при помо­щи js_set, может исполь­зо­вать­ся в любой дирек­ти­ве Nginx, кото­рая при­ни­ма­ет пере­мен­ные: limit_req_zoneproxy_pass и sub_filter, к примеру.

Примеры использования js_set

nginScript предо­став­ля­ет объ­ект запро­са и уме­ет пере­да­вать его в функ­цию в каче­стве пер­во­го пара­мет­ра. Мож­но счи­ты­вать и уста­нав­ли­вать свой­ства это­го объ­ек­та и исполь­зо­вать мето­ды досту­па и изме­не­ния запроса.

[codesyntax lang="php"]

[/codesyntax]

Воз­врат пара­мет­ров запро­са обрат­но клиенту

При помо­щи nginScript мож­но пере­на­пра­вить тра­фик, осно­вы­ва­ясь на дан­ных запро­са: куки, аргу­мен­ты, заго­лов­ки или клю­че­вые сло­ва в теле запроса.

[codesyntax lang="php"]

[/codesyntax]

Марш­ру­ти­за­ция тра­фи­ка на осно­ве нали­чия аргу­мен­та upstream

js_run

Дирек­ти­ва js_run выпол­ня­ет­ся на эта­пе гене­ра­ции кон­тен­та и исполь­зу­ет­ся для выпол­не­ния JavaScript и созда­ния отве­та HTTP.

Пример использования js_run

Она раз­ме­ща­ет­ся внут­ри бло­ка location в фай­ле кон­фи­гу­ра­ции Nginx и запус­ка­ет выпол­не­ние кода JS, когда место­по­ло­же­ние соот­вет­ству­ет запро­су URL.

[codesyntax lang="php"]

[/codesyntax]

Вывод на экран тек­ста "js_run test"

Новый модуль nginScript не пред­на­зна­чен для заме­ны моду­ля Lua или дру­гих встро­ен­ных язы­ков Nginx. Но с его помо­щью мож­но тести­ро­вать кон­фи­ги, про­ве­рять функ­ци­о­наль­ность, созда­вать фик­сы и закры­вать дыри. Фак­ти­че­ски nginScript дает воз­мож­ность рефак­то­рин­га про­цес­са раз­ра­бот­ки и раз­вер­ты­ва­ния веб-приложений.