Comunidad de diseño web y desarrollo en internet online

WebSockets seguros en Nginx

Un avance muy importante de la web moderna ha sido la creación y aplicación de WebSockets, que es una tecnología usada para hacer aplicaciones web real-time, en el caso de Mejorando.la es muy utilizada para los sistemas de notas y logs en su plataforma Platzi, mejorando considerablemente el rendimiento a comparación de sistemas con peticiones HTTP comunes.



WebSocket


Según Wikipedia:

Wikipedia :

WebSocket es una tecnología que proporciona un canal de comunicación bidireccional y full-duplex sobre un único socket TCP. Está diseñada para ser implementada en navegadores y servidores web, pero puede utilizarse por cualquier aplicación cliente/servidor.


Los WebSockets están íntimamente ligados a HTML5, y la mayoría de los navegadores actuales tiene soporte oficial para WebSockets.

El problema

La mayoría de los servidores web no manejan directamente los WebSockets, y más con la frecuencia con la que se actualizan (en el caso de Apache), por lo tanto se necesitan herramientas externas para la traducción de estas peticiones hacia el destino correcto.

Nginx y los WebSockets

La empresa Nginx anunció en el 2013, que a a partir de la versión 1.3 de Nginx tendría soporte oficial para WebSockets, por lo tanto no se necesita una herramienta externa si se usa la versión 1.3 o superior.

Configuración de WebSockets


Antes de configurar el soporte de WebSockets en Nginx, hay que tener una aplicación que responda a las peticiones; estas aplicaciones pueden ser escritas en Python (Tornado), NodeJS (Socket.IO), Ruby (Rails).

Punto siguiente es realizar la configuración del proxy en Nginx, comenzando por upstream (Nuestra app).

Código :

# La aplicación que resolverá todas las peticiones
upstream miapp {
        server localhost:3000;
}


Y por último configuramos nuestro server, para que escuche el puerto y el dominio que deseamos, tomando en cuenta la re-dirección de las peticiones de contenido dinámico hacia nuestro upstream "miapp".

Código :

server {
        listen  80;
        server_name cristalab.com;
        root /var/www/cristalab;
        index index.html index.html;
 
        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;
 
        location / {
                proxy_pass http://miapp;
                # Aquí comienza el soporte a WebSockets
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                # Aquí termina
                proxy_set_header Host $host;
 
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto https;
 
                proxy_redirect off;
        }
}


Nginx + SSL + WebSockets


Si necesitamos conexión segura entre nuestros clientes y el servidor debemos instalar nuestro certificado SSL, el principal cambio es que no se escucha el puerto 80 para conexiones seguras sino el puerto 443, cambiando así la forma de nuestro server.

Código :

server {
        listen 80;
        # Puerto 443 en vez del puerto 80
        listen  443 default ssl;
        server_name cristalab.com;
        root /var/www/cristalab;
        index index.html index.html;

        # Configuración para llaves SSL
        ssl on;
        ssl_certificate /srv/ssl/nginx.pem;
        ssl_certificate_key /srv/ssl/nginx.key;
        
        # Se redirecciona toda petición del puerto 80 al 443
        if ($ssl_protocol = "") {
            rewrite ^ https://$host$request_uri? permanent;
        }
 
        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;
 
        location / {
                proxy_pass http://miapp;
                # Aquí comienza el soporte a WebSockets
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                # Aquí termina
                proxy_set_header Host $host;
 
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto https;
 
                proxy_redirect off;
        }
}


Y con esto se tiene total soporte para SSL y WebSockets en nuestro servidor Nginx.

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate