Configurazione di Nginx come reverse proxy per applicazioni backend
Introduzione
Nei moderni setup di server, le applicazioni raramente comunicano direttamente con internet. Invece, un reverse proxy si posiziona davanti a loro e gestisce le richieste dei client in arrivo. Nginx è uno degli strumenti più popolari per questo compito perché è veloce, affidabile e facile da configurare. In questo tutorial, imparerai come configurare Nginx come reverse proxy per un'applicazione backend che gira sullo stesso server.
Cos'è un reverse proxy?
Un reverse proxy è un server che:
- Accetta richieste dai client (browser, API, ecc.)
- Inoltra quelle richieste a un'applicazione backend
- Invia la risposta del backend al client
Il client non comunica mai direttamente con l'applicazione backend.
Reverse proxy vs accesso diretto
Senza un reverse proxy:
Client ---> Applicazione backend (porta 3000)
Con un reverse proxy:
Client ---> Nginx (porta 80, 443) ---> Applicazione backend (porta 3000)
Perché usare Nginx come reverse proxy?
Usare Nginx davanti alla tua applicazione ti permette di:
- Esporre solo le porte 80/443 a internet
- Nascondere i servizi backend dall'accesso diretto
- Terminare HTTPS (TLS) in un unico punto
- Aggiungere logging, controllo degli accessi e limitazione della velocità
- Eseguire più applicazioni su un server
Per gli amministratori di sistema, questo significa maggiore sicurezza e gestione più semplice.
Scenario utilizzato in questo tutorial
Per mantenere le cose semplici, useremo il seguente setup:
- Nginx ascolta sulla porta
80 - L'applicazione backend ascolta su
127.0.0.1:3000 - Le richieste a
http://example.comsono inoltrate al backend
Diagramma del flusso di traffico
[ Browser ] | v [ Nginx example.com:80,443 ] | v [ Applicazione backend 127.0.0.1:3000 ]
Prerequisiti
Prima di iniziare, assicurati di avere:
- Un server Linux con l'ultima versione stabile di Debian
- Accesso root o sudo
- Un'applicazione backend già in esecuzione (ad esempio, un'app Node.js, Python o Java)
- Familiarità di base con il terminale Linux
Installa Nginx
Aggiorna le liste dei pacchetti e installa Nginx e curl (per testare la configurazione):
sudo apt update
sudo apt install nginx curl
Verifica che Nginx sia in esecuzione:
systemctl status nginx
Dovresti vedere "active (running)" nell'output.
Testa Nginx localmente:
curl http://localhost
Se Nginx funziona, riceverai la pagina di benvenuto predefinita.
Comprendere la struttura della configurazione di Nginx
I file di configurazione di Nginx sono solitamente memorizzati in /etc/nginx/. Directory importanti:
/etc/nginx/nginx.conf— file di configurazione principale/etc/nginx/sites-available/— file di configurazione dei siti (non attivi)/etc/nginx/sites-enabled/— configurazioni dei siti abilitate (collegamenti simbolici)
Nginx legge i file di configurazione dalla cartella sites-enabled, non direttamente da sites-available. È consigliato creare file di configurazione dei siti in sites-available e poi creare collegamenti simbolici a essi in sites-enabled.
Crea una configurazione di reverse proxy
Crea un nuovo file del sito
sudo nano /etc/nginx/sites-available/reverse-proxy.conf
Aggiungi la configurazione del reverse proxy
server { listen 80; server_name example.com; location / { proxy_pass http://127.0.0.1:3000; 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 $scheme; } }
Comprendere la configurazione
Blocco server
server { listen 80; server_name example.com; }
listen 80;— Nginx ascolta il traffico HTTP sulla porta 80server_name example.com;— nome di dominio a cui risponde questo blocco server
Blocco location
location / { proxy_pass http://127.0.0.1:3000; 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 $scheme; }
location /— corrisponde a tutti gli URL in arrivoproxy_pass— inoltra le richieste all'applicazione backend
Intestazioni proxy
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 $scheme;
Queste intestazioni assicurano che il backend sappia:
- Il nome di dominio originale
- L'indirizzo IP reale del client
- Se la richiesta era HTTP o HTTPS
Senza queste intestazioni, le applicazioni backend potrebbero registrare informazioni errate sui client.
Abilita la configurazione
Disabilita il sito predefinito di Nginx per evitare conflitti sulla porta 80:
sudo rm /etc/nginx/sites-enabled/default
Crea un collegamento simbolico per abilitare il sito:
sudo ln -s /etc/nginx/sites-available/reverse-proxy.conf /etc/nginx/sites-enabled/
Testa la configurazione per errori di sintassi:
sudo nginx -t
Se il test ha successo, ricarica Nginx:
sudo systemctl reload nginx
Testa il reverse proxy
Testa dal server:
curl http://example.com
Apri http://example.com in un browser per testare. Dovresti ricevere una risposta dalla tua applicazione backend, non dalla pagina predefinita di Nginx. Se tutto è configurato correttamente, l'applicazione backend si caricherà.
Come viene elaborata la richiesta
- Il client invia una richiesta a example.com
- Nginx riceve la richiesta sulla porta 80
- Nginx inoltra la richiesta a 127.0.0.1:3000
- Il backend elabora la richiesta
- La risposta torna attraverso Nginx
- Il client riceve la risposta
Errori comuni e risoluzione dei problemi
Backend non in esecuzione
- Assicurati che l'applicazione sia in esecuzione
- Conferma la porta corretta
ss -tuln | grep 3000
Indirizzo proxy_pass errato
- Includi sempre
http:// - Assicurati che l'IP e la porta siano corretti
Dimenticare di ricaricare Nginx
Dopo ogni modifica alla configurazione:
sudo systemctl reload nginx
Firewall che blocca l'accesso
Assicurati che la porta 80 sia aperta:
sudo ufw allow 80
Miglioramenti opzionali
Una volta che il reverse proxy funziona, considera di:
- Abilitare HTTPS con Let's Encrypt
- Eseguire più applicazioni backend
- Aggiungere log di accesso e log di errore
- Configurare il bilanciamento del carico
- Supportare le connessioni WebSocket
Configurazione HTTPS
Negli ambienti di produzione, dovresti sempre usare HTTPS invece di HTTP. HTTPS cripta il traffico tra il client e il tuo server, proteggendo password, token API, cookie e altri dati sensibili. Nginx supporta HTTPS utilizzando certificati SSL/TLS. In questa sezione, imparerai:
- Cos'è Certbot
- Come installare Certbot
- Come Certbot modifica automaticamente la configurazione di Nginx
- Come configurare manualmente Nginx utilizzando un certificato acquistato
Cos'è Certbot?
Certbot è uno strumento che ottiene e installa automaticamente certificati SSL/TLS gratuiti da Let's Encrypt. Può:
- Richiedere un certificato gratuito
- Verificare la proprietà del dominio
- Configurare automaticamente Nginx
- Impostare il rinnovo automatico del certificato
Per i principianti e la maggior parte degli ambienti di produzione, Certbot è il modo più semplice e sicuro per abilitare HTTPS.
Installazione di Certbot
Aggiorna le liste dei pacchetti:
sudo apt update
Installa Certbot e il plugin Nginx:
sudo apt install certbot python3-certbot-nginx
Il pacchetto python3-certbot-nginx permette a Certbot di modificare automaticamente la configurazione di Nginx.
Ottenere e installare un certificato
Prima di eseguire Certbot, assicurati che:
- Il tuo nome di dominio punti all'indirizzo IP pubblico del tuo server
- Nginx sia in esecuzione
- Le porte 80 e 443 siano aperte nel firewall
Esegui:
sudo certbot --nginx
Certbot:
- Chiederà quale dominio vuoi proteggere
- Verificherà la proprietà del dominio
- Aggiornerà automaticamente la configurazione di Nginx
- Ricaricherà Nginx
Certbot modifica automaticamente la configurazione di Nginx. Tipicamente aggiunge un nuovo blocco server per la porta 443 (HTTPS), aggiunge i percorsi dei certificati SSL, configura un reindirizzamento da HTTP a HTTPS se scegli questa opzione, e aggiunge impostazioni SSL raccomandate.
Esempio di configurazione aggiunta da Certbot:
server { listen 443 ssl; server_name example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; location / { proxy_pass http://127.0.0.1:3000; 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 $scheme; } }
Certbot può anche modificare il blocco HTTP per reindirizzare il traffico:
server { listen 80; server_name example.com; return 301 https://$host$request_uri; }
Poiché Certbot modifica i file di configurazione automaticamente, è consigliato:
- Mantenere backup della tua configurazione
- Comprendere quali modifiche sono state fatte
- Testare sempre la configurazione dopo le modifiche
Testa la configurazione:
sudo nginx -t
Rinnovo automatico del certificato
I certificati di Let's Encrypt sono validi per 90 giorni. Certbot installa automaticamente un timer di rinnovo. Puoi testare il rinnovo con:
sudo certbot renew --dry-run
Se configurato correttamente, il rinnovo avverrà automaticamente senza tempi di inattività.
Utilizzo di un certificato SSL acquistato
Se acquisti un certificato SSL da un'autorità di certificazione (CA), devi configurare Nginx manualmente. Dopo l'acquisto, di solito ricevi:
- Un file di certificato (es.
example.com.crt) - Una chiave privata (
example.com.key) - Un file di bundle CA (
ca_bundle.crt)
Crea una directory sicura:
sudo mkdir -p /etc/nginx/ssl
sudo chmod 700 /etc/nginx/ssl
Copia i tuoi file di certificato in questa directory.
Esempio di configurazione HTTPS con un certificato acquistato:
server { listen 443 ssl; server_name example.com www.example.com; ssl_certificate /etc/nginx/ssl/example.com.crt; ssl_certificate_key /etc/nginx/ssl/example.com.key; ssl_trusted_certificate /etc/nginx/ssl/ca_bundle.crt; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; location / { proxy_pass http://127.0.0.1:3000; 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 $scheme; } }
Aggiungi il reindirizzamento da HTTP a HTTPS:
server { listen 80; server_name example.com www.example.com; return 301 https://$host$request_uri; }
Ricarica Nginx dopo la configurazione manuale:
sudo nginx -t
sudo systemctl reload nginx
Per i novizi amministratori di sistema, Certbot è fortemente raccomandato a meno che la tua organizzazione richieda certificati commerciali.
Riepilogo
In questo tutorial, hai imparato:
- Cos'è un reverse proxy e perché è utile
- Come Nginx inoltra le richieste alle applicazioni backend
- Come creare e abilitare una configurazione di reverse proxy
- Come testare e risolvere problemi comuni
- Come configurare HTTPS
Il reverse proxying con Nginx è una competenza fondamentale per gli amministratori di sistema ed è ampiamente utilizzato negli ambienti di produzione.