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#
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#
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#
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#
| |
Padrão |
|
http, server, location |
Especifica em quais casos uma requisição deve ser passada para o próximo servidor:
| ocorreu um erro ao estabelecer uma conexão com o servidor ou ao ler dados dele; |
| ocorreu um timeout ao estabelecer uma conexão com o servidor, ao passar uma requisição para ele ou ao ler dados dele; |
| 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#
| |
Padrão |
|
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#
| |
Padrão |
|
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#
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#
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#
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#
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#
| |
Padrão |
|
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.