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) disponíveis. 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 ser concluída. 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. Nota O valor da diretiva é herdado por blocos aninhados
e pode ser sobrescrito neles, se necessário.
Dentro de um único bloco, a diretiva só pode ser especificada uma vez.
Se for repetida, a última definição terá efeito. Por padrão, o Angie armazena respostas em cache usando o valor TTL da resposta. Se
a diretiva parâmetro opcional que permite sobrescrever a validade do cache de resposta Por padrão, o Angie procura tanto endereços IPv4 quanto IPv6 durante a resolução. desabilita a busca de endereços IPv4 desabilita a busca 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. 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. contagem (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 é habilitada tanto para conexões de clientes quanto para conexões com 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 endereços IPv4 ou 16 bytes para IPv6 número de bytes recebidos do cliente número de bytes enviados ao cliente número serial da conexão nome do host tempo atual em segundos com resolução de 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 name 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 TLV 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 de sistema, 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]:[keepintvl]:[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;
ssludpproxy_protocollisten 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.deferredaccept() diferido (opção TCP_DEFER_ACCEPT) no Linux.bindbind() 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 | offIPV6_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.reuseportSO_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+.multipathudp.so_keepalive=on | off | [keepidle]:[keepintvl]:[keepcnt]''onoffTCP_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;
resolver não for especificada e nenhuma consulta DNS dinâmica for realizada
(por exemplo, ao usar nomes fixos em Proxy sem
variáveis), especificar um resolver não é necessário: os nomes serão resolvidos na inicialização
usando o resolver do sistema. O parâmetro opcional valid permite
sobrescrever isso:validresolver 127.0.0.53 [::1]:5353 valid=30s;
ipv4=offipv6=offstatus_zone127.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.commail.*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_<name>#$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#200400403500502503$time_iso8601#$time_local#