Módulo Stream#
El módulo principal de stream implementa la funcionalidad básica para gestionar conexiones TCP y UDP: esto incluye definir bloques de servidor, enrutamiento de tráfico, configuración de proxy, soporte SSL/TLS y gestión de conexiones para servicios de streaming, como bases de datos, DNS y otros protocolos que operan sobre TCP y UDP.
Los demás módulos de esta sección amplían esta funcionalidad, permitiendo configurar y optimizar de forma flexible el servidor stream para diversos escenarios y requisitos.
Al compilar desde el código fuente,
este módulo no se construye por defecto;
debe habilitarse con la opción de compilación
Predeterminado — server Define la address y el port del socket en el que el servidor aceptará conexiones.
Es posible especificar solo el port, de modo que Angie escuche en todas las interfaces IPv4
(y también IPv6, si está habilitado). La dirección también puede ser un nombre de host,
por ejemplo: Las direcciones IPv6 se especifican entre corchetes: Los sockets de dominio UNIX se especifican con el prefijo Los rangos de puertos se indican con el primer y último puerto separados por un guion: Nota Los distintos servidores deben escuchar en pares address:port diferentes. permite especificar que todas las conexiones aceptadas en este puerto funcionen en modo SSL. configura un socket de escucha para trabajar con datagramas. Para gestionar paquetes del mismo origen y puerto en la misma sesión, también debe especificarse el parámetro reuseport. permite especificar que todas las conexiones aceptadas en este puerto utilicen el protocolo PROXY. La directiva establece la tabla de enrutamiento asociada, FIB (la opción habilita "TCP Fast Open" para el socket de escucha y limita la longitud máxima de la cola de conexiones que aún no han completado el three-way handshake. Advertencia No habilite esta función a menos que el servidor pueda gestionar la recepción del mismo paquete SYN con datos más de una vez. establece el parámetro establece el tamaño del buffer de recepción (opción establece el tamaño del buffer de envío (opción establece el nombre del filtro de aceptación (opción indica usar un indica realizar una llamada este parámetro determina (mediante la opción de socket indica crear un socket de escucha individual para cada proceso worker (usando la opción de socket Advertencia El uso inapropiado de esta opción puede tener implicaciones de seguridad. habilita la aceptación de conexiones mediante el protocolo Multipath TCP (MPTCP), soportado en el kernel de Linux desde la versión 5.6. Este parámetro es incompatible con Configura el comportamiento de "TCP keepalive" para el socket de escucha. si se omite este parámetro, se aplicarán los valores por defecto del sistema operativo para el socket activa la opción SO_KEEPALIVE para el socket desactiva la opción SO_KEEPALIVE para el socket Algunos sistemas operativos permiten establecer parámetros de TCP keepalive por socket
usando las opciones de socket Por ejemplo, establecerá el tiempo de inactividad (TCP_KEEPIDLE) en 30 minutos,
mantendrá el intervalo de sondeo (TCP_KEEPINTVL) en el valor por defecto del sistema,
y fijará el número de sondeos (TCP_KEEPCNT) en 10. Especifica el tamaño del buffer de preread. Especifica un timeout para la fase de preread. Predeterminado stream, server Especifica un timeout para completar la lectura de la cabecera del protocolo PROXY.
Si no se transmite la cabecera completa en este tiempo, la conexión se cierra. Predeterminado — stream, server, upstream Configura los servidores de nombres utilizados para resolver direcciones de upstream servers, por ejemplo: La dirección puede especificarse como un nombre de dominio o una dirección IP, con un puerto opcional.
Si no se especifica puerto, se usa el 53. Los servidores de nombres se consultan en orden round-robin. Por defecto, Angie almacena en caché las respuestas usando el valor TTL de la respuesta.
El parámetro opcional parámetro opcional que permite sobrescribir la validez de la entrada en caché Por defecto, Angie buscará direcciones tanto IPv4 como IPv6. desactiva la búsqueda de direcciones IPv4 desactiva la búsqueda de direcciones IPv6 parámetro opcional;
habilita la recopilación de métricas de solicitudes y respuestas de los servidores DNS
(/status/resolvers/<zone>)
en la zona especificada Truco Para prevenir ataques de DNS spoofing, se recomienda usar servidores DNS en una red local de confianza adecuadamente asegurada. Truco Cuando se ejecute en Docker, use la dirección del servidor DNS interno correspondiente como Define un timeout para la resolución de nombres, por ejemplo: Define la configuración de un servidor. Define los nombres de un servidor virtual. Advertencia En el módulo Ejemplo de configuración: El primer nombre se convierte en el nombre principal del servidor. Los nombres de servidor pueden incluir un asterisco ( Estos nombres se denominan wildcard names. También se pueden usar expresiones regulares en nombres de servidor
anteponiendo el nombre con una tilde ( Las expresiones regulares pueden incluir captures que se pueden usar en otras directivas: Las named captures en expresiones regulares crean variables
que pueden usarse en otras directivas: Si el parámetro de la directiva se establece en Al buscar un servidor virtual por nombre, si el nombre coincide con más de una
de las variantes especificadas (p. ej., tanto un wildcard name como una expresión regular),
se elegirá la primera variante coincidente en el siguiente orden de prioridad: El nombre exacto El nombre comodín más largo que empieza con un asterisco, p. ej. El nombre comodín más largo que termina con un asterisco, p. ej. La primera expresión regular coincidente (en orden de aparición en el archivo de configuración) Predeterminado stream Define el tamaño del bucket para las tablas hash de nombres de servidor.
El valor por defecto depende del tamaño de la línea de caché del procesador. Define el tamaño máximo de las tablas hash de nombres de servidor. Asigna una zona de memoria compartida para recopilar métricas de
/status/stream/server_zones/<zone>. Varios contextos La sintaxis de valor único zone agrega todas las métricas del contexto actual
en una sola zona de memoria compartida: La sintaxis alternativa permite especificar los siguientes parámetros: key Una cadena con variables,
cuyo valor determina la agrupación de conexiones en la zona.
Todas las conexiones que produzcan valores idénticos tras la sustitución
se agrupan juntas.
Si la sustitución produce un valor vacío, las métricas no se actualizan. zone El nombre de la zona de memoria compartida. count (opcional) El número máximo de grupos separados para recopilar métricas.
Si los nuevos valores de key superan este límite,
se agrupan bajo zone. El valor por defecto es 1. En el siguiente ejemplo,
todas las conexiones con el mismo valor Las métricas resultantes se dividen entre servidores individuales en la salida de la API. Proporciona el contexto de archivo de configuración en el que se especifican las directivas del servidor stream. Habilita o deshabilita el uso de la opción TCP_NODELAY.
La opción se habilita tanto para las conexiones de cliente como para las conexiones a servidores proxied. Define el tamaño de bucket para la tabla hash de variables.
Los detalles de la configuración de tablas hash se proporcionan en un documento separado. Define el tamaño máximo de la tabla hash de variables.
Los detalles de la configuración de tablas hash se proporcionan en un documento separado. El módulo core stream admite las siguientes variables integradas: Versión de Angie Dirección del cliente en forma binaria, la longitud del valor es siempre de 4 bytes para direcciones IPv4 o 16 bytes para direcciones IPv6 Número de bytes recibidos desde un cliente Número de bytes enviados a un cliente Número de serie de la conexión Nombre del host Hora actual en segundos con resolución en milisegundos PID del proceso worker Protocolo utilizado para comunicarse con el cliente: Dirección del cliente desde la cabecera PROXY protocol.
El PROXY protocol debe estar habilitado previamente configurando el parámetro proxy_protocol en la directiva listen. Puerto del cliente desde la cabecera PROXY protocol.
El PROXY protocol debe estar habilitado previamente configurando el parámetro proxy_protocol en la directiva listen. Dirección del servidor desde la cabecera PROXY protocol.
El PROXY protocol debe estar habilitado previamente configurando el parámetro proxy_protocol en la directiva listen. Puerto del servidor desde la cabecera PROXY protocol.
El PROXY protocol debe estar habilitado previamente configurando el parámetro proxy_protocol en la directiva listen. TLV obtenido de la cabecera PROXY protocol. El name puede ser un nombre de tipo TLV o su valor numérico. En este último caso, el valor se especifica en hexadecimal y debe comenzar con 0x: Los TLVs de SSL también pueden accederse tanto por nombre de tipo TLV como por valor numérico, ambos deben comenzar con Los siguientes nombres de tipo TLV son compatibles: Los siguientes nombres de tipo TLV SSL son compatibles: También se admite el siguiente nombre de tipo TLV SSL especial: El PROXY protocol debe estar habilitado previamente configurando el parámetro proxy_protocol en la directiva listen. Dirección del cliente Puerto del cliente Dirección del servidor que aceptó la conexión.
Calcular el valor de esta variable normalmente requiere una llamada al sistema. Para evitar esta llamada, las directivas listen deben especificar direcciones y usar el parámetro Puerto del servidor que aceptó la conexión Duración de la sesión en segundos con resolución en milisegundos Estado de la sesión, puede ser uno de los siguientes: sesión completada con éxito no se pudieron analizar los datos del cliente, por ejemplo, la cabecera PROXY protocol acceso prohibido, por ejemplo, cuando el acceso está limitado para ciertas direcciones de cliente error interno del servidor bad gateway, por ejemplo, si no se pudo seleccionar o alcanzar un servidor upstream servicio no disponible, por ejemplo, cuando el acceso está limitado por el número de conexiones Hora local en formato estándar ISO 8601 Hora local en el formato Common Log Format--with-stream
build option.
En los paquetes e imágenes de nuestros repos,
el módulo está incluido en la compilación.Ejemplo de Configuración#
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;
}
}
Directivas#
listen#
listen
address[:port] [ssl
] [udp
] [proxy_protocol
] [setfib=
number] [fastopen=
number] [backlog=
number] [rcvbuf=
size] [sndbuf=
size] [accept_filter=
filter] [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; # igual que *: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
puede tener parámetros adicionales específicos de las llamadas al sistema relacionadas con sockets.setfib=
numberSO_SETFIB
) para el socket de escucha. Actualmente solo funciona en FreeBSD.fastopen=
numberbacklog=
numberbacklog
en la llamada listen()
que limita la longitud máxima de la cola de conexiones pendientes. Por defecto, backlog
se establece en -1
en FreeBSD, DragonFly BSD y macOS, y en 511 en otras plataformas.rcvbuf=
sizeSO_RCVBUF
) para el socket de escucha.sndbuf=
sizeSO_SNDBUF
) para el socket de escucha.accept_filter=
filterSO_ACCEPTFILTER
) para el socket de escucha, que filtra conexiones entrantes antes de pasarlas a accept()
. Funciona solo en FreeBSD y NetBSD 5.0+. Valores aceptados: dataready
y httpready
.deferred
accept()
diferido (opción de socket TCP_DEFER_ACCEPT
) en Linux.bind
bind()
separada para un par address:port determinado. Si hay varias directivas listen con el mismo port pero distintas direcciones, y una de ellas escucha en todas las direcciones para ese puerto (*:port), Angie hará bind()
solo a *:port. En este caso, se ejecutará la llamada getsockname()
para determinar la dirección que aceptó la conexión. Si se usan parámetros como setfib
, fastopen
, backlog
, rcvbuf
, sndbuf
, accept_filter
, deferred
, ipv6only
, reuseport
o so_keepalive
, siempre se hará una llamada bind()
separada para ese par address:port.ipv6only=on
| off
IPV6_V6ONLY
) si un socket IPv6 que escucha en la dirección comodín [::] aceptará solo conexiones IPv6 o tanto IPv6 como IPv4. Este parámetro está activado por defecto. Solo puede configurarse una vez al inicio.reuseport
SO_REUSEPORT
en Linux 3.9+ y DragonFly BSD, o SO_REUSEPORT_LB
en FreeBSD 12+), permitiendo al kernel distribuir las conexiones entrantes entre procesos worker. Actualmente funciona solo en Linux 3.9+, DragonFly BSD y FreeBSD 12+.multipath
udp
.so_keepalive=on
| off
| [keepidle
]:[samp:keepintvl]:[samp:keepcnt]''
on
off
TCP_KEEPIDLE
, TCP_KEEPINTVL
y
TCP_KEEPCNT
. En dichos sistemas (actualmente Linux 2.4+, NetBSD 5+ y FreeBSD 9.0-STABLE),
pueden configurarse usando los parámetros keepidle, keepintvl y keepcnt.
Se pueden omitir uno o dos parámetros, en cuyo caso se aplicarán los valores por defecto del sistema.so_keepalive=30m::10
preread_buffer_size#
preread_timeout#
proxy_protocol_timeout#
proxy_protocol_timeout
timeout;proxy_protocol_timeout 30s;
resolver#
resolver
address ... [valid=
time] [ipv4=
on
| off
] [ipv6=
on
| off
] [status_zone=
zone];resolver 127.0.0.53 [::1]:5353;
valid
permite sobrescribirlo: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
, la directiva server_name
se basa en la
Server Name Indication (SNI) y solo funciona con conexiones TLS.
Para usarla, debe configurar la terminación TLS o
habilitar TLS preread en el bloque server
correspondiente.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 sustituir la primera o última parte de un nombre: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
,
se insertará el nombre de host de la máquina.*.example.com
mail.*
server_names_hash_bucket_size#
server_names_hash_bucket_size
size;server_names_hash_bucket_size 32|64|128;
server_names_hash_max_size#
status_zone#
server
pueden compartir la misma zona para la recopilación de datos.server {
listen 80;
server_name *.example.com;
status_zone single;
# ...
}
$server_addr
se agrupan en host_zone
.
Las métricas se recopilan por separado para cada $server_addr
único
hasta que el número de grupos de métricas alcanza 10.
Después de eso, cualquier nuevo valor de $server_addr
se añadirá al 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#
Variables integradas#
$angie_version
#$binary_remote_addr
#$bytes_received
#$bytes_sent
#$connection
#$hostname
#$msec
#$pid
#$protocol
#TCP
o 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 capa superior usado sobre la conexiónauthority (0x02)
- nombre de host proporcionado por el clienteunique_id (0x05)
- identificador único de conexiónnetns (0x30)
- nombre del namespacessl (0x20)
- estructura TLV SSL en formato binariossl_version (0x21)
- versión de SSL usada en la conexión del clientessl_cn (0x22)
- Common Name del certificadossl_cipher (0x23)
- nombre del cifrado utilizadossl_sig_alg (0x24)
- algoritmo usado para firmar el certificadossl_key_alg (0x25)
- algoritmo de clave públicassl_verify
- resultado de la verificación del certificado del cliente: 0 si el cliente presentó un certificado y fue verificado con éxito, o un valor distinto de cero en caso contrario$remote_addr
#$remote_port
#$server_addr
#bind
.$server_port
#$session_time
#$status
#200
400
403
500
502
503
$time_iso8601
#$time_local
#