Continuiamo questa serie di articoli sul mondo dei Server Proxy: dopo aver scoperto cosa sono, come funzionano e a cosa servono in Server Proxy, e dopo aver visto quali sono i migliori software attualmente disponibili, adesso vediamo come configurare Nginx come Reverse Proxy su Linux.
Come visto nel precedente articolo, Nginx è il più utilizzato Web Server sul Web ed è molto diffuso anche come Reverse Proxy, ad esempio per Apache. Nginx ha infatti dalla sua una grande velocità, specie nel servire i file statici, può essere usato come Load Balancer in condizioni di alto traffico, offre funzioni di SSL Terminator, ed infatti spesso funge da Reverse Proxy per Varnish ed è utile anche nel mitigare eventuali attacchi DDoS, grazie alle funzionalità avanzate di filtraggio in base agli indirizzi IP o all’user agent.
Ricapitoliamo brevemente, per chi si fosse perso l’articolo, il funzionamento di un Reverse Proxy.
Un Reverse Proxy è un software che funge da intermediario tra i Client e il Web Server, interponendosi tra di essi. Quando un Client invia una richiesta ad un server, per ottenere ad esempio una pagina web, la richiesta verrà intercettata dal Reverse Proxy, che provvederà a sua volta ad inoltrarla al Web Server (il Reverse Proxy, quindi, funge da Client). Una volta che la richiesta viene elaborate dal Web Server, questi la passerà nuovamente al Reverse Proxy che gliel’ha inviata, e il Reverse Proxy a sua volta la inoltrerà al Client originario. Il vantaggio di questa architettura è quella di garantire una maggiore sicurezza al Web Server, oppure gestire situazioni di alto traffico mediante Load Balancer, oppure dotare di supporto SSL/TLS un’applicazione che non ne è dotata nativamente (come ad esempio Varnish).
Vediamo quindi come impostare Nginx come Reverse Proxy su Ubuntu 20.04 LTS.
Hai un problema sul tuo server Linux?
Scopri cosa possiamo fare per te.
Installare Nginx su Ubuntu 20.04 LTS
La fase di installazione è decisamente molto semplice: Nginx è disponibile nei repository ufficiali di Ubuntu ed è quindi possibile installarlo con grande facilità. Vediamo la procedura in dettaglio:
Cominciamo con l’aggiornamento del sistema, qualora fosse necessario:
sudo apt update
passiamo quindi all’installazione vera e propria con il comando
apt install nginx
poco dopo avremo un output simile al seguente:
nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2021-05-10 12:34:21 CET;
Utilizzare Nginx come Reverse Proxy
Andiamo ad editare il file di configurazione di Nginx, che si chiama nginx.conf e solitamente si trova nelle directory /usr/local/nginx/conf
, /etc/nginx
, oppure /usr/local/etc/nginx
.
Verifichiamo in quale delle directory sopra indicate si trova il nostro file, quindi apriamolo, ad esempio con nano, lanciando il seguente comando:
sudo nano nginx.conf
a questo punto dobbiamo inserire nel blocco server
una direttiva dove andrà specificata una posizione e un server proxy. Per usare Nginx come reverse proxy basta infatti specificare queste due direttive:
server {
listen 80;
server_name www.example.com example.com;
location /mia_location {
proxy_pass http://127.0.0.1:8080;
}
}
Come possiamo vedere l’URL del server proxy va indicato con la direttiva proxy_pass
, seguita da indirizzo IP + porta o anche da un nome di dominio, ed è possibile utilizzare i protocolli HTTP o HTTPS.
Nel nostro caso stiamo impostando l’inoltro di tutte le richieste alla posizione /mia_location
al server proxy che si trova all’indirizzo http://127.0.0.1:8080
Cosa succede quando un utente richiede un url che include la posizione indicata nel file? Ad esempio se scriveremo sul browser
http://example.com/mia_location/pagina1.html
Nginx eseguirà il proxy di questa richiesta
http://127.0.0.1:8080/pagina1.html
Quindi, ogni volta che un Client richiede al Server una risorsa che si trova all’indirizzo /mia_location
, Nginx provvederà ad inoltrare la richiesta al server http://127.0.0.1:8080
e restituendo il risultato al Client.
Se chiedessimo al server la seguente risorsa: /mia_location/sub_dir1/pagina1.html
il server Nginx richiderà al server specificato nella direttiva proxy_pass
la seguente risorsa: http://127.0.0.1:8080/sub_dir1/pagina1.html.
In questo caso, come evidente, abbiamo utilizzato come proxy_pass
una risorsa interna, ovvero localhost
, ma niente vieta di utilizzare anche un server esterno.
Facciamo un altro esempio, immaginando di voler utilizzare il nostro proxy per intercettare e reindirizzare tutte le richieste che arrivano alla posizione blog
.
server {
listen 80;
server_name www.example.com example.com;
location /blog {
proxy_pass http://myserver.com:8000/articoli/;
}
}
Se richiediamo tramite browser la pagina http://example.com/blog/articolo1
Nginx eseguirà il proxy di questa richiesta al seguente indirizzo: http://myserver.com:8000/articoli/articolo1
Vediamo quindi che se la direttiva proxy_pass
contiene un URL come in questo caso (articoli) allora quando viene passata una richiesta contenente l’URL specificato nella direttiva location
esso verrà sostituito con l’ URL impostato nella direttiva proxy_pass
. Se invece l’indirizzo del Server Proxy non contiene un URL, allora l’URL della richiesta completa verrà passato al Proxy.
Gestione degli Headers
Tra i grandi vantaggi nell’utilizzo di un Server Proxy vi è quello della gestione degli Headers della richiesta. Tale funzione permette di personalizzare le intestazioni che dal Client dovranno arrivare al Web Server che si trova dietro il Reverse Proxy Nginx.
Di default NGINX ridefinisce due campi di intestazione nelle richieste proxy, “Host
” e “Connection
“, ed elimina i campi di intestazione i cui valori sono stringhe vuote.
Buffering
Di default Nginx utilizza un sistema di buffering per memorizzare le risposte ricevute dal Server che dovranno essere poi reindirizzate ai Client che ne avevano fatto richiesta. Questa funzione è molto utile per migliorare le prestazioni quando le richieste arrivano da Client lenti, ma di contro può portare ad un aumento della latenza percepita dai Client nella risposta del Server e va quindi utilizzata con attenzione. Le direttive che vanno specificate sono proxy_buffers
e proxy_buffers_size
, ad esempio:
server {
listen 80;
server_name www.example.com example.com;
location /blog {
proxy_buffers 8 4k;
proxy_buffer_size 2k;
proxy_pass http://www.example.com/link/;
proxy_pass http://myserver.com:8000/articoli/;
}
}
In questo esempio le risorse indirizzate a /blog impiegheranno fino ad 8 buffer ognuno da 4Kb ed un buffer da 2k per gli headers.
Hai bisogno di assistenza tecnica sul tuo server Linux?
Scopri cosa possiamo fare per te.
Configurare Nginx su Server Proxy non HTTP
Nginx è molto versatile e consente il suo utilizzo come Reverse Proxy anche verso tipi di Server diversi da quelli HTTP: possiamo quindi usare questo fantastico software per mettere in piedi un Reverse Proxy anche per altre applicazioni, come ad esempio sistemi di gestione della Cache come Memcached oppure su applicazioni che utilizzano il protocollo FastCGI, usando le seguenti direttive:
fastcgi_pass
per il protocollo FastCGI;
memcached_pass
per Memcached;
uno scenario comune, infatti, prevede che Nginx sia utilizzato come Reverse Proxy per PHP-FPM, in sostituzione del “vecchio” FastCGI.
server {
listen 80;
server_name www.example.com example.com;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
}
}
In questo caso tutte le richieste che coinvolgono file con estensione .php
verranno passate al server PHP-FPM che provvederà ad eseguirle.
Bene, per adesso è tutto. In un prossimo articolo vedremo un caso concreto e molto comune che consiste nell’impostare Nginx come Reverse Proxy per Apache.