Cómo configurar Nginx como proxy inverso para WebSocket

A+ A-

El WebSocket es un protocolo que proporciona una forma de crear aplicaciones web que soporta en tiempo real comunicación bidireccional entre los clientes y los servidores. WebSocket hace que sea mucho más fácil desarrollar este tipo de aplicaciones. La mayoría de los navegadores modernos soportan WebSocket incluyendo Firefox, Internet Explorer, Chrome, Safari y Opera, y cada vez más los entornos de aplicaciones servidor ahora están apoyando WebSocket también.

Para un entorno de producción, donde se necesitan varios servidores WebSocket para conseguir un buen rendimiento y alta disponibilidad del sitio web o aplicación, una capa de equilibrio de carga, que entiende Se requiere el protocolo WebSocket, Nginx es compatible con el uso de WebSocket de la versión Nginx 1.3 y puede actuar como un proxy inverso para hacer balance de carga de aplicaciones.

Nginx apoya WebSocket permitiendo un túnel que se establecerá entre los dos servidores cliente y servicios de fondo. Nginx enviará la solicitud de actualización desde el cliente al servidor back-end, los encabezados de la actualización y la conexión debe realizarse de forma explícita.

 lugar / wsapp / {
    PROXY_PASS http: // wsbackend;
    proxy_http_version 1.1;
    Asciende proxy_set_header $ http_upgrade;
    proxy_set_header conexión "actualización";
} 

Una vez hecho esto, se ocupa de este NGINX como una conexión WebSocket.

Instalación Nginx WebSocket con el Ejemplo

Aquí es un ejemplo vivo para mostrar el trabajo Nginx como proxy WebSocket. En este ejemplo se ayuda en la aplicación de WebSocket construido sobre Node.js. Nginx actúa como un proxy inverso para una aplicación sencilla que utiliza WebSocket ws y Node.js. Estas instrucciones se han probado con Ubuntu 13.10 y CentOS 6.5, pero que necesita ser ajustado para otros sistemas operativos y versiones. Para este ejemplo, la dirección IP del servidor WebSocket es 192.168.1.1 y la dirección IP del servidor Nginx es 192.168.1.2

Si usted no tiene instalado Node.js y NPM, a continuación, ejecute el comando siguiente:

 # Sudo yum install nodejs NPM 

Node.js se instala como nodejs en Ubuntu y como nodo en CentOS. El ejemplo utiliza nodo, por lo que en Ubuntu tenemos que crear un enlace simbólico desde nodejs a nodo:

 # Ln -s / usr / bin / nodejs / usr / local / bin / nodo 

Para instalar WebSocket, ejecute el comando siguiente:

 # Sudo NPM instalar ws 

Nota: Si recibe un mensaje de error como: "Error: No se pudieron obtener a partir del registro: ws", ejecute el comando siguiente para solucionar el problema

 Registro # sudo NPM config set http://registry.npmjs.org/ 

A continuación, ejecute el MNP sudo comando de instalación de nuevo

 # Sudo NPM instalar ws 

'ws' viene con el programa / root / node_modules / ws / bin / wscat que se puede utilizar para nuestro cliente, pero tenemos que crear un programa para que actúe como servidor. Crear un archivo llamado server.js con estos contenidos

 console.log ( "Servidor comenzó");
var Msg = '';
var WebSocketServer = require ( 'ws'). Servidor
    , WSS = new WebSocketServer ({port: 8010});
    wss.on ( "conexión", la función (WS) {
        ws.on ( 'mensaje', function (mensaje) {
        console.log ( 'Recibido de cliente:% s', mensaje);
        ws.send ( 'Servidor recibido desde el cliente:' + mensaje);
    });
 }); 

Para ejecutar el programa de servidor, ejecute el comando siguiente:

 # server.js nodo 

Las impresiones de una inicial del servidor "Servidor comenzaron" mensaje y luego escucha en el puerto 8010, que espera el cliente para conectarse a ella. Cuando se recibe una petición del cliente, se hace eco de ello y envía un mensaje de vuelta al cliente que contiene el mensaje que recibió. Para tener NGINX proxy de estas solicitudes, podemos crear la siguiente configuración

 http {
    mapa $ http_upgrade $ {connection_upgrade
        actualizar de forma predeterminada;
        '' cerca;
    }
    WebSocket aguas arriba {
        192.168.1.1:8010 servidor;
    }
    servidor {
        escuchar 8020;
        ubicación / {
            PROXY_PASS http: // WebSocket;
            proxy_http_version 1.1;
            Asciende proxy_set_header $ http_upgrade;
            Conexión proxy_set_header $ connection_upgrade;
        }
    }
} 

Nginx escucha en el puerto 8020 y de proxy peticiones al servidor WebSocket de fondo. Las directivas permiten proxy_set_header Nginx para manejar adecuadamente el protocolo WebSocket.

Para probar el servidor, corremos wscat en nuestro sistema cliente

 # / Raíz ws / node_modules / ws / bin / wscat --connect: //192.168.1.2: 8020 

wscat se conecta al servidor a través del proxy WebSocket Nginx. Al escribir un mensaje para wscat para enviar al servidor, se ve que se hizo eco en el servidor y, a continuación aparece un mensaje del servidor en el cliente. He aquí una muestra de la interacción

Servidor: Cliente:

 # server.js nodo
inicia Server 
 # ws wscat -connect: //192.168.1.2: 8020
Conectado (presione CTRL + C para salir)
> Hola
Recibida desde el cliente: Hola       
<Servidor recibido desde el cliente: Hola 

Aquí vemos que el cliente y el servidor son capaces de comunicarse a través de Nginx que está actuando como un servidor proxy y los mensajes pueden seguir siendo enviado de vuelta hasta que se desconecta el cliente o servidor. Todo lo que se necesita para conseguir Nginx correctamente configurado para manejar WebSocket, y establecer las cabeceras de manejar correctamente la solicitud de actualización que actualiza la conexión de HTTP a WebSocket.