Tunnel#

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

Модуль Tunnel (ngx_http_tunnel_module) обрабатывает запросы HTTP/1.1 CONNECT и устанавливает сквозное виртуальное соединение между клиентом и проксируемым сервером, позволяя Angie выступать в роли перенаправляющего прокси.

Доступ к туннелю управляется стандартными директивами разграничения доступа: auth_basic, satisfy и auth_delay.

Пример конфигурации#

http {

    map $host $allow_host {
        hostnames;

        example.org    1;
        *.example.org  1;
    }

    server {
        listen 8000;

        resolver 127.0.0.53;

        if ($allow_host != 1) {
            return 502;
        }

        tunnel_pass;
    }
}

Директивы#

tunnel_bind#

Синтаксис

tunnel_bind address [transparent] | off;

По умолчанию

Контекст

http, server, location

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

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

tunnel_bind $remote_addr transparent;

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

tunnel_buffer_size#

Синтаксис

tunnel_buffer_size size;

По умолчанию

tunnel_buffer_size 4k|8k;

Контекст

http, server, location

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

tunnel_connect_timeout#

Синтаксис

tunnel_connect_timeout time;

По умолчанию

tunnel_connect_timeout 60s;

Контекст

http, server, location

Задаёт тайм-аут для установления соединения с проксируемым сервером. Следует учитывать, что этот тайм-аут обычно не может превышать 75 секунд.

tunnel_next_upstream#

Синтаксис

tunnel_next_upstream error | timeout | off ...;

По умолчанию

tunnel_next_upstream error timeout;

Контекст

http, server, location

Определяет, в каких случаях запрос будет передан следующему серверу:

error

произошла ошибка соединения с сервером или чтения данных от него;

timeout

произошёл тайм-аут во время установления соединения с сервером, передачи ему запроса или чтения данных от него;

off

запрещает передачу запроса следующему серверу.

Передача запроса следующему серверу возможна только при условии, что клиенту ещё ничего не передавалось. Если ошибка или тайм-аут происходят в середине передачи ответа, исправить это невозможно.

Директива также определяет, что считается неудачной попыткой работы с сервером. Случаи error и timeout всегда считаются неудачными попытками, даже если они не указаны в директиве.

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

tunnel_next_upstream_timeout#

Синтаксис

tunnel_next_upstream_timeout time;

По умолчанию

tunnel_next_upstream_timeout 0;

Контекст

http, server, location

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

tunnel_next_upstream_tries#

Синтаксис

tunnel_next_upstream_tries number;

По умолчанию

tunnel_next_upstream_tries 0;

Контекст

http, server, location

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

tunnel_pass#

Синтаксис

tunnel_pass [address];

По умолчанию

Контекст

server, location, if в location

Включает обработку запросов CONNECT и задаёт адрес проксируемого сервера. По умолчанию адрес равен $host:$request_port и берётся из запроса клиента. В большинстве случаев для tunnel_pass не требуется указывать аргументы.

Адрес может быть задан доменным именем или IP-адресом и портом:

tunnel_pass localhost:9000;

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

tunnel_pass unix:/tmp/backend.socket;

Если доменному имени соответствует несколько адресов, все они будут использоваться по круговому принципу. Кроме того, адрес может быть задан как группа серверов.

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

tunnel_read_timeout#

Синтаксис

tunnel_read_timeout time;

По умолчанию

tunnel_read_timeout 60s;

Контекст

http, server, location

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

tunnel_send_lowat#

Синтаксис

tunnel_send_lowat size;

По умолчанию

tunnel_send_lowat 0;

Контекст

http, server, location

Если директиве задано ненулевое значение, Angie будет пытаться уменьшить число операций отправки на исходящих соединениях с проксируемым сервером, используя либо флаг NOTE_LOWAT метода kqueue, либо параметр сокета SO_SNDLOWAT с указанным размером.

Эта директива игнорируется на Linux, Solaris и Windows.

tunnel_send_timeout#

Синтаксис

tunnel_send_timeout time;

По умолчанию

tunnel_send_timeout 60s;

Контекст

http, server, location

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

tunnel_socket_keepalive#

Синтаксис

tunnel_socket_keepalive on | off;

По умолчанию

tunnel_socket_keepalive off;

Контекст

http, server, location

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