# конспект · шаг 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, и вместе с ним оборвались соседние соединения, к скрипту отношения не имевшие.
Комментарии
Пока нет комментариев. Будь первым!
Оставить комментарий