Un reverse proxy Nginx riceve le richieste dei visitatori di un sito web e le inoltra a un altro server o a un’applicazione. Viene comunemente usato per rendere accessibili tramite un nome di dominio le applicazioni in esecuzione su porte come la 3000, senza esporre le loro porte interne a Internet.
In questa guida configurerai Nginx su Ubuntu per inoltrare le richieste a un’applicazione locale, collegare un dominio e abilitare HTTPS.
Che cos’è un reverse proxy Nginx?
Un reverse proxy si colloca tra i visitatori e la tua applicazione backend.
Invece di connettersi direttamente a un’applicazione in esecuzione sulla porta 3000, i visitatori si connettono a Nginx sulle porte standard HTTP o HTTPS.
Nginx inoltra la richiesta all’applicazione e ne restituisce la risposta.
Il flusso delle richieste è il seguente:
Visitatore → Nginx → Applicazione backend
Questa configurazione è comunemente usata per Node.js, Python e altre applicazioni web. Può inoltre supportare la terminazione TLS, il bilanciamento del carico e la gestione centralizzata delle richieste.
Prerequisiti
Prima di iniziare, ti serviranno:
- Un server Ubuntu 24.04 LTS con accesso sudo.
- Accesso SSH al server.
- Un nome di dominio che punti all’indirizzo IP pubblico del server.
- Un’applicazione backend in ascolto su una porta locale.
In questo esempio useremo la porta 3000.
Se non hai familiarità con SSH, leggi la nostra guida introduttiva ai comandi SSH prima di proseguire.

