Модуль ngx_http_tunnel_module

Пример конфигурации
Директивы
     tunnel_allow_upstream
     tunnel_bind
     tunnel_bind_dynamic
     tunnel_buffer_size
     tunnel_connect_timeout
     tunnel_next_upstream
     tunnel_next_upstream_timeout
     tunnel_next_upstream_tries
     tunnel_pass
     tunnel_read_timeout
     tunnel_send_lowat
     tunnel_send_timeout
     tunnel_socket_keepalive

Модуль 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 адрес | off;
Умолчание:
Контекст: http, server, location

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

Синтаксис: tunnel_bind_dynamic on | off;
Умолчание:
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 error | timeout | denied | off ...;
Умолчание:
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 on | off;
Умолчание:
tunnel_socket_keepalive off;
Контекст: http, server, location

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