Voila depuis peu le blog est servi par le serveur http sorti de russie . Nginx permets également de faire du LoadBalancing .
L’architecture est plutôt des plus classique :
- LB Nginx
- 2 serveurs web Apache
Si vous utilisez xen pour vos tests . Création des VMs
xen-create-image --hostname=http1.madinina.lan --size=10Gb --ip=10.10.10.30 --memory=128Mb --dist=squeeze --arch=i386 xen-create-image --hostname=http2.madinina.lan --size=10Gb --ip=10.10.10.31 --memory=128Mb --dist=squeeze --arch=i386
Modification de votre sources.list
deb http://nginx.org/packages/debian/ squeeze nginx deb-src http://nginx.org/packages/debian/ squeeze nginx
Installation
apt-get update apt-get install nginx
Sur les 2 serveurs Apache une installation de apache2 et finit .
Configuration de Nginx (nginx.conf)
include /etc/nginx/sites-enable/*;
Configuration des upstreams
cd /etc/nginx/sites-available upstream www.madinina.lan { server 10.10.10.30:80 ; server 10.10.10.31:80 ; } server { location / { proxy_pass http://www.madinina.lan; } }
La configuration est relativement simple on définit
- Les upstream => IP ou noms de vos serveurs apache : Port de destination
- Proxy_pass => URL qui sera appelée
N’oubliez pas le lien symbolique dans sites-enable . Puis un restart de Nginx . Pas trop fatigué ?
Votre loadbalancing est en place rien d’extraordinaire jusque la . Mais regardons un peu les logs .
10.10.10.22 - - [09/Aug/2012:03:21:58 +0200] "GET / HTTP/1.0" 200 455 "-" "Lynx/2.8.8dev.5 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/2.8.6" 10.10.10.22 - - [09/Aug/2012:03:25:04 +0200] "GET / HTTP/1.0" 200 459 "-" "Wget/1.12 (linux-gnu)" 10.10.10.22 - - [09/Aug/2012:03:26:25 +0200] "GET / HTTP/1.0" 200 455 "-" "Lynx/2.8.8dev.5 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/2.8.6" 10.10.10.22 - - [09/Aug/2012:03:27:17 +0200] "GET / HTTP/1.0" 200 455 "-" "Lynx/2.8.8dev.5 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/2.8.6" 10.10.10.22 - - [09/Aug/2012:03:29:34 +0200] "GET / HTTP/1.0" 200 455 "-" "Lynx/2.8.8dev.5 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/2.8.6"
On se retrouve avec l’ip de notre reverse (nginx) . Vous comprendrez bien que si vous voulez faire des stats ou un peu de debug ca va être compliqué .
Alors pour corriger cela il faut dans un premier temps rediriger certaines entetes vers les serveurs en backend (apache) .
La nouvelle configuration
server { location / { 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_pass http://www.madinina.lan; } }
- Proxy_set_header => Permets de modifier les entêtes voir la doc
Il faut maintenant ajouter le modules RPAF (Reverse Proxy Add Forward) sur les apache . C’est toujours aussi compliqué .
apt-get install libapache2-mod-rpaf
Il faut modifier le fichier de conf rpaf.
/etc/apache2/mods-enabled# cat rpaf.conf <IfModule mod_rpaf.c> RPAFenable On RPAFsethostname On RPAFproxy_ips 10.10.10.22 xx.xx.xx.xx yy.yy.yy.yy </IfModule>
Il faut mettre l’ip du reverse. Dans les logs vous aurez maintenant l’ip du client et non plus celle du reverse. Avec un peu de persistance cela ne serait-il pas mieux ? L’algorithme de LoadBalancing qui le permets est ip_hash
upstream www.madinina.lan { ip_hash; server 10.10.10.30:80 ; server 10.10.10.31:80 ; }
Par contre je ne sais pas si il est possible de paramétrer un timeout (comme sur Keepalived) .
D’autres options sont disponible comme la mise en place d’un poids par exemple . Je vous laisse étudier les autres possibilités.
CONCLUSION
Nginx permets de mettre en place un LoadBalancer HTTP/HTTPS très rapidement et de façon très simple.
Vous pouvez également utiliser la suite Keepalived pour ce type d’architecture . L’avantage que présente NGINX par rapport à Keepalived est la mise en cache (même si nous n’avons pas vu ce point).
Bien-sur si vous voulez mettre en place un LB sur des ports autre que HTTP/HTTPS vous ne pourrez pas utiliser NGINX mais Keepalived est la bonne alternative .
Dans le cas ou vous voulez mettre NGINX pour du LoadBalancing SMTP lisez ceci
J’espère pouvoir faire enfin l’article sur keepalived depuis le temps que je le dis .