Proxy#

Позволяет проксировать потоки данных по TCP, UDP и 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#

Синтаксис

proxy_bind адрес [transparent] | off;

По умолчанию

Контекст

stream, server

Задает локальный IP-адрес, который будет использоваться в исходящих соединениях с проксируемым сервером. В значении параметра допустимо использование переменных. Специальное значение off отменяет действие унаследованной с предыдущего уровня конфигурации директивы proxy_bind, позволяя системе самостоятельно выбирать локальный IP-адрес.

Параметр transparent позволяет задать нелокальный IP-aдрес, который будет использоваться в исходящих соединениях с проксируемым сервером, например, реальный IP-адрес клиента:

proxy_bind $remote_addr transparent;

Для работы параметра обычно требуется запустить рабочие процессы Angie с привилегиями суперпользователя. В Linux этого не требуется, так как если указан параметр transparent, то рабочие процессы наследуют capability CAP_NET_RAW из главного процесса.

Важно

Необходимо настроить таблицу маршрутизации ядра для перехвата сетевого трафика с проксируемого сервера.

proxy_buffer_size#

Синтаксис

proxy_buffer_size размер;

По умолчанию

proxy_buffer_size 16k;

Контекст

stream, server

Задает размер буфера, в который будут читаться данные, получаемые от проксируемого сервера. Также задает размер буфера, в который будут читаться данные, получаемые от клиента.

proxy_connect_timeout#

Синтаксис

proxy_connect_timeout время;

По умолчанию

proxy_connect_timeout 60s;

Контекст

stream, server

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

proxy_connection_drop#

Синтаксис

proxy_connection_drop время | on | off;

По умолчанию

proxy_connection_drop off;

Контекст

http, server, location

Настраивает завершение всех соединений с проксируемым сервером, если он был удален из группы или помечен как постоянно недоступный в результате процесса reresolve или команды API DELETE.

Сессия завершается, когда обрабатывается следующее событие чтения или записи для клиента или проксируемого сервера.

Установка времени включает таймаут до завершения сессии; при выборе значения on сессии завершаются немедленно.

proxy_download_rate#

Синтаксис

proxy_download_rate скорость;

По умолчанию

proxy_download_rate 0;

Контекст

stream, server

Ограничивает скорость чтения данных от проксируемого сервера; скорость задается в байтах в секунду.

0

отключает ограничение скорости

Примечание

Ограничение устанавливается на соединение, поэтому, если Angie одновременно откроет два соединения к проксируемому серверу, суммарная скорость будет вдвое выше заданного ограничения.

В значении параметра можно использовать переменные. Это может быть полезно в случаях, когда скорость нужно ограничивать в зависимости от какого-либо условия:

map $slow $rate {
    1     4k;
    2     8k;
}

proxy_download_rate $rate

proxy_half_close#

Синтаксис

proxy_half_close on | off;

По умолчанию

proxy_half_close off;

Контекст

stream, server

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

proxy_next_upstream#

Синтаксис

proxy_next_upstream on | off;

По умолчанию

proxy_next_upstream on;

Контекст

stream, server

При невозможности установить соединение с проксируемым сервером определяет, будет ли клиентское соединение передано следующему серверу.

Передача соединения следующему серверу может быть ограничена по количеству попыток и по времени.

proxy_next_upstream_timeout#

Синтаксис

proxy_next_upstream_timeout время;

По умолчанию

proxy_next_upstream_timeout 0;

Контекст

stream, server

Ограничивает время, в течение которого возможна передача запроса следующему серверу.

0

отключает это ограничение

proxy_next_upstream_tries#

Синтаксис

proxy_next_upstream_tries число;

По умолчанию

proxy_next_upstream_tries 0;

Контекст

stream, server

Ограничивает число допустимых попыток для передачи запроса следующему серверу.

0

отключает это ограничение

proxy_pass#

Синтаксис

proxy_pass адрес;

По умолчанию

Контекст

server

Задает адрес проксируемого сервера; адрес может быть указан в виде доменного имени или IP-адреса, за которым следует порт:

proxy_pass localhost:12345;

или в виде пути UNIX-сокета:

proxy_pass unix:/tmp/stream.socket;

Если доменному имени соответствует несколько адресов, то все они будут использоваться по очереди (round-robin). Кроме того, в качестве адреса можно указать группу серверов.

Адрес можно также задать с помощью переменных:

proxy_pass $upstream;

В этом случае имя сервера ищется среди описанных групп серверов и если не найдено, то определяется с помощью resolver'а.

proxy_protocol#

