njs (JavaScript)
Тема дорожной карты · Nginx
Модуль njs — это подмножество JavaScript, позволяющее расширять функциональность Nginx путём написания пользовательской логики обработки запросов непосредственно на JavaScript, исполняемой нативно внутри процесса веб-сервера Nginx без внешней среды выполнения. Скрипты njs загружаются через директиву js_import и могут вызываться в контекстах http и stream с помощью js_content для обработчиков контента и js_set для задания переменных, что открывает возможности для сложных потоков аутентификации, трансформации запросов/ответов и пользовательской логики маршрутизации. В отличие от Lua, используемого в OpenResty, njs — это специализированная среда скриптинга для Nginx, которая не поддерживает все API ECMAScript, но обеспечивает стабильную и предсказуемую производительность, подходящую для обработки продакшен-трафика. Модуль njs поставляется вместе с официальным дистрибутивом Nginx и может быть установлен как динамический модуль из репозитория пакетов Nginx без патчинга или перекомпиляции бинарного файла Nginx. Используя модуль njs, инженеры могут реализовать валидацию JWT, подпись запросов, логику A/B-тестирования и динамический выбор upstream в удобном синтаксисе JavaScript, а не в виде сложных директив конфигурации Nginx.
Как это работает
njs (JavaScript) покрывает third-party модули: ngx_brotli (сжатие), ngx_http_geoip2 (GeoIP-решения), ngx_pagespeed (HTTP-оптимизация, upstream deprecated — см. Google PageSpeed Insights), ngx_http_lua (OpenResty — Lua-скриптинг внутри nginx), ngx_http_secure_link (подписанные URL), ModSecurity (WAF), naxsi (WAF проще). OpenResty пакетирует nginx + Lua + много модулей — частая основа для API-шлюзов (Kong, APISIX).
Когда применять
OpenResty — когда нужна реальная программируемость в request-пути (кастомная auth, продвинутый rate limit, динамический routing); Lua быстр + безопасен внутри nginx. ModSecurity или naxsi — когда WAF обязателен по compliance (PCI-DSS); но CDN с встроенным WAF (Cloudflare, Yandex Cloud Smart Web Security) обычно проще. ngx_brotli — для лучшего сжатия текста.
Типичные ошибки
Ловушки njs (JavaScript): сложная Lua в OpenResty, которую никто в команде не дебажит (knowledge silo); ModSecurity rule sets, блокирующие легитимный трафик (false positives — тюньте осторожно); кастомные модули требуют пересборки nginx (используйте distro-пакеты или Docker-образы с ними).