The Blog

Come configurare Nginx davanti ad apache per ottimizzare e velocizzare il caricamento dei vostri siti web

07 Apr 10

Per prima cosa dovete aver già installato nginx e spostato apache su un altra porta/ip. Una volta fatta questa procedura bisognerà semplicemente configurare nginx in modo da istruirlo sul da-farsi.

Premetto che su quest’esempio che porterò ho spostato apache vero in localhost 127.0.0.1. Il mio obiettivo era quello di utilizzare nginx per servire tutte le immagini e apache per servire le richieste dinamiche in php o altro.

Perciò , facendo risiedere nginx e apache sulla stessa macchina, ho potuto evitare di utilizzare il modulo di caching di nginx ( dato che accederà direttamente ai files tramite il filesystem ).
[CODE]
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
large_client_header_buffers 4 8k;
client_header_buffer_size 4k;
keepalive_timeout 65;
#proxy_cache_path /tmp/nginx levels=1:2:2 keys_zone=cache:100m max_size=1024m;

server {
listen 123.123.123.123:80;
server_name www.example.com;
error_log /usr/local/nginx/logs/error_example.log;

location ~* ^.+.(jpg|jpeg|gif|png|ico|css|txt|js)$ {
root /var/www/example.com/web;
}
location / {
#proxy_cache cache;
#proxy_cache_valid any 1m;

if ($http_user_agent ~* .*(Android|2.0\ MMP|240×320|AvantGo|BlackBerry|Blazer|Cellphone|Danger|DoCoMo|Elaine/3.0|EudoraWeb|hiptop|IEMobile|iPhone|iPod|KYOCERA/W$
rewrite ^(.*)$ http://m.example.com$1 permanent;
}
proxy_buffer_size 8k;
proxy_pass http://127.0.0.1:80;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}
}
}
[/CODE]

Come potete vedere la configurazione è abbastanza semplice. Una piccola nota: Le righe con il # sono dei commenti. Li ho volutamente lasciati perchè quelle direttive, qualora decommentate, abiliterebbero il caching dell’intero sito tramite il modulo di nginx.

Ho lasciato anche uno statement condizionale che verifica se la richiesta proviene da un browser mobile . In quel caso nginx effettua un redirect a m.example.com. Ho pensato di lasciarlo perchè a qualcuno potrebbe effettivamente servire una configurazione simile.

Tuttavia c’è un altro problema che ho dovuto risolvere. Infatti apache deve essere in grado di riconoscere l’ip del visitatore e non l’ip del proxy nginx. Il motivo ? Alcuni programmi come vbulletin fanno alcuni controlli di sicurezza sugli ip.

Questo problema l’ho risolto installando su apache un modulo chiamato rpaf che fa proprio al caso nostro. Ovviamente in questo howto non spiegherò come installarlo ma vi darò la mia configurazione corretta per nginx 🙂

[CODE]LoadModule rpaf_module /usr/lib/apache2/modules/mod_rpaf-2.0.so
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1 123.123.123.123
RPAFheader X-Forwarded-For
[/CODE]

L’unica direttiva alla quale stare attenti è sicuramente RPAFproxy_ips dove dovete specificare tutti gli ip del vostro proxy nginx 🙂

I risultati

I risultati sono sbalorditivi, utilizzando Apache Benchmarking ( ab in console ) con 2000 richieste ( 100 concorrenti ) il numero di richieste al secondo completate raddoppia passando da 5000ca a 11000ca. Senza contare che il footprint di memoria utilizzato da nginx è veramente più basso.

Vale la pena provarlo 😉

Comments