Модуль ngx_stream_proxy_module

Пример конфигурации
Директивы
     proxy_bind
     proxy_buffer_size
     proxy_connect_timeout
     proxy_download_rate
     proxy_half_close
     proxy_next_upstream
     proxy_next_upstream_timeout
     proxy_next_upstream_tries
     proxy_pass
     proxy_protocol
     proxy_requests
     proxy_responses
     proxy_session_drop
     proxy_socket_keepalive
     proxy_ssl
     proxy_ssl_certificate
     proxy_ssl_certificate_key
     proxy_ssl_ciphers
     proxy_ssl_conf_command
     proxy_ssl_crl
     proxy_ssl_name
     proxy_ssl_password_file
     proxy_ssl_protocols
     proxy_ssl_server_name
     proxy_ssl_session_reuse
     proxy_ssl_trusted_certificate
     proxy_ssl_verify
     proxy_ssl_verify_depth
     proxy_timeout
     proxy_upload_rate

Модуль 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 address [transparent] | off;
Умолчание:
Контекст: 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 on | off;
Умолчание:
proxy_half_close off;
Контекст: stream, server

Эта директива появилась в версии 1.21.4.

Разрешает или запрещает независимое закрытие каждой из сторон проксируемого соединения TCP (“TCP half-close”). Если разрешено, то проксирование по TCP будет продолжаться, пока обе стороны не закроют соединение.

Синтаксис: proxy_next_upstream on | off;
Умолчание:
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 on | off;
Умолчание:
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 on | off;
Умолчание:
proxy_session_drop off;
Контекст: stream, server

Эта директива появилась в версии 1.15.8.

Позволяет завершить все сессии к проксируемому серверу, если он был удалён из группы или помечен как постоянно недоступный. Это может произойти вследствие повторного преобразования имён в адреса, а также при помощи команды API DELETE. Сервер может быть помечен как постоянно недоступный в случае неуспешной проверки работоспособности, а также при помощи команды API PATCH. Сессия завершается при обработке очередного события чтения или записи на стороне клиента или проксируемого сервера.

Эта директива доступна как часть коммерческой подписки.

Синтаксис: proxy_socket_keepalive on | off;
Умолчание:
proxy_socket_keepalive off;
Контекст: stream, server

Эта директива появилась в версии 1.15.6.

Конфигурирует поведение “TCP keepalive” для исходящих соединений к проксируемому серверу. По умолчанию для сокета действуют настройки операционной системы. Если указано значение “on”, то для сокета включается параметр SO_KEEPALIVE.

Синтаксис: proxy_ssl on | off;
Умолчание:
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 [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3];
Умолчание:
proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
Контекст: stream, server

Разрешает указанные протоколы для соединений с проксируемым сервером.

Параметр TLSv1.3 используется по умолчанию начиная с 1.23.4.

Синтаксис: proxy_ssl_server_name on | off;
Умолчание:
proxy_ssl_server_name off;
Контекст: stream, server

Разрешает или запрещает передачу имени сервера через расширение Server Name Indication протокола TLS (SNI, RFC 6066) при установлении соединения с проксируемым сервером.

Синтаксис: proxy_ssl_session_reuse on | off;
Умолчание:
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 on | off;
Умолчание:
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;