Синтаксис

proxy_protocol on | off;

По умолчанию

proxy_protocol off;

Контекст

stream, server

Включает протокол PROXY для соединений с проксируемым сервером.

proxy_requests#

Синтаксис

proxy_requests число;

По умолчанию

proxy_requests 0;

Контекст

stream, server

Задает число датаграмм, полученных от клиента, по достижении которого удаляется привязка между клиентом и существующей UDP-сессией. После получения указанного количества датаграмм следующая датаграмма, полученная от того же клиента, начинает новую сессию. Сессия завершится после отправки всех принятых датаграмм на проксируемый сервер и получения указанного количества ответов или после таймаута.

proxy_responses#

Синтаксис

proxy_responses число;

По умолчанию

Контекст

stream, server

Задает количество датаграмм, ожидаемых от проксируемого сервера в ответ на датаграмму клиента в случае, если используется протокол UDP. Задаваемое число служит подсказкой для завершения сессии. По умолчанию количество датаграмм не ограничено.

Если указано нулевое значение, то ответ не ожидается. Однако если ответ получен и сессия еще не завершилась, то ответ будет обработан.

proxy_socket_keepalive#

Синтаксис

proxy_socket_keepalive on | off;

По умолчанию

proxy_socket_keepalive off;

Контекст

stream, server

Конфигурирует поведение "TCP keepalive" для исходящих соединений к проксируемому серверу.

""

По умолчанию для сокета действуют настройки операционной системы.

on

для сокета включается параметр SO_KEEPALIVE

proxy_ssl#

Синтаксис

proxy_ssl on | off;

По умолчанию

proxy_ssl off;

Контекст

stream, server

Включает протоколы SSL/TLS для соединений с проксируемым сервером.

proxy_ssl_certificate#

Синтаксис

proxy_ssl_certificate файл [файл];

По умолчанию

Контекст

stream, server

Задает файл с сертификатом в формате PEM для аутентификации на проксируемом сервере. В имени файла можно использовать переменные.

Добавлено в версии 1.2.0.

При включенном proxy_ssl_ntls директива принимает два аргумента вместо одного:

server {
    proxy_ssl_ntls  on;

    proxy_ssl_certificate      sign.crt enc.crt;
    proxy_ssl_certificate_key  sign.key enc.key;

    proxy_ssl_ciphers "ECC-SM2-WITH-SM4-SM3:ECDHE-SM2-WITH-SM4-SM3:RSA";

    proxy_pass backend:12345;
}

proxy_ssl_certificate_key#

Синтаксис

proxy_ssl_certificate_key файл [файл];

По умолчанию

Контекст

stream, server

Задает файл с секретным ключом в формате PEM для аутентификации на проксируемом сервере. В имени файла можно использовать переменные.

Добавлено в версии 1.2.0.

При включенном proxy_ssl_ntls директива принимает два аргумента вместо одного:

server {
    proxy_ssl_ntls  on;

    proxy_ssl_certificate      sign.crt enc.crt;
    proxy_ssl_certificate_key  sign.key enc.key;

    proxy_ssl_ciphers "ECC-SM2-WITH-SM4-SM3:ECDHE-SM2-WITH-SM4-SM3:RSA";

    proxy_pass backend:12345;
}

proxy_ssl_ciphers#

Синтаксис

proxy_ssl_ciphers шифры;

По умолчанию

proxy_ssl_ciphers DEFAULT;

Контекст

stream, server

Описывает разрешенные шифры для запросов к проксируемому серверу. Шифры задаются в формате, поддерживаемом библиотекой OpenSSL.

Полный список можно посмотреть с помощью команды "openssl ciphers".

proxy_ssl_conf_command#

Синтаксис

proxy_ssl_conf_command имя значение;

По умолчанию

Контекст

stream, server

Задает произвольные конфигурационные команды OpenSSL при установлении соединения с проксируемым сервером.

Важно

Директива поддерживается при использовании OpenSSL 1.0.2 и выше.

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

Осторожно

Следует учитывать, что изменение настроек OpenSSL напрямую может привести к неожиданному поведению.

proxy_ssl_crl#

Синтаксис

proxy_ssl_crl файл;

По умолчанию

Контекст

stream, server

Указывает файл с отозванными сертификатами (CRL) в формате PEM, используемыми при проверке сертификата проксируемого сервера.

proxy_ssl_name#

Синтаксис

proxy_ssl_name имя;

По умолчанию

proxy_ssl_name хост из proxy_pass;

Контекст

stream, server

