Nginx - Reverse Proxy



Sources


A quoi cela sert ?

Nginx peut servir à beaucoup de choses, voici les plus intéressantes
  • Redirection vers des serveurs internes
  • Repartiteur de charge
  • Redirection des erreurs http
  • Redirection selon le contenu
  • Compression et mise en cache de contenu


Installation

Debian:
apt-get install nginx
Slackware:
wget http://sysoev.ru/nginx/nginx-VER.tar.gz
tar xzvf nginx-VER.tar.gz
cd nginx-VER
./configure
make
sudo make install


Configuration

Les fichiers de configuration se trouvent dans /etc/nginx/, dans le fichier nginx.conf, il n'y a rien à faire, la configuration se faisant séparement dans chaque vhost.
Voici les differentes options des fichiers de vhost, selon ce que l'on veut faire:

Redirection

Nginx permet de redirger une requette http vers un autre serveur et un autre port. Cela permet par exemple de créer un vhost pour un service qui se trouve en fait sur un autre port.
Il faut editer la partie "location" du fichier vhost et y mettre:
server {
	....
	location / {
    proxy_pass         http://IP_DESTINATION:PORT_DESTINATION;
    proxy_redirect     off;
proxy_set_header        Host            $host;
proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size    10m;
client_body_buffer_size 128k;
proxy_connect_timeout   90;
proxy_send_timeout      90;
proxy_read_timeout      90;
proxy_buffers           32 4k;
	}
	....
}

Repartiteur de charge

Appellé load balancing, le principe consiste à envoyer les clients sur plusieurs serveurs differents à tour de rôle pour réartir la charge équitablement.
Pour cela il faut rajouter dans la configuration d'un vhost:
upstream server_farm {
   server 192.168.10.1:80 weight=5;
   server 192.168.10.2:80 weight=1;
   server 192.168.10.3:80 weight=5;
   server 192.168.10.4:80 weight=10;
 }
server_farm est un nom donné à notre liste de serveurs qui serviront à la répartition.
weight permet de donner un "poid" au serveur, plus il est élevé, plus le serveur sera utilisé, idéal si les serveurs sont des machines de puissance variées.
Il faut maintenant préciser d'utiliser cette liste:
server {
	....	
	location / {
	proxy_pass         http://server_farm;
	....
	}
}

Redirection des erreurs HTTP

Nginx permet de modifier les erreurs http de vos serveurs
error_page   404          /404.html;
error_page   502 503 504  /50x.html;
error_page   403          http://example.com/forbidden.html;
De plus, il est possible de changer le code d'erreur avant de le renvoyer au client:
error_page 404 =200 /.empty.gif;
error_page   404  =  /404.php;
Il est aussi possible de renvoyer l'erreur http et de rediriger
error_page   404  /404.php;

Redirection selon le contenu

Nginx permet de servir du contenu different par different moyens, par exemple, les images peuvent venir d'un lighttpd, les fichiers dynamiques d'un apache.
Pour cela il faut rajouter plusieurs "locations" à un "server", chacune precisan comment procéder avec la requette.
location  = / {
  # Ne match que l'url /
}
location  / {
  # Matche toute les urls, mais les location en expression reguliere matcheront toujours
}
location ^~ /images/ {
  # Matche les fichiers dans le repertoire /images/
}
location ~* \.(gif|jpg|jpeg)$ {
  # Matche les extensions gif, jpg, or jpeg. Cependant les images contenu dans /images/ sont interceptees dans la location du dessus
}

Compression

Nginx permet de compresser à la volée le contenu.
Pour cela il faut editer nginx.conf et pas les vhosts.
 gzip on;
    gzip_min_length  1100;
    gzip_buffers     4 8k;
    gzip_types       text/plain;

IP via Proxy

Un soucis avec la solution nginx vient du fait que les serveurs apaches ne verront plus l'ip de la personne qui se connecte.
Nginx est capable d'envoyer l'ip d'origine de la demande dans les headers, il suffit donc pour résoudre se problème d'indiquer à apache d'aller prendre cette info dans les headers et de la considérer comme l'ip d'origine de la demande. Pour ce faire, il faut utiliser un module dénommé mod_rpaf.
Configuration d'nginx
proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Installation du mod_rpaf
apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c
Configuration des vhosts apache
RPAFenable On RPAFsethostname On RPAFproxy_ips 127.0.0.1

Il ne reste plus qu'à relancer apache et nginx et le tour est joué!

Conclusion

Nginx rend de bons services pour le load balancing, le reverse proxy et diverses petites choses non abordées ici, comme l'injection de headers, memcache, le spoon feeding et autres.
C'est un très bon outil dans l'arsenal de l'administrateur, quel que soit la taille de l'installation.