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

Cómo configurar un servidor de WebSockets en Nginx

Nginx puede funcionar como un proxy inverso para aplicaciones WebSocket, permitiendo la comunicación en tiempo real entre el cliente y el servidor. Los WebSockets son un protocolo que permite conexiones persistentes, ideal para aplicaciones en tiempo real como chats, actualizaciones en vivo, notificaciones, etc.

¿Qué es un servidor de WebSockets en Nginx?

Un servidor de WebSockets en Nginx actúa como intermediario entre el cliente y la aplicación backend que maneja las conexiones WebSocket. Nginx redirige las solicitudes de WebSocket al backend y mantiene la conexión persistente, permitiendo que los mensajes fluyan en ambas direcciones sin necesidad de establecer una nueva conexión para cada mensaje.

Para configurar un servidor de WebSockets, es necesario habilitar la comunicación bidireccional mediante encabezados específicos y ajustar el tiempo de espera (timeout) para que la conexión se mantenga activa.

Configuración básica de WebSockets en Nginx

Para configurar Nginx como un proxy para WebSockets, se utilizan las directivas proxy_set_header y proxy_http_version para permitir la conexión en tiempo real. A continuación, se muestra una configuración básica para proxy WebSocket:

http {
    upstream websocket_backend {
        server localhost:3000;  # Cambiar al puerto donde la aplicación WebSocket escucha
    }

    server {
        listen 80;
        server_name ejemplo.com;

        location /ws/ {
            proxy_pass http://websocket_backend;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;

            # Tiempo de espera para mantener la conexión WebSocket activa
            proxy_read_timeout 86400s;
            proxy_send_timeout 86400s;
        }
    }
}

En este ejemplo:

  • proxy_pass http://websocket_backend;: Redirige las solicitudes WebSocket al servidor backend que escucha en el puerto 3000.
  • proxy_http_version 1.1;: Configura HTTP/1.1, necesario para WebSockets.
  • proxy_set_header Upgrade $http_upgrade;: Habilita la conexión WebSocket indicando que se debe actualizar el protocolo.
  • proxy_set_header Connection "upgrade";: Permite que la conexión se actualice a WebSocket.
  • proxy_read_timeout y proxy_send_timeout: Mantienen la conexión abierta durante un tiempo prolongado para evitar que la conexión WebSocket se cierre prematuramente.

Parámetros clave en la configuración de WebSockets en Nginx

Parámetro Descripción
proxy_pass Define el servidor backend al que se pasarán las solicitudes WebSocket.
proxy_http_version Especifica la versión HTTP 1.1, necesaria para soportar WebSockets.
proxy_set_header Upgrade Permite la actualización de la conexión a WebSocket.
proxy_set_header Connection Cambia la conexión a “upgrade”, necesario para la comunicación WebSocket.
proxy_read_timeout Tiempo de espera para que el servidor backend envíe datos al cliente; importante para mantener la conexión.
proxy_send_timeout Tiempo de espera para que Nginx envíe datos al backend, manteniendo activa la conexión.

Ejemplos adicionales de configuración de WebSocket en Nginx

1. Configurar WebSocket sobre HTTPS:

Si necesitas que la conexión WebSocket sea segura (wss://), configura el servidor en el puerto 443 y habilita SSL:

server {
       listen 443 ssl;
       server_name ejemplo.com;

       ssl_certificate /etc/nginx/ssl/certificado.crt;
       ssl_certificate_key /etc/nginx/ssl/clave.key;

       location /ws/ {
           proxy_pass http://websocket_backend;
           proxy_http_version 1.1;
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection "upgrade";
           proxy_set_header Host $host;
           proxy_read_timeout 86400s;
           proxy_send_timeout 86400s;
       }
   }

2. Balanceo de carga para múltiples instancias WebSocket:

Utiliza la directiva upstream para configurar varios servidores backend de WebSocket y balancear la carga entre ellos:

upstream websocket_backend {
       server backend1:3000;
       server backend2:3000;
       server backend3:3000;
   }

   server {
       listen 80;
       server_name ejemplo.com;

       location /ws/ {
           proxy_pass http://websocket_backend;
           proxy_http_version 1.1;
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection "upgrade";
           proxy_set_header Host $host;
           proxy_read_timeout 86400s;
           proxy_send_timeout 86400s;
       }
   }

3. Restringir conexiones WebSocket por IP:

Se pueden definir restricciones de acceso basadas en la IP del cliente, útil para proteger el servidor contra accesos no autorizados:

server {
       listen 80;
       server_name ejemplo.com;

       location /ws/ {
           allow 192.168.1.0/24;  # Permitir solo la red local
           deny all;

           proxy_pass http://websocket_backend;
           proxy_http_version 1.1;
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection "upgrade";
           proxy_set_header Host $host;
           proxy_read_timeout 86400s;
           proxy_send_timeout 86400s;
       }
   }

Consideraciones para la configuración de WebSockets en Nginx

  • Versiones de Nginx: Asegúrate de estar utilizando una versión de Nginx compatible con WebSockets (1.3 o superior).
  • Tiempo de espera: Define tiempos de espera (proxy_read_timeout y proxy_send_timeout) suficientemente altos para mantener activas las conexiones en aplicaciones de tiempo real.
  • SSL/TLS: Para conexiones seguras (wss://), configura correctamente los certificados SSL en el servidor.

Referencias

Para más detalles sobre la configuración de WebSockets en Nginx, consulta la documentación oficial de Nginx.

Etiquetas:
nginx
Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer