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 размер;

По умолчанию

tunnel_buffer_size 4k|8k;

Контекст

http, server, location

Задаёт размер буфера, используемого для чтения данных от проксируемого сервера. Также задаёт размер буфера, используемого для чтения данных от клиента. По умолчанию размер буфера равен размеру страницы памяти. В зависимости от платформы это или 4K, или 8K.

tunnel_connect_timeout#

Синтаксис

tunnel_connect_timeout время;

По умолчанию

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 время;

По умолчанию

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 время;

По умолчанию

tunnel_read_timeout 60s;

Контекст

http, server, location

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

tunnel_send_lowat#

Синтаксис

tunnel_send_lowat размер;

По умолчанию

tunnel_send_lowat 0;

Контекст

http, server, location

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

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

tunnel_send_timeout#

Синтаксис

tunnel_send_timeout время;

По умолчанию

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.