Configurazione di Nginx come reverse proxy per applicazioni backend | INTROSERV
EUR
european

EUR

usa

USD

Italy It
Ex. VAT Ex. VAT 0%

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.com sono 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 80
  • server_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 arrivo
  • proxy_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

  1. Il client invia una richiesta a example.com
  2. Nginx riceve la richiesta sulla porta 80
  3. Nginx inoltra la richiesta a 127.0.0.1:3000
  4. Il backend elabora la richiesta
  5. La risposta torna attraverso Nginx
  6. 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:

  1. Chiederà quale dominio vuoi proteggere
  2. Verificherà la proprietà del dominio
  3. Aggiornerà automaticamente la configurazione di Nginx
  4. Ricaricherà Nginx

Info

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

Tip

Per i novizi amministratori di sistema, Certbot è fortemente raccomandato a meno che la tua organizzazione richieda certificati commerciali.

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.

VAT

  • Other

    Ex. VAT

    0%
  • austria

    Austria

    20%
  • Belgium

    Belgium

    21%
  • Bulgaria

    Bulgaria

    20%
  • Croatia

    Croatia

    25%
  • Cyprus

    Cyprus

    19%
  • Czech Republic

    Czech Republic

    21%
  • Denmark

    Denmark

    25%
  • Estonia

    Estonia

    22%
  • France

    France

    20%
  • Finland

    Finland

    24%
  • Germany

    Germany

    19%
  • Greece

    Greece

    24%
  • Hungary

    Hungary

    27%
  • Ireland

    Ireland

    23%
  • Italy

    Italy

    22%
  • Latvia

    Latvia

    21%
  • Lithuania

    Lithuania

    21%
  • Luxembourg

    Luxembourg

    17%
  • Malta

    Malta

    18%
  • Netherlands

    Netherlands

    21%
  • Poland

    Poland

    23%
  • Portugal

    Portugal

    23%
  • Romania

    Romania

    19%
  • Slovakia

    Slovakia

    20%
  • Slovenia

    Slovenia

    22%
  • Spain

    Spain

    21%
  • Sweden

    Sweden

    25%
  • USA

    USA

    0%
european
states
  • germany
  • Español
  • Italiano
  • Poland
  • Русский
  • Slovenski
  • Türkçe
  • ukraine
  • kingdom
  • French
  • Hrvatska
  • Other
  • Austria
  • Belgium
  • Bulgaria
  • Croatia
  • Cyprus
  • Czech Republic
  • Denmark
  • Estonia
  • Finland
  • France
  • Germany
  • Greece
  • Hungary
  • Ireland
  • Italy
  • Latvia
  • Lithuania
  • Luxembourg
  • Malta
  • Netherlands
  • Poland
  • Portugal
  • Romania
  • Slovakia
  • Slovenia
  • Spain
  • Sweden
  • USA