Despliegue con Nginx#

Nginx es un servidor y proxy HTTP extremadamente rápido, confiable, y fácil de configurar. Aunque Vapor soporta servir peticiones HTTP con o sin TLS directamente, hacer un proxy con Nginx puede proporcionar un aumento en rendimiento, seguridad y facilidad de uso.

Nota

Recomendamos hacer un proxy de los servidores HTTP de Vapor con Nginx.

Descripción#

¿Qué significa poner un proxy a un servidor HTTP? En pocas palabras, un proxy actúa como un intermediario entre el Internet público y tu servidor HTTP. Las peticiones llegan al proxy y éste las envía a Vapor.

Una propiedad importante de este proxy intermediario es que puede alterar e inclusive redirigir las peticiones. Por ejemplo, el proxy puede requerir que el cliente use TLS (https), limitar la tasa de peticiones e incluso servir ficheros públicos sin comunicarse con tu aplicación de Vapor.

nginx-proxy

Más Detalles#

El puerto por defecto para recibir peticiones HTTP es el puerto 80 (y 443 para HTTPS). Cuando enlazas un servidor de Vapor al puerto 80, recibirá y responderá directamente a las peticiones HTTP que lleguen a tu servidor. Cuando añades un proxy como Nginx, enlazas Vapor a un puerto interno, como el puerto 8080.

Nota

Puertos mayores que no necesitan sudo para enlazarse.

Cuando Vapor está enlazado a otro puerto además de 80 o 443, no será accesible para el Internet externo. Entonces enlazas Nginx al puerto 80 y lo configuras para que enrute las peticiones a tu servidor de Vapor enlazado en el puerto 8080 (o el que hayas elegido).

Y eso es todo. Si Nginx está configurado correctamente, verás que tu aplicación de Vapor responde a las peticiones en el puerto 80. Nginx actúa como proxy ante las peticiones y responde de manera invisible.

Instalar Nginx#

El primer paso es instalar Nginx. Una de las mejores cosas de Nginx es la enorme cantidad de recursos de la comunidad y documentación que tiene. Por ello, no entraremos en detalle sobre cómo instalar Nginx, pues seguramente hay un tutorial para tu plataforma, sistema operativo y proveedor.

Tutoriales:

Package Managers#

Nginx puede instalarse mediante package managers en Linux.

Ubuntu#

sudo apt-get update
sudo apt-get install nginx

CentOS y Amazon Linux#

sudo yum install nginx

Fedora#

sudo dnf install nginx

Validar la Instalación#

Comprueba que Nginx se ha instalado correctamente visitando la dirección IP de tu servidor en un navegador.

http://server_domain_name_or_IP

Servicio#

El servicio puede iniciarse o detenerse.

sudo service nginx stop
sudo service nginx start
sudo service nginx restart

Arrancando Vapor#

Nginx puede iniciarse y detenerse con los comandos sudo service nginx .... Necesitarás algo parecido para iniciar y detener tu servidor de Vapor.

Existen muchas formas de hacerlo, dependiendo de la plataforma en la que vayas a desplegar. Revisa las instrucciones de Supervisor para añadir comandos para iniciar y detener tu aplicación de Vapor.

Configurar el Proxy#

Los ficheros de configuración para los sitios habilitados pueden encontrarse en /etc/nginx/sites-enabled/.

Crea un nuevo fichero o copia la plantilla de ejemplo ubicada en /etc/nginx/sites-available/ para empezar.

A continuación tienes un ejemplo de un fichero de configuración para un proyecto de Vapor llamado Hello en el directorio “home”.

server {
    server_name hello.com;
    listen 80;

    root /home/vapor/Hello/Public/;

    location @proxy {
        proxy_pass http://127.0.0.1:8080;
        proxy_pass_header Server;
        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_connect_timeout 3s;
        proxy_read_timeout 10s;
    }
}

Este fichero de configuración asume que el proyecto Hello se enlaza con el puerto 8080 al iniciarlo en el modo de producción.

Servir Ficheros#

Nginx también puede servir ficheros públicos sin preguntar a tu aplicación de Vapor. Esto puede mejorar el rendimiento liberando el proceso de Vapor para otras tareas más pesadas.

server {
    ...

    # Sirve todos los ficheros públicos/estáticos via nginx y recurre a Vapor para el resto
    location / {
        try_files $uri @proxy;
    }

    location @proxy {
        ...
    }
}

TLS#

Añadir TLS es relativamente sencillo siempre y cuando los certificados hayan sido generados correctamente. Para generar certificados TLS gratuitamente, echa un vistazo a Let’s Encrypt.

server {
    ...

    listen 443 ssl;

    ssl_certificate /etc/letsencrypt/live/hello.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/hello.com/privkey.pem;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_stapling on;
    ssl_stapling_verify on;
    add_header Strict-Transport-Security max-age=15768000;

    ...

    location @proxy {
       ...
    }
}

La configuración de arriba son los ajustes relativamente estrictos para TLS con Nginx. Algunos ajustes no son necesarios, pero aumentan la seguridad.

Editar esta página