Модуль ngx_stream_proxy_module
Модуль ngx_stream_proxy_module
(1.9.0) позволяет проксировать
потоки данных по TCP, UDP (1.9.13) и UNIX-сокетам.
Пример конфигурации
server { listen 127.0.0.1:12345; proxy_pass 127.0.0.1:8080; } server { listen 12345; proxy_connect_timeout 1s; proxy_timeout 1m; proxy_pass example.com:12345; } server { listen 53 udp reuseport; proxy_timeout 20s; proxy_pass dns.example.com:53; } server { listen [::1]:12345; proxy_pass unix:/tmp/stream.socket; }
Директивы
Синтаксис: |
proxy_bind
|
---|---|
Умолчание: | — |
Контекст: |
stream , server |
Эта директива появилась в версии 1.9.2.
Задаёт локальный IP-адрес
, который будет использоваться в
исходящих соединениях с проксируемым сервером.
В значении параметра допустимо использование переменных (1.11.2).
Специальное значение off
отменяет действие
унаследованной с предыдущего уровня конфигурации
директивы proxy_bind
, позволяя системе
самостоятельно выбирать локальный IP-адрес.
Параметр transparent
(1.11.0) позволяет
задать нелокальный IP-aдрес, который будет использоваться в
исходящих соединениях с проксируемым сервером,
например, реальный IP-адрес клиента:
proxy_bind $remote_addr transparent;
Для работы параметра
обычно требуется
запустить рабочие процессы nginx с привилегиями
суперпользователя.
В Linux этого не требуется (1.13.8), так как если
указан параметр transparent
, то рабочие процессы
наследуют capability CAP_NET_RAW
из главного процесса.
Также необходимо настроить таблицу маршрутизации ядра
для перехвата сетевого трафика с проксируемого сервера.
Синтаксис: |
proxy_buffer_size |
---|---|
Умолчание: |
proxy_buffer_size 16k; |
Контекст: |
stream , server |
Эта директива появилась в версии 1.9.4.
Задаёт размер
буфера, в который будут читаться данные,
получаемые от проксируемого сервера.
Также задаёт размер
буфера, в который будут читаться данные,
получаемые от клиента.
Синтаксис: |
proxy_connect_timeout |
---|---|
Умолчание: |
proxy_connect_timeout 60s; |
Контекст: |
stream , server |
Задаёт таймаут для установления соединения с проксированным сервером.
Синтаксис: |
proxy_download_rate |
---|---|
Умолчание: |
proxy_download_rate 0; |
Контекст: |
stream , server |
Эта директива появилась в версии 1.9.3.
Ограничивает скорость чтения данных от проксируемого сервера.
Скорость
задаётся в байтах в секунду.
Значение 0 отключает ограничение скорости.
Ограничение устанавливается на соединение,
поэтому, если nginx одновременно
откроет два соединения к проксируемому серверу,
суммарная скорость будет вдвое выше заданного ограничения.
В значении параметра можно использовать переменные (1.17.0). Это может быть полезно в случаях, когда скорость нужно ограничивать в зависимости от какого-либо условия:
map $slow $rate { 1 4k; 2 8k; } proxy_download_rate $rate;
Синтаксис: |
proxy_half_close |
---|---|
Умолчание: |
proxy_half_close off; |
Контекст: |
stream , server |
Эта директива появилась в версии 1.21.4.
Разрешает или запрещает независимое закрытие каждой из сторон проксируемого соединения TCP (“TCP half-close”). Если разрешено, то проксирование по TCP будет продолжаться, пока обе стороны не закроют соединение.
Синтаксис: |
proxy_next_upstream |
---|---|
Умолчание: |
proxy_next_upstream on; |
Контекст: |
stream , server |
При невозможности установить соединение с проксируемым сервером определяет, будет ли клиентское соединение передано следующему серверу.
Передача соединения следующему серверу может быть ограничена по количеству попыток и по времени.
Синтаксис: |
proxy_next_upstream_timeout |
---|---|
Умолчание: |
proxy_next_upstream_timeout 0; |
Контекст: |
stream , server |
Ограничивает время, в течение которого возможна передача соединения
следующему серверу.
Значение 0
отключает это ограничение.
Синтаксис: |
proxy_next_upstream_tries |
---|---|
Умолчание: |
proxy_next_upstream_tries 0; |
Контекст: |
stream , server |
Ограничивает число допустимых попыток для передачи соединения
следующему серверу.
Значение 0
отключает это ограничение.
Синтаксис: |
proxy_pass |
---|---|
Умолчание: | — |
Контекст: |
server |
Задаёт адрес проксируемого сервера. Адрес может быть указан в виде доменного имени или IP-адреса, и порта:
proxy_pass localhost:12345;
или в виде пути UNIX-сокета:
proxy_pass unix:/tmp/stream.socket;
Если доменному имени соответствует несколько адресов, то все они будут использоваться по очереди (round-robin). Кроме того, в качестве адреса можно указать группу серверов.
Адрес можно также задать с помощью переменных (1.11.3):
proxy_pass $upstream;
В этом случае имя сервера ищется среди описанных групп серверов и если не найдено, то определяется с помощью resolver’а.
Синтаксис: |
proxy_protocol |
---|---|
Умолчание: |
proxy_protocol off; |
Контекст: |
stream , server |
Эта директива появилась в версии 1.9.2.
Включает протокол PROXY для соединений с проксируемым сервером.
Синтаксис: |
proxy_requests |
---|---|
Умолчание: |
proxy_requests 0; |
Контекст: |
stream , server |
Эта директива появилась в версии 1.15.7.
Задаёт число датаграмм, полученных от клиента, по достижении которого удаляется привязка между клиентом и существующей UDP-сессией. После получения указанного количества датаграмм следующая датаграмма, полученная от того же клиента, начинает новую сессию. Cессия завершится после отправки всех принятых датаграмм на проксируемый сервер и получения указанного количества ответов или после таймаута.
Синтаксис: |
proxy_responses |
---|---|
Умолчание: | — |
Контекст: |
stream , server |
Эта директива появилась в версии 1.9.13.
Задаёт количество датаграмм, ожидаемых от проксируемого сервера в ответ на датаграмму клиента в случае, если используется протокол UDP. Задаваемое число cлужит подсказкой для завершения сессии. По умолчанию количество датаграмм не ограничено.
Если указано нулевое значение, то ответ не ожидается. Однако если ответ получен и сессия ещё не завершилась, то ответ будет обработан.
Синтаксис: |
proxy_session_drop |
---|---|
Умолчание: |
proxy_session_drop off; |
Контекст: |
stream , server |
Эта директива появилась в версии 1.15.8.
Позволяет завершить все сессии к проксируемому серверу,
если он был удалён из группы или помечен как постоянно недоступный.
Это может произойти вследствие повторного
преобразования имён
в адреса, а также при помощи команды API
DELETE
.
Сервер может быть помечен как постоянно недоступный в случае неуспешной
проверки работоспособности,
а также при помощи команды API
PATCH
.
Сессия завершается при обработке очередного
события чтения или записи на стороне клиента или проксируемого сервера.
Эта директива доступна как часть коммерческой подписки.
Синтаксис: |
proxy_socket_keepalive |
---|---|
Умолчание: |
proxy_socket_keepalive off; |
Контекст: |
stream , server |
Эта директива появилась в версии 1.15.6.
Конфигурирует поведение “TCP keepalive”
для исходящих соединений к проксируемому серверу.
По умолчанию для сокета действуют настройки операционной системы.
Если указано значение “on
”, то
для сокета включается параметр SO_KEEPALIVE
.
Синтаксис: |
proxy_ssl |
---|---|
Умолчание: |
proxy_ssl off; |
Контекст: |
stream , server |
Включает протоколы SSL/TLS для соединений с проксируемым сервером.
Синтаксис: |
proxy_ssl_certificate |
---|---|
Умолчание: | — |
Контекст: |
stream , server |
Задаёт файл
с сертификатом в формате PEM
для аутентификации на проксируемом сервере.
Начиная с версии 1.21.0 в имени файла можно использовать переменные.
Синтаксис: |
proxy_ssl_certificate_key |
---|---|
Умолчание: | — |
Контекст: |
stream , server |
Задаёт файл
с секретным ключом в формате PEM
для аутентификации на проксируемом сервере.
Начиная с версии 1.21.0 в имени файла можно использовать переменные.
Синтаксис: |
proxy_ssl_ciphers |
---|---|
Умолчание: |
proxy_ssl_ciphers DEFAULT; |
Контекст: |
stream , server |
Описывает разрешённые шифры для соединений с проксируемым сервером. Шифры задаются в формате, поддерживаемом библиотекой OpenSSL.
Полный список можно посмотреть с помощью команды
“openssl ciphers
”.
Синтаксис: |
proxy_ssl_conf_command |
---|---|
Умолчание: | — |
Контекст: |
stream , server |
Эта директива появилась в версии 1.19.4.
Задаёт произвольные конфигурационные команды OpenSSL при установлении соединения с проксируемым сервером.
Директива поддерживается при использовании OpenSSL 1.0.2 и выше.
На одном уровне может быть указано
несколько директив proxy_ssl_conf_command
.
Директивы наследуются с предыдущего уровня конфигурации при условии, что
на данном уровне не описаны
свои директивы proxy_ssl_conf_command
.
Следует учитывать, что изменение настроек OpenSSL напрямую может привести к неожиданному поведению.
Синтаксис: |
proxy_ssl_crl |
---|---|
Умолчание: | — |
Контекст: |
stream , server |
Указывает файл
с отозванными сертификатами (CRL)
в формате PEM, используемыми при проверке
сертификата проксируемого сервера.
Синтаксис: |
proxy_ssl_key_log путь; |
---|---|
Умолчание: | — |
Контекст: |
stream , server |
Эта директива появилась в версии 1.27.2.
Включает логирование SSL-ключей соединений с проксируемым сервером и указывает путь к лог-файлу ключей. Ключи записываются в формате SSLKEYLOGFILE совместимом с Wireshark.
Директива доступна как часть коммерческой подписки.
Синтаксис: |
proxy_ssl_name |
---|---|
Умолчание: |
proxy_ssl_name хост из proxy_pass; |
Контекст: |
stream , server |
Позволяет переопределить имя сервера, используемое при проверке сертификата проксируемого сервера, а также для передачи его через SNI при установлении соединения с проксируемым сервером. Имя сервера можно также задать с помощью переменных (1.11.3).
По умолчанию используется имя хоста из адреса, заданного директивой proxy_pass.
Синтаксис: |
proxy_ssl_password_file |
---|---|
Умолчание: | — |
Контекст: |
stream , server |
Задаёт файл
с паролями от
секретных ключей,
где каждый пароль указан на отдельной строке.
Пароли применяются по очереди в момент загрузки ключа.
Синтаксис: |
proxy_ssl_protocols
[ |
---|---|
Умолчание: |
proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; |
Контекст: |
stream , server |
Разрешает указанные протоколы для соединений с проксируемым сервером.
Параметр TLSv1.3
используется по умолчанию
начиная с 1.23.4.
Синтаксис: |
proxy_ssl_server_name |
---|---|
Умолчание: |
proxy_ssl_server_name off; |
Контекст: |
stream , server |
Разрешает или запрещает передачу имени сервера через расширение Server Name Indication протокола TLS (SNI, RFC 6066) при установлении соединения с проксируемым сервером.
Синтаксис: |
proxy_ssl_session_reuse |
---|---|
Умолчание: |
proxy_ssl_session_reuse on; |
Контекст: |
stream , server |
Определяет, использовать ли повторно SSL-сессии при
работе с проксируемым сервером.
Если в логах появляются ошибки
“SSL3_GET_FINISHED:digest check failed
”,
то можно попробовать выключить
повторное использование сессий.
Синтаксис: |
proxy_ssl_trusted_certificate |
---|---|
Умолчание: | — |
Контекст: |
stream , server |
Задаёт файл
с доверенными сертификатами CA в формате PEM,
используемыми при проверке
сертификата проксируемого сервера.
Синтаксис: |
proxy_ssl_verify |
---|---|
Умолчание: |
proxy_ssl_verify off; |
Контекст: |
stream , server |
Разрешает или запрещает проверку сертификата проксируемого сервера.
Синтаксис: |
proxy_ssl_verify_depth |
---|---|
Умолчание: |
proxy_ssl_verify_depth 1; |
Контекст: |
stream , server |
Устанавливает глубину проверки в цепочке сертификатов проксируемого сервера.
Синтаксис: |
proxy_timeout |
---|---|
Умолчание: |
proxy_timeout 10m; |
Контекст: |
stream , server |
Задаёт таймаут
между двумя идущими подряд
операциями чтения или записи
на клиентском соединении или соединении с проксируемым сервером.
Если по истечении этого времени данные не передавались,
соединение закрывается.
Синтаксис: |
proxy_upload_rate |
---|---|
Умолчание: |
proxy_upload_rate 0; |
Контекст: |
stream , server |
Эта директива появилась в версии 1.9.3.
Ограничивает скорость чтения данных от клиента.
Скорость
задаётся в байтах в секунду.
Значение 0 отключает ограничение скорости.
Ограничение устанавливается на соединение,
поэтому, если клиент одновременно
откроет два соединения,
суммарная скорость будет вдвое выше заданного ограничения.
В значении параметра можно использовать переменные (1.17.0). Это может быть полезно в случаях, когда скорость нужно ограничивать в зависимости от какого-либо условия:
map $slow $rate { 1 4k; 2 8k; } proxy_upload_rate $rate;