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.

Enviar comentario

via Cristalab http://ift.tt/1k3wTJ2

Advertisements

Tags:

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: