Skip to content

websocketd con Nginx

Busindre edited this page Nov 6, 2016 · 1 revision

Websocket detrás de Nginx: SSL offloading / Load balancing + failover / Proxy reverso.

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.

SSL offloading (wss:// to ws://)

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

Balanceo de carga (failover) + SSL offloading (wss:// to ws://).

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.

Compartir el mismo puerto entre múltiples endpoints (Nginx + Websocketd HTTP / HTTPS).

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

}

Compartir el mismo host con otros servicios (Nginx + Multiples Websocket-endpoints).

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;  
   }
}
Clone this wiki locally