1. 1
  2. 2
  3. 3
  4. 4
  5. 5

# конспект · шаг 5 из 5

Конспект: forward proxy, njs, модули

выжимка - её можно унести в заметки

Forward proxy, njs и остальные модули стандартной сборки - что есть в коробке, кроме привычного.

Forward proxy (1.31.0)

Обычный proxy_pass не умеет CONNECT, поэтому «просто прокси для сотрудников» раньше не собирался. Теперь есть ngx_http_tunnel_module:

server {
    listen 10.0.0.5:3128;
    resolver 10.0.0.2 ipv6=off;

    tunnel_pass;
    tunnel_connect_timeout 5s;
    tunnel_read_timeout    60s;

    satisfy any;
    allow 10.0.0.0/8;
    deny  all;
    auth_basic           "Corporate proxy";
    auth_basic_user_file /etc/nginx/.htpasswd;
}

tunnel_pass пишется без аргументов: $port в nginx не существует, а $host в запросе CONNECT не содержит порта. Явная форма - только $host:$request_port. resolver обязателен: без него nginx -t зелёный, а каждый CONNECT отдаёт 502 и no resolver defined to resolve ... в логе.

ситуация код
нет пароля или неверный 407 плюс Proxy-Authenticate
обычный GET через прокси 405
цель не отвечает или не разрешается 502

Белый список назначений - map $host плюс return 403; tunnel_allow_upstream только в коммерческой версии. Цель видит адрес прокси, а не клиента.

njs

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

  • 0.9.9 (май 2026) закрыл CVE-2026-8711 в ngx.fetch() и добавил js_access;
  • njs 1.0.0 (июнь 2026) объявил старый движок устаревшим в пользу QuickJS, но пакет nginx-module-njs под 1.31.5 несёт njs 1.0.1 всё ещё на старом движке - спрашивай njs.engine у своей сборки.

В js_access отказ - это r.return(403), а разрешение - пустой return; r.done() там даёт TypeError и 500.

Что ещё есть в стандартной сборке

Модуль Зачем
json_set достать значение из JSON в конфиге, путь пишется точками
secure_link ссылки с подписью и сроком годности
sub_filter подмена строк в теле ответа
mirror копия трафика на второй бэкенд
split_clients процентное разделение: A/B и канареечные выкладки
stub_status базовые метрики соединений
geo, map вычисление переменных
realip настоящий адрес клиента за прокси

Ловушки джокера

  • Собирать сторонний модуль ради того, что уже есть - половина «нужных модулей» из статей давно в коробке.
  • Считать документацию описанием своей сборки. В официальном alpine-образе нет image_filter, xslt, degradation и perl; в debian-образе они есть, но через load_module. Смотри nginx -V.
  • Открытый forward proxy - подарок спамерам: внутренний адрес в listen, allow и пароль обязательны.
  • Тяжёлый njs-скрипт роняет весь воркер. Замер: рост строки в цикле дал worker process exited on signal 9, и вместе с ним оборвались соседние соединения, к скрипту отношения не имевшие.

Комментарии

Пока нет комментариев. Будь первым!

Оставить комментарий

Комментарий появится после проверки. Email не публикуется. Войти, чтобы не вводить имя каждый раз.