Модуль ngx_http_tunnel_module
Модуль ngx_http_tunnel_module (1.31.0) выполняет
обработку запросов HTTP/1.1
CONNECT
для установки сквозного виртуального соединения с другим сервером.
Пример конфигурации
http {
map $request_port $allow_port {
443 1;
}
map $host $allow_host {
hostnames;
example.org 1;
*.example.org 1;
}
server {
listen 8000;
resolver dns.example.com;
if ($allow_port != 1) {
return 502;
}
if ($allow_host != 1) {
return 502;
}
tunnel_pass;
}
}
Директивы
| Синтаксис: |
tunnel_allow_upstream |
|---|---|
| Умолчание: | — |
| Контекст: |
http, server, location |
Задаёт условия, при которых доступ к проксируемому серверу будет разрешён или запрещён. Если все значения строковых параметров непустые и не равны “0”, то доступ разрешён. Условия проверяются каждый раз перед установлением соединения с проксируемым сервером. В значении параметров допустимо использование переменных:
geo $upstream_last_addr $allow {
volatile;
10.10.0.0/24 1;
}
server {
listen 127.0.0.1:8080;
tunnel_pass;
tunnel_allow_upstream $allow;
}
Директива доступна как часть коммерческой подписки.
| Синтаксис: |
tunnel_bind
|
|---|---|
| Умолчание: | — |
| Контекст: |
http, server, location |
Задаёт локальный IP-адрес с необязательным портом,
который будет использоваться в исходящих соединениях с проксируемым сервером.
В значении параметра допустимо использование переменных.
Специальное значение off отменяет действие
унаследованной с предыдущего уровня конфигурации
директивы tunnel_bind, позволяя системе
самостоятельно выбирать локальный IP-адрес и порт.
| Синтаксис: |
tunnel_bind_dynamic |
|---|---|
| Умолчание: |
tunnel_bind_dynamic off; |
| Контекст: |
http, server, location |
Если включено, операция bind осуществляется при каждой попытке соединения.
geo $upstream_last_addr $bind_addr {
volatile;
10.0.0.0/24 10.0.0.1;
192.168.0.0/24 192.168.0.1;
}
tunnel_bind $bind_addr;
tunnel_bind_dynamic on;
Директива доступна как часть коммерческой подписки.
| Синтаксис: |
tunnel_buffer_size |
|---|---|
| Умолчание: |
tunnel_buffer_size 4k|8k; |
| Контекст: |
http, server, location |
Задаёт размер буфера, в который будут читаться данные,
получаемые от проксируемого сервера.
Также задаёт размер буфера, в который будут читаться данные,
получаемые от клиента.
| Синтаксис: |
tunnel_connect_timeout |
|---|---|
| Умолчание: |
tunnel_connect_timeout 60s; |
| Контекст: |
http, server, location |
Задаёт таймаут для установления соединения с проксированным сервером. Необходимо иметь в виду, что этот таймаут обычно не может превышать 75 секунд.
| Синтаксис: |
tunnel_next_upstream
|
|---|---|
| Умолчание: |
tunnel_next_upstream error timeout; |
| Контекст: |
http, server, location |
Определяет, в каких случаях запрос будет передан следующему серверу:
error- произошла ошибка соединения с сервером или чтения данных от сервера;
timeout- произошёл таймаут во время соединения с сервером, передачи ему запроса или чтения заголовка ответа сервера;
denied- сервер отклонил
соединение;
Параметр доступен как часть коммерческой подписки.
off- запрещает передачу запроса следующему серверу.
Необходимо понимать, что передача запроса следующему серверу возможна только при условии, что клиенту ещё ничего не передавалось. То есть, если ошибка или таймаут возникли в середине передачи ответа клиенту, то исправить это уже невозможно.
Директива также определяет, что считается
неудачной
попыткой работы с сервером.
Случаи error, timeout и
denied
всегда считаются неудачными попытками, даже если они не указаны в директиве.
Передача запроса следующему серверу может быть ограничена по количеству попыток и по времени.
| Синтаксис: |
tunnel_next_upstream_timeout |
|---|---|
| Умолчание: |
tunnel_next_upstream_timeout 0; |
| Контекст: |
http, server, location |
Ограничивает время, в течение которого возможна передача запроса
следующему серверу.
Значение 0 отключает это ограничение.
| Синтаксис: |
tunnel_next_upstream_tries |
|---|---|
| Умолчание: |
tunnel_next_upstream_tries 0; |
| Контекст: |
http, server, location |
Ограничивает число допустимых попыток для передачи запроса
следующему серверу.
Значение 0 отключает это ограничение.
| Синтаксис: |
tunnel_pass [ |
|---|---|
| Умолчание: | — |
| Контекст: |
server, location, if в location |
Разрешает обработку запросов CONNECT и задаёт адрес проксируемого сервера.
По умолчанию в качестве адрес'а используется
$host:$request_port со значениями из запроса клиента.
В большинстве случаев указывать параметры для tunnel_pass
не требуется.
Адрес может быть указан в виде доменного имени или IP-адреса, и порта:
tunnel_pass localhost:9000;
или в виде пути UNIX-сокета:
tunnel_pass unix:/tmp/backend.socket;
Если доменному имени соответствует несколько адресов, то все они будут использоваться по очереди (round-robin). Кроме того, в качестве адреса можно указать группу серверов.
В значении параметра можно использовать переменные. В этом случае, если адрес указан в виде доменного имени, имя ищется среди описанных групп серверов и если не найдено, то определяется с помощью resolver’а.
| Синтаксис: |
tunnel_read_timeout |
|---|---|
| Умолчание: |
tunnel_read_timeout 60s; |
| Контекст: |
http, server, location |
Задаёт таймаут между двумя идущими подряд операциями чтения или записи на клиентском соединении или соединении с проксируемым сервером. Если по истечении этого времени данные не передавались, соединение закрывается.
| Синтаксис: |
tunnel_send_lowat |
|---|---|
| Умолчание: |
tunnel_send_lowat 0; |
| Контекст: |
http, server, location |
При установке директивы в ненулевое значение nginx будет пытаться минимизировать
число операций отправки на исходящих соединениях с проксируемым сервером либо
при помощи флага NOTE_LOWAT метода
kqueue,
либо при помощи параметра сокета SO_SNDLOWAT,
с указанным размером.
Эта директива игнорируется на Linux, Solaris и Windows.
| Синтаксис: |
tunnel_send_timeout |
|---|---|
| Умолчание: |
tunnel_send_timeout 60s; |
| Контекст: |
http, server, location |
Задаёт таймаут при передаче запроса проксированному серверу. Таймаут устанавливается не на всю передачу запроса, а только между двумя операциями записи. Если по истечении этого времени проксируемый сервер не примет новых данных, соединение закрывается.
| Синтаксис: |
tunnel_socket_keepalive |
|---|---|
| Умолчание: |
tunnel_socket_keepalive off; |
| Контекст: |
http, server, location |
Конфигурирует поведение “TCP keepalive”
для исходящих соединений к проксируемому серверу.
По умолчанию для сокета действуют настройки операционной системы.
Если указано значение “on”, то
для сокета включается параметр SO_KEEPALIVE.