-
Notifications
You must be signed in to change notification settings - Fork 1k
websocketd con Nginx
Nginx permite usar websocketd como backend y proveerle de ciertas funcionalidades como balanceo de carga, Alta disponibilidad (tolerancia a fallos) y SSL offloading. Los ejemplos que se muestran a continuación tratan cada una de esas funcionalidades pero no son excluyentes entre si, es perfectamente posible combinar unas configuraciones con otras.
Cuando se usa Nginx como proxy reverso, este puede encargarse del cifrado SSL (HTTPS) y enviar al bakend las conexiones en claro, sin usar cifrado. De esta manera se eliminan sobrecargas a la hora de procesar un gran número de peticiones HTTPS.
- domainssl.com (HTTPS webserver con enlaces "wss").
- wsbackend.com (HTTP Backend con el websocketd-endpoint).
Enlace WSS en https://domainssl.com. (/usr/share/nginx/html/).
var ws = new WebSocket('wss://domainssl.com:444/XX.sh');
Websocket-endpoint en wsbackend.com
websocketd --port=1080 XX.sh
Nginx configuration en domainssl.com.
### HTML Files
server {
listen 443 ssl;
server_name domainssl.com;
ssl_certificate /etc/nginx/XX.cer;
ssl_certificate_key /etc/nginx/XX.key;
location / {
root /usr/share/nginx/html/;
allow all;
}
}
### De WSS (front-end) a WS (backend).
server {
listen 444 ssl;
server_name domainssl.com;
ssl_certificate /etc/nginx/XX.cer;
ssl_certificate_key /etc/nginx/XX.key;
location / {
proxy_pass http://wsbackend.com:1080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Timeout configuration.
# proxy_redirect off;
# proxy_connect_timeout 300;
# proxy_send_timeout 300;
# proxy_read_timeout 300;
}
}
Como en el ejemplo anterior pero con balanceo de carga (round-robin) y cuatro nodos de backend.
- domainssl.com (Servidor web HTTPS con enlaces wss).
- Upstream backendlb (Balanceador de carga con 4 websocketd-endpoints HTTP): wsbackend.com, wsbackend2.com, wsbackend3.com, wsbackend4.com.
Enlace WSS en https://domainssl.com. (/usr/share/nginx/html/)
var ws = new WebSocket('wss://domainssl.com:444/XX.sh');
Comando de los Websocket-endpoints de wsbackend.com, wsbackend2.com
websocketd --port=1080 XX.sh
Comando de los Websocket-endpoints de wsbackend3.com, wsbackend4.com.
websocketd --port=4445 XX.sh
Nginx configuración en domainssl.com.
html {
### Lod balaning with 4 Nodes.
upstream backendlb {
server wsbackend.com:1080;
server wsbackend2.com:1080;
server wsbackend3.com:4445;
server wsbackend4.com:4445;
}
### HTML Files
server {
listen 443 ssl;
server_name domainssl.com;
ssl_certificate /etc/nginx/XX.cer;
ssl_certificate_key /etc/nginx/XX.key;
location / {
root /usr/share/nginx/html/;
allow all;
}
}
### Balanceo de carga (de WSS:// a WS://) (4 nodos de backend).
server {
listen 444 ssl;
server_name domainssl.com;
ssl_certificate /etc/nginx/XX.cer;
ssl_certificate_key /etc/nginx/XX.key;
location / {
proxy_pass http://backendlb;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Timeout configuration.
# proxy_redirect off;
# proxy_connect_timeout 300;
# proxy_send_timeout 300;
# proxy_read_timeout 300;
}
}
}
Métodos de balanceo de carga de Nginx: http://nginx.org/en/docs/http/load_balancing.html
- round-robin — batido de carga aleatorio.
- least-connected — Batido de carga en base al número de conexiones de cada nodo.
- ip-hash — batido de carga basado en la dirección IP del cliente.
- domainssl.com (Servidor HTTPS con enlaces wss).
- domainssl.com/socket1 (HTTP Backend con websocketd-endpoint en localhost:4445).
- domainssl.com/socket2 (HTTPS Backend con websocketd-endpoint externo (Internet / LAN) usando el puerto 3335).
Enlaces WSS en https://domainssl.com page. (/usr/share/nginx/html/)
var ws = new WebSocket('wss://domainssl.com/XX.sh');
Comando del Websocket-endpoint para localhost.
websocketd --port=4445 XX.sh
Comando del Websocket-endpoint de domain.com. (HTTPS)
websocketd --ssl --sslcert=FILE --sslkey=FILE --port=3335 XX.sh
Configuración Nginx en domainssl.com.
### HTML Files
server {
listen 443 ssl;
server_name domainssl.com;
ssl_certificate /etc/nginx/XX.cer;
ssl_certificate_key /etc/nginx/XX.key;
location / {
root /usr/share/nginx/html/;
allow all;
}
location /socket1 {
proxy_pass http://localhost:4445;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
# Timeout configuration.
# proxy_redirect off;
# proxy_connect_timeout 300;
# proxy_send_timeout 300;
# proxy_read_timeout 300;
}
location /socket2 {
proxy_pass https://domain.com:3335;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
# ssl_verify_client on;
# Timeout configuration.
# proxy_redirect off;
# proxy_connect_timeout 300;
# proxy_send_timeout 300;
# proxy_read_timeout 300;
}
}
Un servidor puede tener múltiples IPs. Websocket puede usarse con la opción --address
para facilitar el uso de un mismo puerto sobre diferentes endpoints dentro del mismo servidor.
domainssl.com tiene las IPs 10.0.0.30 y 10.0.0.31 configuradas.
- domainssl.com (HTTPS webserver con enlaces wss) .
- domainssl.com localhost (HTTP Backend con websocketd-endpoint en localhost:4445).
- domainssl.com 10.0.0.30 (HTTP Backend con websocketd-endpoint en 10.0.0.30:4445).
- domainssl.com 10.0.0.31 (HTTP Backend con websocketd-endpoint en 10.0.0.31:4445).
Enlaces WSS en https://domainssl.com (/usr/share/nginx/html/).
var ws = new WebSocket('wss://domainssl.com/socket1/XX.sh');
var ws = new WebSocket('wss://domainssl.com/socket2/XX.sh');
var ws = new WebSocket('wss://domainssl.com/socket3/XX.sh');
Comandos para los diferentes Websocket-endpoints de domainssl.com.
websocketd --address=localhost --port 445 xx.sh
websocketd --address=10.0.0.30 --port 445 xx.sh
websocketd --address=10.0.0.31 --port 445 xx.sh
Configuración Nginx en domainssl.com.
### HTML Files
server {
listen 443 ssl;
server_name domainssl.com;
ssl_certificate /etc/nginx/XX.cer;
ssl_certificate_key /etc/nginx/XX.key;
location / {
root /usr/share/nginx/html/;
allow all;
}
location /socket1 {
proxy_pass http://localhost:4445;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
# Timeout configuration.
# proxy_redirect off;
# proxy_connect_timeout 300;
# proxy_send_timeout 300;
# proxy_read_timeout 300;
}
location /socket2 {
proxy_pass http://10.0.0.30:4455;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
# Timeout configuration.
# proxy_redirect off;
# proxy_connect_timeout 300;
# proxy_send_timeout 300;
# proxy_read_timeout 300;
}
location /socket3 {
proxy_pass http://10.0.0.33:4445;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
# Timeout configuration.
# proxy_redirect off;
# proxy_connect_timeout 300;
# proxy_send_timeout 300;
# proxy_read_timeout 300;
}
}
The websocketd user guide is a publicly editable wiki. Please contribute!
Getting Started
Reference
Language specific
Advanced: Internals
Spanish Websocket Wiki
Primeros pasos
Referencia
Lenguajes
Avanzado