Questo tutorial mostra come configurare nginx come proxy inverso davanti a un server Web Apache2 su Ubuntu 16.04. nginx (pronunciato "engine x") è un server HTTP gratuito, open source e ad alte prestazioni. nginx è noto per la sua stabilità, il ricco set di funzionalità, la configurazione semplice e il basso consumo di risorse.
1 Nota preliminare
In questo tutorial, utilizzo il nome host server1.example.com con l'indirizzo IP 192.168.1.100. Queste impostazioni potrebbero differire per te, quindi devi sostituirle dove appropriato.
Suppongo che tu abbia un vhost Apache esistente (in questo tutorial userò il vhost predefinito di Apache) che è in ascolto sulla porta 80 sull'indirizzo IP 192.168.1.100 che desideri eseguire il proxy tramite nginx. Userò il tutorial di Ubuntu LAMP come base. Tieni presente che questo tutorial copre solo http, non https (SSL).
2 Configurazione di Apache
La prima cosa che dobbiamo fare è configurare il nostro vhost Apache in ascolto su localhost (127.0.0.1) su una porta inutilizzata diversa da 80 (es. 8000). Apri /etc/apache2/ports.conf...
nano /etc/apache2/ports.conf
... e modifica le righe NameVirtualHost e Listen per la porta 80 per utilizzare la porta 8000:
# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default.conf
Listen 8000
<IfModule ssl_module>
Listen 443
</IfModule>
<IfModule mod_gnutls.c>
Listen 443
</IfModule>
Quindi apri il file di configurazione di vhost (ad es. /etc/apache2/sites-available/000-default.conf)...
nano /etc/apache2/sites-available/000-default.conf
... e modificare la riga
<VirtualHost 127.0.0.1:8000> [...]
Configureremo nginx come proxy trasparente, ovvero passerà l'indirizzo IP dell'utente originale in un campo chiamato X-Forwarded-For al backend Apache. Naturalmente, il back-end Apache dovrebbe registrare l'indirizzo IP dell'utente originale nei loro log di accesso invece dell'indirizzo IP di nginx (127.0.0.1). Ci sono due modi per raggiungere questo obiettivo:
1) Possiamo modificare la riga LogFormat in /etc/apache2/apache2.conf e sostituire %h con %{X-Forwarded-For}i:
nano /etc/apache2/apache2.conf
[...] #LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined [...]
2) Su Debian/Ubuntu, possiamo installare il modulo Apache libapache2-mod-rpaf che si occupa di registrare l'indirizzo IP corretto:
apt-get -y install libapache2-mod-rpaf
Dopo tutte queste modifiche, riavvia Apache:
service apache2 restart
3 Configurazione di nginx
Se nginx non è già installato, installalo come segue:
apt-get -y install nginx
Crea i suoi collegamenti di avvio del sistema e assicurati che sia avviato:
systemctl enable nginx.service
service nginx restart
Ora dovrebbe essere in ascolto sulla porta 80.
Alcuni parametri proxy standard si trovano nel file /etc/nginx/proxy_params:
nano /etc/nginx/proxy_params
proxy_set_header Host $http_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;
Poiché includeremo quel file in seguito nella parte proxy del nostro nginx vhost per esempio.com, potresti voler aggiungere ulteriori direttive proxy a quel file se lo desideri, ad es. come segue:
proxy_set_header Host $http_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; client_max_body_size 100M; client_body_buffer_size 1m; proxy_intercept_errors on; proxy_buffering on; proxy_buffer_size 128k; proxy_buffers 256 16k; proxy_busy_buffers_size 256k; proxy_temp_file_write_size 256k; proxy_max_temp_file_size 0; proxy_read_timeout 300;
Ora modifica il vhost predefinito per nginx:assicurati che utilizzi la stessa radice del documento di Apache vhost per esempio.com (ad es. /var/www/html) in modo che nginx possa fornire file statici direttamente senza passare la richiesta ad Apache:
nano /etc/nginx/sites-available/default
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
proxy_pass http://localhost:8000;
include /etc/nginx/proxy_params;
}
}
Questa è una configurazione molto semplice che trasmetterebbe tutte le richieste ad Apache.
Ricarica nginx per rendere effettive le modifiche:
service nginx reload
Ora puoi digitare il nome host del server o l'IP 192.168.1.100 nel tuo browser e dovresti vedere il sito Web predefinito di Apache, ma questa volta consegnato tramite nginx.
Come ho detto prima, questa è una configurazione molto semplice che invia tramite proxy tutte le richieste ad Apache. Ma poiché nginx è molto più veloce nel fornire file statici (come JavaScript, CSS, immagini, file PDF, file HTML statici, ecc.) rispetto ad Apache, è una buona idea lasciare che nginx serva direttamente questi file. Questo può essere fatto aggiungendo una nuova posizione per questi file, ad es. come segue:
server { listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
proxy_pass http://localhost:8000;
include /etc/nginx/proxy_params;
} location ~* \.(js|css|jpg|jpeg|gif|png|svg|ico|pdf|html|htm)$ { } }
Ricarica nginx:
service nginx reload
Puoi anche impostare un'intestazione HTTP Expires per questi file in modo che i browser memorizzino nella cache questi file (per maggiori dettagli consulta Creare la cache dei browser con file statici su nginx):
server { listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
proxy_pass http://localhost:8000;
include /etc/nginx/proxy_params;
} location ~* \.(js|css|jpg|jpeg|gif|png|svg|ico|pdf|html|htm)$ { expires 30d; } }
Ora possiamo fare un ulteriore passo avanti con questa configurazione lasciando che nginx serva tutte le richieste che può soddisfare e passi solo le richieste rimanenti più i file PHP ad Apache:
server { listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
proxy_pass http://localhost:8000;
include /etc/nginx/proxy_params;
} location ~* \.(js|css|jpg|jpeg|gif|png|svg|ico|pdf|html|htm)$ { expires 30d; } location @proxy { proxy_pass http://127.0.0.1:8000; include /etc/nginx/proxy_params; } location ~* \.php$ { proxy_pass http://127.0.0.1:8000; include /etc/nginx/proxy_params; } }
Ricarica nginx:
service nginx reload
Naturalmente, puoi perfezionare ulteriormente questa configurazione, ad esempio utilizzando nginx proxy_cache (se la tua applicazione lo consente, ad esempio, devi assicurarti che i captcha o i carrelli della spesa non siano memorizzati nella cache e che gli utenti che hanno effettuato l'accesso ottenere sempre una nuova copia della pagina) o se la tua applicazione ha una cache a pagina intera - nginx potrebbe accedere direttamente alla cache a pagina intera in tal caso (puoi trovare un esempio in questo tutorial:Come velocizzare Drupal 7.7 con Boost And nginx (Debian Squeeze)).
4 link
- nginx:http://nginx.net/
- Apache:http://httpd.apache.org/
- Ubuntu:http://www.ubuntu.com/