Tunnel#

Adicionado na versão 1.12.0.

O módulo Tunnel (ngx_http_tunnel_module) trata requisições CONNECT do HTTP/1.1 e estabelece uma conexão virtual de ponta a ponta entre o cliente e um servidor backend, permitindo que o Angie atue como um proxy de encaminhamento.

O acesso ao túnel é controlado pelas diretivas de acesso padrão: auth_basic, satisfy e auth_delay.

Exemplo de Configuração#

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;
    }
}

Diretivas#

tunnel_bind#

Sintaxe

tunnel_bind address [transparent] | off;

Padrão

Contexto

http, server, location

Faz com que as conexões de saída para um servidor backend se originem do endereço IP local especificado, com uma porta opcional. O valor do parâmetro pode conter variáveis. O valor especial off cancela o efeito da diretiva tunnel_bind herdada do nível de configuração anterior, o que permite que o sistema atribua automaticamente o endereço IP local e a porta.

O parâmetro transparent permite que as conexões de saída para um servidor backend se originem de um endereço IP não local, por exemplo, de um endereço IP real de um cliente:

tunnel_bind $remote_addr transparent;

Para que esse parâmetro funcione, geralmente é necessário executar os processos worker do Angie com privilégios de superusuário. No Linux isso não é necessário, pois, se o parâmetro transparent for especificado, os processos worker herdam a capacidade CAP_NET_RAW do processo mestre.

tunnel_buffer_size#

Sintaxe

tunnel_buffer_size size;

Padrão

tunnel_buffer_size 4k|8k;

Contexto

http, server, location

Define o size do buffer usado para ler dados do servidor backend. Também define o size do buffer usado para ler dados do cliente.

tunnel_connect_timeout#

Sintaxe

tunnel_connect_timeout time;

Padrão

tunnel_connect_timeout 60s;

Contexto

http, server, location

Define um tempo de espera para o estabelecimento de uma conexão com um servidor backend. Deve-se observar que esse tempo de espera geralmente não pode exceder 75 segundos.

tunnel_next_upstream#

Sintaxe

tunnel_next_upstream error | timeout | off ...;

Padrão

tunnel_next_upstream error timeout;

Contexto

http, server, location

Especifica em quais casos uma requisição deve ser passada para o próximo servidor:

error

ocorreu um erro ao estabelecer uma conexão com o servidor ou ao ler dados dele;

timeout

ocorreu um timeout ao estabelecer uma conexão com o servidor, ao passar uma requisição para ele ou ao ler dados dele;

off

desabilita a passagem de uma requisição para o próximo servidor.

Passar uma requisição para o próximo servidor só é possível se nada tiver sido enviado a um cliente ainda. Se ocorrer um erro ou timeout no meio da transferência de uma resposta, corrigir isso é impossível.

A diretiva também define o que é considerado uma tentativa mal-sucedida de comunicação com um servidor. Os casos de error e timeout são sempre considerados tentativas mal-sucedidas, mesmo que não sejam especificados na diretiva.

A passagem de uma requisição para o próximo servidor pode ser limitada pelo número de tentativas e pelo tempo.

tunnel_next_upstream_timeout#

Sintaxe

tunnel_next_upstream_timeout time;

Padrão

tunnel_next_upstream_timeout 0;

Contexto

http, server, location

Limita o tempo durante o qual uma requisição pode ser passada para o próximo servidor. O valor 0 desativa essa limitação.

tunnel_next_upstream_tries#

Sintaxe

tunnel_next_upstream_tries number;

Padrão

tunnel_next_upstream_tries 0;

Contexto

http, server, location

Limita o número de tentativas possíveis para passar uma requisição para o próximo servidor. O valor 0 desativa essa limitação.

tunnel_pass#

Sintaxe

tunnel_pass [address];

Padrão

Contexto

server, location, if in location

Habilita o tratamento de requisições CONNECT e define o endereço de um servidor backend. Por padrão, o address é $host:$request_port e é obtido da requisição do cliente. Na maioria dos casos, tunnel_pass não requer a configuração de nenhum argumento.

O endereço pode ser especificado como um nome de domínio ou endereço IP, e uma porta:

tunnel_pass localhost:9000;

ou como um caminho de socket de domínio UNIX:

tunnel_pass unix:/tmp/backend.socket;

Se um nome de domínio for resolvido em vários endereços, todos eles serão usados no modo round-robin. Além disso, um endereço pode ser especificado como um grupo de servidores.

O valor do parâmetro pode conter variáveis. Nesse caso, se um endereço for especificado como um nome de domínio, o nome é procurado entre os grupos de servidores descritos e, se não for encontrado, é determinado usando um resolver.

tunnel_read_timeout#

Sintaxe

tunnel_read_timeout time;

Padrão

tunnel_read_timeout 60s;

Contexto

http, server, location

Define o tempo de espera entre duas operações sucessivas de leitura ou escrita nas conexões do cliente ou do servidor backend. Se nenhum dado for transmitido dentro desse tempo, a conexão é fechada.

tunnel_send_lowat#

Sintaxe

tunnel_send_lowat size;

Padrão

tunnel_send_lowat 0;

Contexto

http, server, location

Se a diretiva for definida com um valor diferente de zero, o Angie tentará minimizar o número de operações de envio nas conexões de saída para um servidor backend usando a flag NOTE_LOWAT do método kqueue, ou a opção de socket SO_SNDLOWAT, com o size especificado.

Essa diretiva é ignorada no Linux, Solaris e Windows.

tunnel_send_timeout#

Sintaxe

tunnel_send_timeout time;

Padrão

tunnel_send_timeout 60s;

Contexto

http, server, location

Define um tempo de espera para a transmissão de dados ao servidor backend. O tempo de espera é definido apenas entre duas operações de escrita sucessivas, não para toda a transmissão. Se o servidor backend não receber nada dentro desse tempo, a conexão é fechada.

tunnel_socket_keepalive#

Sintaxe

tunnel_socket_keepalive on | off;

Padrão

tunnel_socket_keepalive off;

Contexto

http, server, location

Configura o comportamento de "TCP keepalive" para as conexões de saída para um servidor backend. Por padrão, as configurações do sistema operacional estão em vigor para o socket. Se a diretiva for definida com o valor on, a opção de socket SO_KEEPALIVE é ativada para o socket.