Módulo Stream#
O módulo stream principal implementa a funcionalidade básica para manipular conexões TCP e UDP: isso inclui definição de blocos de servidor, roteamento de tráfego, configuração de proxy, suporte a SSL/TLS e gerenciamento de conexões para serviços de streaming, como bancos de dados, DNS e outros protocolos que operam sobre TCP e UDP.
Os outros módulos nesta seção estendem essa funcionalidade, permitindo configurar e otimizar de forma flexível o servidor de stream para diversos cenários e requisitos.
Ao compilar a partir do código-fonte,
este módulo não é incluído por padrão;
ele deve ser habilitado com a
Padrão — server Define o endereço e a porta do socket no qual o servidor aceitará conexões. É possível especificar apenas a porta, para que o Angie escute em todas as interfaces IPv4 (e IPv6, se habilitado). O endereço também pode ser um hostname, por exemplo: Endereços IPv6 são especificados entre colchetes: Sockets de domínio UNIX são especificados com o prefixo Intervalos de portas são especificados com a primeira e a última porta separadas por hífen: Nota Servidores diferentes devem escutar em pares únicos de endereço:porta. permite especificar que todas as conexões aceitas nesta porta devem operar em modo SSL. configura um socket de escuta para trabalhar com datagramas. Para lidar com pacotes do mesmo endereço e porta na mesma sessão, o parâmetro reuseport também deve ser especificado. permite especificar que todas as conexões aceitas nesta porta devem usar o protocolo PROXY. A diretiva define a tabela de roteamento associada, FIB (a opção habilita o "TCP Fast Open" para o socket de escuta e limita o comprimento máximo da fila de conexões que ainda não completaram o three-way handshake. Aviso Não habilite este recurso a menos que o servidor consiga lidar com o recebimento do mesmo pacote SYN com dados mais de uma vez. define o parâmetro define o tamanho do buffer de recepção (opção define o tamanho do buffer de envio (opção define o nome do filtro de aceitação (opção instrui a usar instrui a fazer uma chamada define (via opção instrui a criar um socket de escuta individual para cada processo worker (usando a opção Aviso Uso inadequado dessa opção pode ter implicações de segurança. habilita a aceitação de conexões via protocolo Multipath TCP (MPTCP), suportado no kernel Linux a partir da versão 5.6.
Este parâmetro é incompatível com Configura o comportamento de "TCP keepalive" para o socket de escuta. se este parâmetro for omitido, as configurações do sistema operacional terão efeito sobre o socket a opção SO_KEEPALIVE é ativada para o socket a opção SO_KEEPALIVE é desativada para o socket Alguns sistemas operacionais permitem definir parâmetros de TCP keepalive por socket usando as opções Por exemplo, definirá o tempo de inatividade (TCP_KEEPIDLE) em 30 minutos, deixará o intervalo de sondagem (TCP_KEEPINTVL) no valor padrão do sistema e definirá a contagem de sondagens (TCP_KEEPCNT) em 10. Especifica o tamanho do buffer de preread. Especifica um tempo limite da fase de preread. Especifica um tempo limite para leitura do cabeçalho do protocolo PROXY. Se o cabeçalho completo não for transmitido dentro desse tempo, a conexão será fechada. Padrão — stream, server, upstream Configura os servidores de nomes usados para resolver nomes de servidores upstream em endereços, por exemplo: O endereço pode ser especificado como um nome de domínio ou endereço IP, com uma porta opcional. Se a porta não for especificada, a porta 53 será usada. Os servidores de nomes são consultados em esquema round-robin. Por padrão, o Angie armazena respostas em cache usando o valor TTL da resposta. O parâmetro opcional parâmetro opcional que permite sobrescrever a validade da entrada em cache Por padrão, o Angie resolve tanto endereços IPv4 quanto IPv6. desabilita a resolução de endereços IPv4 desabilita a resolução de endereços IPv6 parâmetro opcional;
habilita a coleta de métricas de requisições e respostas de servidores DNS
(/status/resolvers/<zone>)
na zona especificada Dica Para prevenir spoofing de DNS, recomenda-se usar servidores DNS em uma rede local confiável e devidamente protegida. Dica Ao executar em Docker, utilize o endereço DNS interno correspondente, como Define um tempo limite para resolução de nomes, por exemplo: Define a configuração de um servidor. Define os nomes de um servidor virtual. Aviso No módulo Exemplo de configuração: O primeiro nome se torna o nome principal do servidor. Nomes de servidor podem incluir um asterisco ( Esses nomes são chamados de curingas (wildcards). Também é possível usar expressões regulares em nomes de servidor precedendo o nome com um til ( Expressões regulares podem incluir capturas que podem ser usadas em outras diretivas: Capturas nomeadas em expressões regulares criam variáveis
que podem ser usadas em outras diretivas: Se o parâmetro da diretiva for definido como Ao procurar um servidor virtual por nome, se o nome corresponder a mais de uma variante especificada (por exemplo, tanto um curinga quanto uma expressão regular),
a primeira variante correspondente será escolhida na seguinte ordem de prioridade: Nome exato O maior nome curinga começando com asterisco, por exemplo,
O maior nome curinga terminando com asterisco, por exemplo, A primeira expressão regular correspondente (na ordem em que aparece no arquivo de configuração) Padrão stream Define o tamanho do bucket para as tabelas de hash dos nomes de servidor. O valor padrão depende do tamanho da linha de cache do processador. Define o tamanho máximo das tabelas de hash de nomes de servidor. Aloca uma zona de memória compartilhada para coletar métricas para
/status/stream/server_zones/<zone>. Vários contextos A sintaxe de valor único zona agrega todas as métricas do contexto atual
em uma zona de memória compartilhada: A sintaxe alternativa permite especificar os seguintes parâmetros: chave Uma string com variáveis,
cujo valor determina o agrupamento das conexões na zona.
Todas as conexões que produzem valores idênticos após substituição
são agrupadas juntas.
Se a substituição resultar em valor vazio, as métricas não são atualizadas. zona O nome da zona de memória compartilhada. count (opcional) O número máximo de grupos separados para coleta de métricas.
Se novos valores de chave excederem esse limite,
eles serão agrupados sob zona. O valor padrão é 1. No exemplo a seguir,
todas as conexões com o mesmo valor de As métricas resultantes são divididas entre servidores individuais na saída da API. Fornece o contexto do arquivo de configuração no qual as diretivas do servidor stream são especificadas. Habilita ou desabilita o uso da opção TCP_NODELAY. A opção é aplicada tanto às conexões de clientes quanto às conexões para servidores de proxy. Define o tamanho do bucket para a tabela de hash de variáveis. Detalhes sobre a configuração de tabelas de hash estão disponíveis em um documento separado. Define o tamanho máximo da tabela de hash de variáveis. Detalhes sobre a configuração de tabelas de hash estão disponíveis em um documento separado. O módulo stream principal oferece suporte às seguintes variáveis embutidas: versão do Angie endereço do cliente em forma binária, com comprimento sempre de 4 bytes para IPv4 ou 16 bytes para IPv6 número de bytes recebidos de um cliente número de bytes enviados a um cliente número serial da conexão nome do host hora atual em segundos com resolução em milissegundos PID do processo worker protocolo usado para comunicação com o cliente: endereço do cliente a partir do cabeçalho do protocolo PROXY.
O protocolo PROXY deve estar habilitado previamente definindo o parâmetro proxy_protocol na diretiva listen. porta do cliente a partir do cabeçalho do protocolo PROXY.
O protocolo PROXY deve estar habilitado previamente definindo o parâmetro proxy_protocol na diretiva listen. endereço do servidor a partir do cabeçalho do protocolo PROXY.
O protocolo PROXY deve estar habilitado previamente definindo o parâmetro proxy_protocol na diretiva listen. porta do servidor a partir do cabeçalho do protocolo PROXY.
O protocolo PROXY deve estar habilitado previamente definindo o parâmetro proxy_protocol na diretiva listen. TLV obtido do cabeçalho do protocolo PROXY. O nome pode ser um nome de tipo TLV ou seu valor numérico. Neste último caso, o valor é especificado em hexadecimal e deve começar com 0x: TLVs SSL também podem ser acessados tanto pelo nome do tipo quanto por seu valor numérico, ambos devem começar com Os seguintes nomes de tipos TLV são suportados: Os seguintes nomes de tipos TLV SSL são suportados: Também é suportado o seguinte nome de tipo SSL TLV especial: O protocolo PROXY deve estar habilitado previamente definindo o parâmetro proxy_protocol na diretiva listen. endereço do cliente porta do cliente endereço do servidor que aceitou a conexão.
Calcular o valor dessa variável normalmente requer uma chamada de sistema. Para evitar a chamada, as diretivas listen devem especificar endereços e usar o parâmetro porta do servidor que aceitou a conexão duração da sessão em segundos com resolução em milissegundos status da sessão, que pode ser um dos seguintes: sessão concluída com sucesso dados do cliente não puderam ser analisados, por exemplo, o cabeçalho do protocolo PROXY acesso proibido, por exemplo, quando o acesso é limitado para certos endereços de clientes erro interno do servidor bad gateway, por exemplo, se um servidor upstream não pôde ser selecionado ou alcançado serviço indisponível, por exemplo, quando o acesso é limitado pelo número de conexões hora local no formato padrão ISO 8601 hora local no formato Common Log Format--with-stream
opção de compilação.
Nos pacotes e imagens dos nossos repositórios,
o módulo já está incluído na compilação.Exemplo de Configuração#
worker_processes auto;
error_log /var/log/angie/error.log info;
events {
worker_connections 1024;
}
stream {
upstream backend {
hash $remote_addr consistent;
server backend1.example.com:12345 weight=5;
server 127.0.0.1:12345 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
}
upstream dns {
server 192.168.0.1:53535;
server dns.example.com:53;
}
server {
listen 12345;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass backend;
}
server {
listen 127.0.0.1:53 udp reuseport;
proxy_timeout 20s;
proxy_pass dns;
}
server {
listen [::1]:12345;
proxy_pass unix:/tmp/stream.socket;
}
}
Diretivas#
listen#
listen
endereço[:porta] [ssl
] [udp
] [proxy_protocol
] [setfib=
número] [fastopen=
número] [backlog=
número] [rcvbuf=
tamanho] [sndbuf=
tamanho] [accept_filter=
filtro] [deferred
] [bind
] [ipv6only=
on
| off
] [reuseport
] [so_keepalive=
on|off|[keepidle
]:[samp:keepintvl]:[samp:keepcnt]];listen 127.0.0.1:12345;
listen *:12345;
listen 12345; # equivalente a *:12345
listen localhost:12345;
listen [::1]:12345;
listen [::]:12345;
unix:
:listen unix:/var/run/angie.sock;
listen 127.0.0.1:12345-12399;
listen 12345-12399;
ssl
udp
proxy_protocol
listen
pode ter vários parâmetros adicionais específicos para chamadas de sistema relacionadas a sockets.setfib=
númeroSO_SETFIB
) para o socket de escuta. Atualmente funciona apenas no FreeBSD.fastopen=
númerobacklog=
númerobacklog
na chamada listen()
, que limita o comprimento máximo da fila de conexões pendentes. Por padrão, backlog
é definido como -1
no FreeBSD, DragonFly BSD e macOS, e como 511 em outras plataformas.rcvbuf=
tamanhoSO_RCVBUF
) para o socket de escuta.sndbuf=
tamanhoSO_SNDBUF
) para o socket de escuta.accept_filter=
filtroSO_ACCEPTFILTER
) para o socket de escuta, que filtra conexões recebidas antes de passá-las para accept()
. Funciona apenas em FreeBSD e NetBSD 5.0+. Valores aceitáveis: dataready
e httpready
.deferred
accept()
diferido (opção TCP_DEFER_ACCEPT
) no Linux.bind
bind()
separada para um par endereço:porta específico. Se houver várias diretivas listen com a mesma porta mas endereços diferentes, e uma delas escutar em todos os endereços para a porta dada (*:porta), o Angie fará bind()
apenas em *:porta. Nesse caso, será feita a chamada getsockname()
para determinar o endereço que aceitou a conexão. Se os parâmetros setfib
, fastopen
, backlog
, rcvbuf
, sndbuf
, accept_filter
, deferred
, ipv6only
, reuseport
ou so_keepalive
forem usados, sempre será feita uma chamada bind()
separada para o par endereço:porta.ipv6only=on
| off
IPV6_V6ONLY
) se um socket IPv6 escutando em [::] aceitará apenas conexões IPv6 ou tanto IPv6 quanto IPv4. Esse parâmetro é ativado por padrão. Só pode ser definido na inicialização.reuseport
SO_REUSEPORT
no Linux 3.9+ e DragonFly BSD, ou SO_REUSEPORT_LB
no FreeBSD 12+), permitindo ao kernel distribuir conexões recebidas entre os processos. Funciona apenas em Linux 3.9+, DragonFly BSD e FreeBSD 12+.multipath
udp
.so_keepalive=on
| off
| [keepidle
]:[samp:keepintvl]:[samp:keepcnt]''
on
off
TCP_KEEPIDLE
, TCP_KEEPINTVL
e TCP_KEEPCNT
. Nesses sistemas (atualmente, Linux 2.4+, NetBSD 5+ e FreeBSD 9.0-STABLE), eles podem ser configurados usando os parâmetros keepidle, keepintvl e keepcnt. Um ou dois parâmetros podem ser omitidos, caso em que será usado o valor padrão do sistema para a opção correspondente.so_keepalive=30m::10
preread_buffer_size#
preread_timeout#
proxy_protocol_timeout#
resolver#
resolver
endereço ... [valid=
tempo] [ipv4=
on
| off
] [ipv6=
on
| off
] [status_zone=
zona];resolver 127.0.0.53 [::1]:5353;
valid
permite sobrescrevê-lo:valid
resolver 127.0.0.53 [::1]:5353 valid=30s;
ipv4=off
ipv6=off
status_zone
127.0.0.11
.resolver_timeout#
resolver_timeout 5s;
server#
server_name#
stream
, a diretiva server_name
é baseada em Server Name
Indication (SNI) e funciona apenas com conexões TLS. Para usá-la,
é necessário configurar terminação TLS ou habilitar TLS
preread no bloco server
correspondente.server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/angie/cert.pem;
ssl_certificate_key /etc/angie/key.pem;
}
*
)
para substituir a primeira ou a última parte de um nome:server {
server_name example.com *.example.com www.example.*;
}
~
):server {
server_name www.example.com ~^www\d+\.example\.com$;
}
server {
server_name ~^(www\.)?(.+)$;
proxy_pass www.$2:12345;
}
server {
server_name ~^(www\.)?(?<domain>.+)$;
proxy_pass www.$domain:12345;
}
$hostname
, o hostname da máquina será inserido.*.example.com
mail.*
server_names_hash_bucket_size#
server_names_hash_bucket_size
tamanho;server_names_hash_bucket_size 32|64|128;
server_names_hash_max_size#
status_zone#
server
podem compartilhar a mesma zona para coleta de dados.server {
listen 80;
server_name *.example.com;
status_zone single;
# ...
}
$server_addr
são agrupadas em host_zone
.
As métricas são coletadas separadamente para cada $server_addr
único
até que o número de grupos de métricas alcance 10.
Após isso, quaisquer novos valores de $server_addr
serão adicionados ao grupo server_zone
:stream {
upstream backend {
server 192.168.0.1:3306;
server 192.168.0.2:3306;
# ...
}
server {
listen 3306;
proxy_pass backend;
status_zone $server_addr zone=server_zone:10;
}
}
stream#
tcp_nodelay#
variables_hash_bucket_size#
variables_hash_max_size#
Variáveis Embutidas#
$angie_version
#$binary_remote_addr
#$bytes_received
#$bytes_sent
#$connection
#$hostname
#$msec
#$pid
#$protocol
#TCP
ou UDP
$proxy_protocol_addr
#$proxy_protocol_port
#$proxy_protocol_server_addr
#$proxy_protocol_server_port
#$proxy_protocol_tlv_<nome>
#$proxy_protocol_tlv_alpn
$proxy_protocol_tlv_0x01
ssl_
:$proxy_protocol_tlv_ssl_version
$proxy_protocol_tlv_ssl_0x21
alpn (0x01)
- protocolo de camada superior usado sobre a conexãoauthority (0x02)
- valor do nome do host passado pelo clienteunique_id (0x05)
- identificador único da conexãonetns (0x30)
- nome do namespacessl (0x20)
- estrutura SSL TLV em formato bináriossl_version (0x21)
- versão SSL usada na conexão do clientessl_cn (0x22)
- Common Name do certificadossl_cipher (0x23)
- nome da cifra utilizadassl_sig_alg (0x24)
- algoritmo usado para assinar o certificadossl_key_alg (0x25)
- algoritmo da chave públicassl_verify
- resultado da verificação do certificado do cliente: 0 se o cliente apresentou um certificado e este foi verificado com sucesso, ou diferente de zero caso contrário$remote_addr
#$remote_port
#$server_addr
#bind
.$server_port
#$session_time
#$status
#200
400
403
500
502
503
$time_iso8601
#$time_local
#