Nginx en tant que LoadBalancer

Publié le 10 août 2012 par Lmns972 @guestblog

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 .