Позволяет переопределить имя сервера, используемое при проверке сертификата проксируемого сервера, а также для передачи его через SNI при установлении соединения с проксируемым сервером. Имя сервера можно также задать с помощью переменных.

По умолчанию используется имя хоста из адреса, заданного директивой proxy_pass.

proxy_ssl_ntls#

Добавлено в версии 1.2.0.

Синтаксис

proxy_ssl_ntls on | off;

По умолчанию

proxy_ssl_ntls off;

Контекст

stream, server

Включает клиентскую поддержку NTLS при использовании TLS библиотеки TongSuo.

server {
    proxy_ssl_ntls  on;

    proxy_ssl_certificate      sign.crt enc.crt;
    proxy_ssl_certificate_key  sign.key enc.key;

    proxy_ssl_ciphers "ECC-SM2-WITH-SM4-SM3:ECDHE-SM2-WITH-SM4-SM3:RSA";

    proxy_pass backend:12345;
}

Важно

Angie необходимо собрать с использованием параметра конфигурации --with-ntls, с соответствующей SSL библиотекой с поддержкой NTLS

./configure --with-openssl=../Tongsuo-8.3.0 \
            --with-openssl-opt=enable-ntls  \
            --with-ntls

proxy_ssl_password_file#

Синтаксис

proxy_ssl_password_file файл;

По умолчанию

Контекст

stream, server

Задает файл с паролями от секретных ключей, где каждый пароль указан на отдельной строке. Пароли применяются по очереди в момент загрузки ключа.

proxy_ssl_protocols#

Синтаксис

proxy_ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3];

По умолчанию

proxy_ssl_protocols TLSv1.2 TLSv1.3;

Контекст

stream, server

Изменено в версии 1.2.0: Параметр TLSv1.3 добавлен к используемым по умолчанию.

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

proxy_ssl_server_name#

Синтаксис

proxy_ssl_server_name on | off;

По умолчанию

proxy_ssl_server_name off;

Контекст

stream, server

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

proxy_ssl_session_reuse#

Синтаксис

proxy_ssl_session_reuse on | off;

По умолчанию

proxy_ssl_session_reuse on;

Контекст

stream, server

Определяет, использовать ли повторно SSL-сессии при работе с проксируемым сервером. Если в логах появляются ошибки "SSL3_GET_FINISHED:digest check failed", то можно попробовать выключить повторное использование сессий.

proxy_ssl_trusted_certificate#

Синтаксис

proxy_ssl_trusted_certificate файл;

По умолчанию

Контекст

stream, server

Задает файл с доверенными сертификатами CA в формате PEM, используемыми при проверке сертификата проксируемого HTTPS-сервера.

proxy_ssl_verify#

Синтаксис

proxy_ssl_verify on | off;

По умолчанию

proxy_ssl_verify off;

Контекст

stream, server

Разрешает или запрещает проверку сертификата проксируемого сервера.

proxy_ssl_verify_depth#

Синтаксис

proxy_ssl_verify_depth число;

По умолчанию

proxy_ssl_verify_depth 1;

Контекст

stream, server

Устанавливает глубину проверки в цепочке сертификатов проксируемого сервера.

proxy_timeout#

Синтаксис

proxy_timeout время;

По умолчанию

proxy_timeout 10m;

Контекст

stream, server

Задает таймаут между двумя идущими подряд операциями чтения или записи на клиентском соединении или соединении с проксируемым сервером. Если по истечении этого времени данные не передавались, соединение закрывается.

upstream_probe_timeout (PRO)#

Добавлено в версии 1.4.0: PRO

Синтаксис

upstream_probe_timeout время;

По умолчанию

upstream_probe_timeout 50s;

Контекст

server

Задает максимальное время бездействия установленного с сервером соединения для проверок, настроенных с помощью директивы upstream_probe (PRO); при превышении этого предела соединение будет закрыто.

proxy_upload_rate#

Синтаксис

proxy_upload_rate скорость;

По умолчанию

proxy_upload_rate 0;

Контекст

stream, server

Ограничивает скорость чтения данных от клиента. Скорость задается в байтах в секунду.

0

отключает ограничение скорости

Примечание

Ограничение устанавливается на соединение, поэтому, если клиент одновременно откроет два соединения, суммарная скорость будет вдвое выше заданного ограничения.

В значении параметра можно использовать переменные. Это может быть полезно в случаях, когда скорость нужно ограничивать в зависимости от какого-либо условия:

proxy_upload_rate $rate;

map $slow $rate {
    1     4k;
    2     8k;
}

proxy_upload_rate $rate;