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