Volver a la página principal
viernes 8 noviembre 2024
42

Cómo usar la directiva stream para proxy TCP y UDP en Nginx

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.

¿Qué es la directiva 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.

Configuración básica de proxy TCP y UDP en Nginx con 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.

Ejemplo de configuración de proxy TCP

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.

Ejemplo de configuración de proxy UDP

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ámetros de configuración para proxy TCP y UDP

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.

Ejemplos adicionales de configuración de proxy TCP y UDP

1. Configurar tiempos de espera en conexiones TCP:

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
       }
   }

2. Balanceo de carga con IP Hash para conexiones persistentes:

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;
       }
   }

3. Configurar límites de velocidad de conexión para prevenir sobrecarga:

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
       }
   }

4. Manejo de conexiones UDP para servicios DNS:

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;
       }
   }

Consideraciones para la configuración de stream en Nginx

  • Compatibilidad de versiones: La directiva stream requiere Nginx 1.9.0 o superior y debe estar habilitada con el parámetro --with-stream en la instalación.
  • Protocolos compatibles: stream es adecuado para aplicaciones que utilizan TCP y UDP, pero no funciona con conexiones HTTP/HTTPS.
  • Balanceo de carga: Al igual que en HTTP, stream permite balanceo de carga, persistencia de sesiones y limitación de conexiones.
  • Seguridad: Es importante configurar adecuadamente las políticas de firewall y acceso en el servidor para proteger los puertos abiertos de Nginx para stream.

Referencias

Para más detalles sobre la configuración de proxy TCP y UDP en Nginx, consulta la documentación oficial de Nginx.

Etiquetas:
nginx
Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer