La directiva stream en Nginx permite configurar un proxy de nivel de transporte para protocolos TCP y UDP, ofreciendo soporte para aplicaciones que requieren conexiones persistentes, como bases de datos, servicios de correo electrónico, y otros protocolos de red. Este módulo es especialmente útil para balancear la carga y gestionar conexiones de servicios no HTTP.
stream en Nginx?
La directiva stream habilita la capacidad de proxy para conexiones TCP y UDP en Nginx. A diferencia de los módulos HTTP, stream permite a Nginx manejar conexiones en el nivel de transporte, lo que es útil para distribuir solicitudes en aplicaciones o servicios que usan otros protocolos.
Para habilitar el soporte de stream, Nginx debe compilarse con el módulo --with-stream.
stream
Para usar la directiva stream, el bloque de configuración stream debe estar en el contexto principal del archivo de configuración de Nginx (nginx.conf). Dentro de este bloque, se pueden definir servidores y bloques upstream para balancear la carga entre múltiples instancias de backend.
stream {
upstream tcp_backend {
server backend1:3306;
server backend2:3306;
}
server {
listen 3306; # Puerto TCP que escucha Nginx
proxy_pass tcp_backend;
}
}
En este ejemplo:
upstream tcp_backend define un grupo de servidores TCP en el puerto 3306 (generalmente utilizado para bases de datos MySQL).
listen 3306 especifica que Nginx escuchará conexiones TCP en el puerto 3306.
proxy_pass tcp_backend redirige las conexiones al grupo de servidores definidos en tcp_backend, permitiendo balancear la carga entre ellos.
stream {
upstream udp_backend {
server backend1:1234;
server backend2:1234;
}
server {
listen 1234 udp; # Puerto UDP que escucha Nginx
proxy_pass udp_backend;
}
}
En este ejemplo:
upstream udp_backend define un grupo de servidores UDP en el puerto 1234.
listen 1234 udp indica que Nginx escuchará conexiones UDP en el puerto 1234.
proxy_pass udp_backend redirige las conexiones al grupo de servidores udp_backend.
| Parámetro | Descripción |
|---|---|
listen
|
Especifica el puerto (y opcionalmente, el protocolo TCP o UDP) en el que Nginx escuchará. |
proxy_pass
|
Define el servidor o grupo de servidores backend al que se redirigen las conexiones. |
upstream
|
Define un grupo de servidores para balancear la carga en conexiones TCP o UDP. |
proxy_timeout
|
Tiempo de espera para conexiones inactivas con el servidor backend. |
proxy_connect_timeout
|
Tiempo de espera para conectar con el servidor backend. |
proxy_buffer_size
|
Tamaño del buffer para los datos que se envían entre cliente y servidor en el proxy. |
stream {
upstream tcp_backend {
server backend1:3306;
server backend2:3306;
}
server {
listen 3306;
proxy_pass tcp_backend;
proxy_timeout 300s; # Tiempo de espera para conexiones inactivas
proxy_connect_timeout 5s; # Tiempo de espera al conectar
}
}
Utilizar ip_hash en el bloque upstream asegura que las conexiones del mismo cliente siempre se dirijan al mismo servidor, útil para conexiones persistentes.
stream {
upstream udp_backend {
ip_hash;
server backend1:1234;
server backend2:1234;
}
server {
listen 1234 udp;
proxy_pass udp_backend;
}
}
Limitar la velocidad de las conexiones puede ser útil en configuraciones con gran carga para evitar la saturación de los servidores backend.
stream {
server {
listen 3306;
proxy_pass tcp_backend;
limit_conn addr 10; # Límite de 10 conexiones por IP
}
}
Nginx puede actuar como proxy para solicitudes DNS, que operan en UDP, redirigiendo las solicitudes a servidores DNS específicos.
stream {
server {
listen 53 udp;
proxy_pass dns_backend;
}
upstream dns_backend {
server 8.8.8.8:53;
server 8.8.4.4:53;
}
}
stream en Nginx
stream requiere Nginx 1.9.0 o superior y debe estar habilitada con el parámetro --with-stream en la instalación.
stream es adecuado para aplicaciones que utilizan TCP y UDP, pero no funciona con conexiones HTTP/HTTPS.
stream permite balanceo de carga, persistencia de sesiones y limitación de conexiones.
stream.
Para más detalles sobre la configuración de proxy TCP y UDP en Nginx, consulta la documentación oficial de Nginx.
Jorge García
Fullstack developer