Nginx - Reverse Proxy
Sources
- nginx: http://nginx.net/
- Documentation: http://wiki.nginx.org/NginxConfiguration
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 nginxSlackware:
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:
server_farm est un nom donné à notre liste de serveurs qui serviront à la répartition.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; }
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 serveursDe plus, il est possible de changer le code d'erreur avant de le renvoyer au client:error_page 404 /404.html; error_page 502 503 504 /50x.html; error_page 403 http://example.com/forbidden.html;
Il est aussi possible de renvoyer l'erreur http et de redirigererror_page 404 =200 /.empty.gif; error_page 404 = /404.php;
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.