Introduzione
Un proxy inverso è un servizio che accetta una richiesta client, invia la richiesta a uno o più server proxy, recupera la risposta e consegna la risposta del server al client.
A causa delle sue prestazioni e scalabilità, NGINX viene spesso utilizzato come proxy inverso per server HTTP e non HTTP. Una tipica configurazione del proxy inverso consiste nell'utilizzare Nginx davanti alle applicazioni Node.js, Python o Java.
L'uso di Nginx come proxy inverso offre numerosi vantaggi aggiuntivi:
- Bilanciamento del carico: Nginx può eseguire il bilanciamento del carico per distribuire le richieste dei client su server proxy, migliorando le prestazioni, la scalabilità e l'affidabilità.
- Memorizzazione nella cache: con Nginx come proxy inverso, è possibile memorizzare nella cache le versioni pre-renderizzate delle pagine per accelerare i tempi di caricamento delle pagine. Funziona memorizzando nella cache il contenuto ricevuto dalle risposte dei server proxy e utilizzandolo per rispondere ai client senza dover contattare il server proxy per lo stesso contenuto ogni volta.
- Terminazione SSL: Nginx può fungere da endpoint SSL per le connessioni con i client. Gestirà e decrittograferà le connessioni SSL in entrata e crittograferà le risposte del server proxy.
- Compressione: se il server proxy non invia risposte compresse, è possibile configurare Nginx per comprimere le risposte prima di inviarle ai client.
- Attenuazione degli attacchi DDoS: è possibile limitare le richieste in arrivo e il numero di connessioni per singolo indirizzo IP a un valore tipico per gli utenti normali. Nginx consente inoltre di bloccare o limitare l'accesso in base alla posizione del client e al valore delle intestazioni della richiesta come "User-Agent" e "Referer".
Questo articolo descrive i passaggi necessari per la configurazione di Nginx come Reverse Proxy.
Prerequisiti
Supponiamo che tu abbia Nginx installato sul tuo server Ubuntu, CentOS o Debian.
Utilizzare Nginx come Reverse Proxy
Per configurare Nginx come proxy inverso a un server HTTP, aprire il file di configurazione del blocco server del dominio e specificare una posizione e un server proxy al suo interno:
server {
listen 80;
server_name www.example.com example.com;
location /app {
proxy_pass http://127.0.0.1:8080;
}
}
L'URL del server proxy viene impostato utilizzando la direttiva proxy_pass
e può utilizzare HTTP
o HTTPS
come protocollo, nome di dominio o indirizzo IP e una porta e URI opzionali come indirizzo.
La configurazione sopra dice a Nginx di passare tutte le richieste alla posizione /app
al server proxy su http://127.0.0.1:8080
.
Nelle distribuzioni basate su Ubuntu e Debian, i file dei blocchi server sono memorizzati nella directory /etc/nginx/sites-available
, mentre su CentOS nella directory /etc/nginx/conf.d
.
Per illustrare meglio il funzionamento delle direttive location
e proxy_pass
, prendiamo il seguente esempio:
server {
listen 80;
server_name www.example.com example.com;
location /blog {
proxy_pass http://node1.com:8000/wordpress/;
}
}
Se un visitatore accede a http://example.com/blog/my-post
, Nginx eseguirà il proxy di questa richiesta http://node1.com:8000/wordpress/my-post
.
Quando l'indirizzo del server proxy contiene un URI, ( /wordpress/
), l'URI di richiesta che viene passato al server proxy viene sostituito da un URI specificato nella direttiva. Se l'indirizzo del server proxy viene specificato senza un URI, l'URI della richiesta completa viene passato al server proxy.
Gestire gli Headers
Per regolare o impostare le intestazioni per le connessioni proxy, utilizzare la direttiva proxy_set_header
, seguita dal valore dell'intestazione. Puoi trovare un elenco di tutti gli headers di richiesta disponibili e i loro valori consentiti qui . Se si desidera impedire che un header venga passato al server proxy, impostarla su una stringa vuota ""
.
Nel seguente esempio, stiamo modificando il valore del campo Host
di intestazione in $host
e rimuovendo il campo Accept-Encoding
di intestazione impostando il suo valore su una stringa vuota.
location / {
proxy_set_header Host $host;
proxy_set_header Accept-Encoding "";
proxy_pass http://localhost:3000;
}
Ogni volta che si modifica il file di configurazione, è necessario riavviare il servizio Nginx per rendere effettive le modifiche.
Configurare Nginx su un server proxy non HTTP
Per configurare Nginx come proxy inverso a un server proxy non HTTP, è possibile utilizzare le seguenti direttive:
fastcgi_pass
- proxy inverso a un server FastCGI.uwsgi_pass
- proxy inverso a un server uwsgi.scgi_pass
- proxy inverso a un server SCGI.memcached_pass
- proxy inverso a un server Memcached .
Uno degli esempi più comuni è usare Nginx come proxy inverso a PHP-FPM :
server {
# ... altre configurazioni
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
}
}
Opzioni di proxy inverso Nginx
La pubblicazione di contenuti su HTTPS è diventata uno standard al giorno d'oggi. In questa sezione, forniremo un esempio di configurazione del proxy inverso Nginx HTTPS, inclusi i parametri e le intestazioni del proxy Nginx consigliati.
location/ {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_cache_bypass $http_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
}
proxy_http_version 1.1
- Definisce la versione del protocollo HTTP per il proxy, per impostazione predefinita è impostata su 1.0. Per Websocket e connessionikeepalive
è necessario utilizzare la versione 1.1.proxy_cache_bypass $http_upgrade
- Imposta le condizioni alle quali la risposta non verrà prelevata da una cache.Upgrade $http_upgrade
eConnection "upgrade"
- Questi campi di intestazione sono obbligatori se l'applicazione utilizza Websocket.Host $host
- La variabile$host
nel seguente ordine di precedenza contiene: nome host dalla riga della richiesta o nome host dal campoHost
dell'intestazione della richiesta o il nome del server corrispondente a una richiesta.X-Real-IP $remote_addr
- Inoltra l'indirizzo IP remoto del visitatore reale al server proxy.X-Forwarded-For $proxy_add_x_forwarded_for
- Un elenco contenente gli indirizzi IP di ogni server attraverso il quale è stato inviato il proxy.X-Forwarded-Proto $scheme
- Se utilizzato all'interno di un blocco server HTTPS, ogni risposta HTTP dal server proxy viene riscritta in HTTPS.X-Forwarded-Host $host
- Definisce l'host originale richiesto dal client.X-Forwarded-Port $server_port
- Definisce la porta originale richiesta dal client.
Conclusione
In questo tutorial abbiamo visto come configuare Nginx come Reverse Proxy. Aabbiamo anche mostrato come passare parametri aggiuntivi al server e come modificare e impostare diversi campi di intestazione nelle richieste proxy.
Leggere questi articoli per imparare a configurare Nginx come Reverse Proxy di Apache 2.