Passaggio 1: installa Nginx su Ubuntu
Connettiti al tuo server Ubuntu tramite SSH.
Aggiorna l’indice dei pacchetti e installa Nginx:
sudo apt update
sudo apt install nginx -y
Verifica se Nginx è in esecuzione:
sudo systemctl status nginx
Dovresti vedere active (running).
Se Nginx non è avviato, esegui:
sudo systemctl enable --now nginx
Puoi anche aprire l’indirizzo IP pubblico del server in un browser. Se l’accesso HTTP è consentito, dovrebbe comparire la pagina di benvenuto predefinita di Nginx.
Se usi UFW, consenti il traffico HTTP e HTTPS:
sudo ufw allow 'Nginx Full'
Controlla anche le regole del firewall configurate presso il tuo provider di hosting. Non disabilitare il firewall per rendere accessibile Nginx.
Passaggio 2: avvia un’applicazione backend di prova
Prima di configurare il reverse proxy, ci serve un’applicazione a cui Nginx possa inoltrare le richieste.
Per una semplice prova, crea una directory temporanea:
mkdir -p ~/nginx-proxy-test
cd ~/nginx-proxy-test
Crea una pagina HTML di base:
echo '<h1>Nginx Reverse Proxy Works!</h1>' > index.html
Ora avvia il server HTTP integrato di Python:
python3 -m http.server 3000 --bind 127.0.0.1
In questo modo, la pagina di prova viene servita sulla porta 3000 ed è accessibile solo tramite l’indirizzo di loopback locale.
Lascia aperto questo terminale e avvia una seconda sessione SSH.
Verifica che l’applicazione risponda:
curl http://127.0.0.1:3000
Dovresti vedere:
<h1>Nginx Reverse Proxy Works!</h1>
Questo server Python è solo a scopo dimostrativo. Per un’applicazione in produzione, usa il server applicativo e la configurazione di gestione del servizio consigliati per quell’applicazione.
Passaggio 3: crea una configurazione per il reverse proxy Nginx
Crea un nuovo blocco server di Nginx:
sudo nano /etc/nginx/sites-available/app.example.com
Sostituisci app.example.com con il tuo dominio effettivo.
Aggiungi la seguente configurazione:
server {
listen 80;
server_name app.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;
}
}
Salva il file.
Come funziona la configurazione
listen 80accetta le richieste HTTP.server_namespecifica il dominio che Nginx deve gestire.proxy_passinoltra le richieste all’applicazione sulla porta 3000.proxy_set_headertrasmette al backend informazioni utili sulla richiesta originale.
Il backend deve interpretare e gestire in modo sicuro gli header inoltrati. Configura le applicazioni in modo che si fidino di questi header solo quando le richieste arrivano tramite il tuo proxy attendibile.
Passaggio 4: abilita e verifica la configurazione
Abilita il nuovo blocco server:
sudo ln -s /etc/nginx/sites-available/app.example.com /etc/nginx/sites-enabled/
Se il collegamento esiste già, non ricrearlo.
Controlla che la configurazione non contenga errori:
sudo nginx -t
Se il controllo va a buon fine, ricarica Nginx:
sudo systemctl reload nginx
Ora apri:
http://app.example.com
Se il DNS punta al server corretto e il backend di prova è ancora in esecuzione, dovresti vedere:
Nginx Reverse Proxy Works!
Se invece compare la pagina predefinita di Nginx, controlla i record DNS del dominio e la configurazione di server_name.
Passaggio 5: abilita HTTPS con Let’s Encrypt
Per un sito web pubblico, usa HTTPS anziché lasciare il traffico non crittografato.
Per prima cosa, verifica che il dominio si risolva nell’indirizzo del server corretto e che la porta 80 sia accessibile dall’esterno. Questi requisiti sono importanti per la procedura standard di convalida del certificato tramite HTTP.
Installa Certbot con il metodo ufficiale basato su Snap:
sudo snap install --classic certbot
Se il comando certbot non è già disponibile, crea il collegamento al comando:
sudo ln -s /snap/bin/certbot /usr/local/bin/certbot
Quindi richiedi un certificato:
sudo certbot --nginx -d app.example.com
Segui le istruzioni visualizzate. Certbot può ottenere un certificato e configurare Nginx per servire il tuo dominio tramite HTTPS.
Al termine, verifica il rinnovo del certificato:
sudo certbot renew --dry-run
Visita:
https://app.example.com
La tua applicazione di prova dovrebbe ora caricarsi tramite una connessione crittografata.
Passaggio 6: verifica il reverse proxy
Controlla la risposta HTTPS:
curl -I https://app.example.com
Per il backend Python dell’esempio, una risposta HTTP 200 OK indica che la richiesta ha raggiunto correttamente l’applicazione.
Puoi anche controllare quali processi sono in ascolto sul server:
sudo ss -ltnp
La tua installazione di Nginx dovrebbe essere in ascolto sulle porte pubbliche HTTP e HTTPS configurate, mentre il backend dell’esempio è in ascolto su 127.0.0.1:3000.
Ricorda che il server Python temporaneo si fermerà quando chiuderai la relativa sessione del terminale. Le applicazioni in produzione dovrebbero essere eseguite sotto la supervisione di un gestore dei processi come systemd.
Problemi comuni con i reverse proxy Nginx
502 Bad Gateway
Di solito significa che Nginx non è riuscito a ricevere una risposta valida dal backend.
Controlla che l’applicazione sia in esecuzione e che la porta indicata in proxy_pass sia corretta.
La nostra guida alla risoluzione dell’errore 502 Bad Gateway in Nginx approfondisce i log, i servizi upstream e i problemi di connessione.
504 Gateway Timeout
Un errore 504 si verifica quando il gateway non riceve in tempo la risposta richiesta dal server upstream.
Esamina le richieste lente dell’applicazione e le prestazioni del backend prima di aumentare i timeout.
Consulta la nostra guida alla risoluzione dell’errore 504 Gateway Timeout per ulteriori istruzioni.
Il dominio non si carica
Controlla che il record A del dominio punti all’indirizzo IP pubblico corretto, che le porte necessarie siano aperte nel firewall e che il blocco server di Nginx corrisponda al nome host richiesto.
Domande frequenti
proxy_pass indica a Nginx dove inoltrare le richieste, per esempio a un’applicazione HTTP in esecuzione su 127.0.0.1:3000.
Sì. Puoi configurare domini, sottodomini o percorsi URL distinti per inoltrare le richieste a diverse applicazioni backend.
No. Puoi testare un reverse proxy con un indirizzo IP o in locale. Tuttavia, un dominio semplifica l’hosting pubblico e l’ottenimento di un certificato HTTPS standard.
Sì. La versione open source di Nginx supporta la funzionalità di reverse proxy senza richiedere una licenza commerciale.
Conclusione
Hai configurato un reverse proxy Nginx su Ubuntu, inoltrato le richieste a un’applicazione locale e abilitato HTTPS.
La stessa configurazione di base può essere adattata a Node.js, Python e altre applicazioni basate su HTTP aggiornando l’indirizzo del backend in proxy_pass.
Prima di usare questa configurazione in produzione, assicurati che l’applicazione si avvii automaticamente, venga eseguita con autorizzazioni adeguate e disponga di strumenti sufficienti per il monitoraggio e di misure di sicurezza adeguate.