Модуль 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_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; | 
| Контекст: | stream,server | 
Разрешает указанные протоколы для соединений с проксируемым сервером.
| Синтаксис: | 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;
