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.
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.
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á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. |
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;
}
}
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;
}
}
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;
}
}
proxy_read_timeout
y proxy_send_timeout
) suficientemente altos para mantener activas las conexiones en aplicaciones de tiempo real.
Para más detalles sobre la configuración de WebSockets en Nginx, consulta la documentación oficial de Nginx.
Jorge García
Fullstack developer