На конференции nginx.conf 2015 объявлено об интеграции в кодовую базу http-сервера nginx предварительной версии модуля ngx_http_js_module с реализацией средств для выполнения скриптов, написанных на языке JavaScript. Скрипты на JavaScript могут использоваться в файле конфигурации для определения расширенной логики обработки запросов, формирования конфигурации, динамической генерации ответа, модификации запроса/ответа или быстрого создания заглушек с решением проблем в web-приложениях.

Скрипт запускается посредством директивы js_run (пример) и позволяет на стороне сервера выполнять многие низкоуровневые операции с запросом, без необходимости написания отдельного модуля на языке Си. Для выполнения скриптов используется собственный движок njs с реализацией виртуальной машины для урезанного подмножества языка JavaScript, упоминаемого как nginScript. На каждый запрос запускается отдельная виртуальная машина, что позволяет обойтись без сборщика мусора.

JavaScript выбран как наиболее популярный язык программирования. Хорошим претендентом являлся Lua, но он не так широко известен в среде web-разработчиков. Необходимость создания собственной виртуальной машины JavaScript обусловлена тем, что существующие движки оптимизированы для работы в браузере, в то время как для nginx необходима реализация, рассчитанная на серверное применение.

Основными составными частями nginScript являются:

  • Виртуальная машина и компилятор байткода с очень быстрым запуском и завершением работы. Блокирующие операции, такие как подзапросы HTTP, могут быть приостановлены и возобновлены по аналогии с другими блокирующими операциями в JavaScript;
  • Синтаксис конфигурации, позволяющий встраивать блоки кода на JavaScript в файл конфигурации nginx. Подобные блоки выполняются по мере обработки HTTP-транзакций и позволяют для каждого запроса выполнять такие операции как корректировка внутренних параметров nginx, создание изощрённых условных конфигураций или изменение запроса/ответа.

Основные задачи, для которых может применяться nginScript:

  • Блокирование угроз, связанных с безопасностью. При помощи nginScript можно динамически блокировать вредоносные запросы, эксплуатирующие уязвимости в web-приложениях или ограничивать интенсивность определённых запросов;
  • Обеспечение более полного управления трафиком. Например, можно реализовать гибкие правила перенаправления трафика, использующие информацию из тела запроса и других источников;
  • Консолидация функции между приложениями через вынос дублирующейся функциональности из приложения;
  • Быстрая разработка приложений с использованием типовых библиотек функций. Код на nginScript может быть вынесен в библиотеки и использован другими пользователями;
  • Из возможных применений в будущем упоминаются такие возможности как исправления ошибок в web-приложениях, изменение бизнес-правил, персонализация работы пользователей и распределение запросов на несколько серверов с последующей агрегацией ответов от них.


Источник: http://www.opennet.ru/opennews/art.shtml?num=43022