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#
Задает локальный 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_connect_timeout#
|
|
По умолчанию |
|
stream, server |
Задает таймаут для установления соединения с проксируемым сервером.
proxy_connection_drop#
|
|
По умолчанию |
|
http, server, location |
Настраивает завершение всех соединений с проксируемым сервером,
если он был удален из группы или помечен как постоянно недоступный
в результате процесса reresolve
или команды API DELETE
.
Сессия завершается, когда обрабатывается следующее событие чтения или записи для клиента или проксируемого сервера.
Установка времени включает таймаут до завершения сессии;
при выборе значения on
сессии завершаются немедленно.
proxy_download_rate#
Ограничивает скорость чтения данных от проксируемого сервера;
скорость
задается в байтах в секунду.
|
отключает ограничение скорости |
Примечание
Ограничение устанавливается на соединение, поэтому, если Angie одновременно откроет два соединения к проксируемому серверу, суммарная скорость будет вдвое выше заданного ограничения.
В значении параметра можно использовать переменные. Это может быть полезно в случаях, когда скорость нужно ограничивать в зависимости от какого-либо условия:
map $slow $rate {
1 4k;
2 8k;
}
proxy_download_rate $rate
proxy_half_close#
Разрешает или запрещает независимое закрытие каждой из сторон проксируемого соединения TCP ("TCP half-close"). Если разрешено, то проксирование по TCP будет продолжаться, пока обе стороны не закроют соединение.
proxy_next_upstream#
|
|
По умолчанию |
|
stream, server |
При невозможности установить соединение с проксируемым сервером определяет, будет ли клиентское соединение передано следующему серверу.
Передача соединения следующему серверу может быть ограничена по количеству попыток и по времени.
proxy_next_upstream_timeout#
|
|
По умолчанию |
|
stream, server |
Ограничивает время, в течение которого возможна передача запроса следующему серверу.
|
отключает это ограничение |
proxy_next_upstream_tries#
|
|
По умолчанию |
|
stream, server |
Ограничивает число допустимых попыток для передачи запроса следующему серверу.
|
отключает это ограничение |
proxy_pass#
Задает адрес проксируемого сервера;
адрес
может быть указан в виде доменного имени или IP-адреса,
за которым следует порт:
proxy_pass localhost:12345;
или в виде пути UNIX-сокета:
proxy_pass unix:/tmp/stream.socket;
Если доменному имени соответствует несколько адресов, то все они будут использоваться по очереди (round-robin). Кроме того, в качестве адреса можно указать группу серверов.
Адрес можно также задать с помощью переменных:
proxy_pass $upstream;
В этом случае имя сервера ищется среди описанных групп серверов и если не найдено, то определяется с помощью resolver'а.
proxy_protocol#
Включает протокол PROXY для соединений с проксируемым сервером.
proxy_requests#
Задает число датаграмм, полученных от клиента, по достижении которого удаляется привязка между клиентом и существующей UDP-сессией. После получения указанного количества датаграмм следующая датаграмма, полученная от того же клиента, начинает новую сессию. Сессия завершится после отправки всех принятых датаграмм на проксируемый сервер и получения указанного количества ответов или после таймаута.
proxy_responses#
Задает количество датаграмм, ожидаемых от проксируемого сервера в ответ на датаграмму клиента в случае, если используется протокол UDP. Задаваемое число служит подсказкой для завершения сессии. По умолчанию количество датаграмм не ограничено.
Если указано нулевое значение, то ответ не ожидается. Однако если ответ получен и сессия еще не завершилась, то ответ будет обработан.
proxy_socket_keepalive#
|
|
По умолчанию |
|
stream, server |
Конфигурирует поведение "TCP keepalive" для исходящих соединений к проксируемому серверу.
|
По умолчанию для сокета действуют настройки операционной системы. |
|
для сокета включается параметр SO_KEEPALIVE |
proxy_ssl#
Включает протоколы SSL/TLS для соединений с проксируемым сервером.
proxy_ssl_certificate#
Задает файл с сертификатом в формате 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#
Задает файл с секретным ключом в формате 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#
Описывает разрешенные шифры для запросов к проксируемому серверу. Шифры задаются в формате, поддерживаемом библиотекой OpenSSL.
Полный список можно посмотреть с помощью команды "openssl ciphers".
proxy_ssl_conf_command#
Задает произвольные конфигурационные команды OpenSSL при установлении соединения с проксируемым сервером.
Важно
Директива поддерживается при использовании OpenSSL 1.0.2 и выше.
На одном уровне может быть указано несколько директив proxy_ssl_conf_command. Директивы наследуются с предыдущего уровня конфигурации при условии, что на данном уровне не описаны свои директивы proxy_ssl_conf_command.
Осторожно
Следует учитывать, что изменение настроек OpenSSL напрямую может привести к неожиданному поведению.
proxy_ssl_crl#
Указывает файл с отозванными сертификатами (CRL) в формате PEM, используемыми при проверке сертификата проксируемого сервера.
proxy_ssl_name#
|
|
По умолчанию |
|
stream, server |
Позволяет переопределить имя сервера, используемое при проверке сертификата проксируемого сервера, а также для передачи его через SNI при установлении соединения с проксируемым сервером. Имя сервера можно также задать с помощью переменных.
По умолчанию используется имя хоста из адреса, заданного директивой proxy_pass.
proxy_ssl_ntls#
Добавлено в версии 1.2.0.
Включает клиентскую поддержку 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_protocols#
|
|
По умолчанию |
|
stream, server |
Изменено в версии 1.2.0: Параметр TLSv1.3
добавлен к используемым по умолчанию.
Разрешает указанные протоколы для соединений с проксируемым сервером.
proxy_ssl_server_name#
|
|
По умолчанию |
|
stream, server |
Разрешает или запрещает передачу имени сервера, заданного директивой proxy_ssl_name, через расширение Server Name Indication протокола TLS (SNI, RFC 6066) при установлении соединения с проксируемым сервером.
proxy_ssl_session_reuse#
|
|
По умолчанию |
|
stream, server |
Определяет, использовать ли повторно SSL-сессии при работе с проксируемым сервером. Если в логах появляются ошибки "SSL3_GET_FINISHED:digest check failed", то можно попробовать выключить повторное использование сессий.
proxy_ssl_trusted_certificate#
Задает файл с доверенными сертификатами CA в формате PEM, используемыми при проверке сертификата проксируемого HTTPS-сервера.
proxy_ssl_verify#
Разрешает или запрещает проверку сертификата проксируемого сервера.
proxy_ssl_verify_depth#
|
|
По умолчанию |
|
stream, server |
Устанавливает глубину проверки в цепочке сертификатов проксируемого сервера.
proxy_timeout#
Задает таймаут между двумя идущими подряд операциями чтения или записи на клиентском соединении или соединении с проксируемым сервером. Если по истечении этого времени данные не передавались, соединение закрывается.
upstream_probe_timeout (PRO)#
Добавлено в версии 1.4.0: PRO
Задает максимальное время бездействия установленного с сервером соединения для проверок, настроенных с помощью директивы upstream_probe (PRO); при превышении этого предела соединение будет закрыто.
proxy_upload_rate#
Ограничивает скорость чтения данных от клиента. Скорость задается в байтах в секунду.
|
отключает ограничение скорости |
Примечание
Ограничение устанавливается на соединение, поэтому, если клиент одновременно откроет два соединения, суммарная скорость будет вдвое выше заданного ограничения.
В значении параметра можно использовать переменные. Это может быть полезно в случаях, когда скорость нужно ограничивать в зависимости от какого-либо условия:
proxy_upload_rate $rate;
map $slow $rate {
1 4k;
2 8k;
}
proxy_upload_rate $rate;