Vai al contenuto

Deploy con Nginx

Nginx è un server HTTP e proxy estremamente veloce, collaudato e facile da configurare. Mentre Vapor supporta la gestione diretta delle richieste HTTP con o senza TLS, fare il proxy dietro Nginx può fornire migliori prestazioni, sicurezza e facilità d'uso.

Nota

Raccomandiamo di fare il proxy dei server HTTP Vapor dietro Nginx.

Panoramica

Cosa significa fare il proxy di un server HTTP? In breve, un proxy funge da intermediario tra la rete pubblica e il tuo server HTTP. Le richieste arrivano al proxy che le inoltra a Vapor.

Una caratteristica importante di questo proxy intermediario è che può modificare o persino reindirizzare le richieste. Ad esempio, il proxy può richiedere che il client utilizzi TLS (https), limitare il numero di richieste (rate limiting), o persino servire file pubblici senza coinvolgere la tua applicazione Vapor.

nginx-proxy

Maggiori Dettagli

La porta predefinita per ricevere le richieste HTTP è la porta 80 (e 443 per HTTPS). Quando colleghi un server Vapor alla porta 80, riceverà e risponderà direttamente alle richieste HTTP che arrivano al tuo server. Quando aggiungi un proxy come Nginx, colleghi Vapor a una porta interna, come la porta 8080.

Nota

Le porte superiori a 1024 non richiedono sudo per il binding.

Quando Vapor è collegato a una porta diversa da 80 o 443, non sarà accessibile dall'esterno di internet. A quel punto colleghi Nginx alla porta 80 e lo configuri per instradare le richieste al tuo server Vapor collegato alla porta 8080 (o qualunque porta tu abbia scelto).

Ecco fatto. Se Nginx è configurato correttamente, vedrai la tua app Vapor rispondere alle richieste sulla porta 80. Nginx fa il proxy delle richieste e delle risposte in modo trasparente.

Installare Nginx

Il primo passo è installare Nginx. Uno dei grandi vantaggi di Nginx è la straordinaria quantità di risorse della community e documentazione che lo circondano. Per questo motivo, non entreremo nei dettagli sull'installazione di Nginx, poiché esiste quasi certamente un tutorial per la tua piattaforma, sistema operativo e provider specifici.

Tutorial:

Package Manager

Nginx può essere installato tramite i package manager su Linux.

Ubuntu

sudo apt-get update
sudo apt-get install nginx

CentOS e Amazon Linux

sudo yum install nginx

Fedora

sudo dnf install nginx

Verificare l'Installazione

Verifica che Nginx sia stato installato correttamente visitando l'indirizzo IP del tuo server nel browser

http://server_domain_name_or_IP

Servizio

Il servizio può essere avviato o arrestato.

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

Avviare Vapor

Nginx può essere avviato e arrestato con i comandi sudo service nginx .... Avrai bisogno di qualcosa di simile per avviare e arrestare il tuo server Vapor.

Ci sono molti modi per farlo, e dipendono dalla piattaforma su cui stai facendo il deploy. Consulta le istruzioni di Supervisor per aggiungere i comandi per avviare e arrestare la tua app Vapor.

Configurare il Proxy

I file di configurazione per i siti abilitati si trovano in /etc/nginx/sites-enabled/.

Crea un nuovo file o copia il template di esempio da /etc/nginx/sites-available/ per iniziare.

Ecco un esempio di file di configurazione per un progetto Vapor chiamato Hello nella directory 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;
    }
}

Questo file di configurazione presuppone che il progetto Hello si colleghi alla porta 8080 quando avviato in modalità production.

Servire File

Nginx può anche servire file pubblici senza coinvolgere la tua app Vapor. Questo può migliorare le prestazioni liberando il processo Vapor per altri compiti sotto carico elevato.

server {
    ...

    # Serve tutti i file pubblici/statici tramite nginx e poi ricade su Vapor per il resto
    location / {
        try_files $uri @proxy;
    }

    location @proxy {
        ...
    }
}

TLS

Aggiungere TLS è relativamente semplice, purché i certificati siano stati generati correttamente. Per generare certificati TLS gratuitamente, consulta 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 configurazione sopra rappresenta impostazioni TLS relativamente restrittive per Nginx. Alcune delle impostazioni qui non sono obbligatorie, ma migliorano la sicurezza.