Nginx en reverse proxy
Par Dju » 12 mars 2010 (23:36) - Serveur
Parlons un peu de ce merveilleux soft qu'est NginX (prononcez Engine X)
C'est un serveur web, qui a la particularité d'être assez léger, très rapide (surtout pour servir du contenu statique), et parfait pour faire du reverse-proxy ou load balancing.
On va voir ici comment le configurer pour fonctionner en reverse proxy, avec apache derrière, en backend.
C'est donc NginX qui va être en frontal sur votre machine, recevoir les connexions des clients, servir le contenu statique trèès rapidement (environ 6/7 fois plus vite qu'apache ! ) et passer les requêtes dynamiques (pages php par exemple) à apache.
Au final, une rapidité accrue, une conso de ram moindre, et une bonne stabilité. What else ?
Une fois installé (aptitude install nginx), tout se joue dans le dossier /etc/nginx/
On commence par éditer le fichier conf.d/proxy.conf (qui n'existe pas par défaut)
On y met ceci :
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;
client_header_buffer_size 64k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 16k;
proxy_buffers 32 16k;
proxy_busy_buffers_size 64k;
Ci dessus, on définit les paramète du reverse proxy, et principalement les 2 headers dans lequels on trouvera l'adresse ip réelle du client et celle du proxy (la machine ou nginx tourne)
Après, on peut éventuellement modifier le fichier de conf principale, /etc/nginx/nginx.conf qui est deja pas mal par défaut.
On peut tout de même y appliquer quelques petits changements pour peaufiner.
user www-data;
worker_processes 1;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
# multi_accept on;
}
http {
include /etc/nginx/mime.types;
access_log /var/log/nginx/access.log;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
tcp_nodelay on;
gzip on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
gzip_comp_level 5;
gzip_http_version 1.0;
gzip_types text/plain text/xml text/xhtml text/css image/x-icon application/x-javascript;
gzip_buffers 16 8k;
gzip_min_length 0;
gzip_vary on;
server_tokens off;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
user définit l'utilisateur avec lequel nginx tourne. www-data par défaut.
worker_processes : nombre de process nginx lancés. 1 par défaut, peut être augmenté minutieusement si machine puissante / multi-processeurs/cores
server_tokens off empêche nginx de s"identifier avec son numéro de version, on verra juste NginX dans le header.
Les suivantes activent la compression gzip pour transférer les données plus rapidement entre le serveur et le navigateur du client.
Puis on édite le fichier /etc/nginx/sites-enabled/default
server {
listen 80;
server_name monsite.com www.monsite.com;
location / {
proxy_pass http://127.0.0.1:8080/;
access_log off;
}
location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|txt|xml)$ {
root /var/www/monsite.com;
access_log /var/log/nginx/monsite.com.access.log;
error_log /var/log/nginx/monsite.com.errors.log;
expires 30d;
}
location ~ /\.ht {
deny all;
}
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/nginx-default;
}
}
Explications :
On définit le host www.monsite.com, qui écoutera sur le port 80.
Tout se fait ensuite avec la directive location.
D'abord, on définit le répertoire pincipal / en proxy_pass. On le passe à Apache qui écoutera sur le port 8080.
Puis grâce à une expression régulière, on indique de servir directement tous les fichiers statiques (images,html,css,javascript...)
Également, on interdit la demande sur les fichiers de type .htaccess.
Enfin on donne la page d'erreur (par défaut) pour le cas ou nginx rencontre une erreur ou si vous faites une maintenance d'apache et que nginx n'arrive pas à le joindre.
Maintenant, passons à Apache.
il vous faudra d'abord le configurer pour écouter en local et sur un autre port que 80 (ici, 8080).
On édite donc le fichier /etc/apache2/ports.conf et on indique
Il vous faudra également editer votre fichier ou se trouvent vos virtual host et faire ce changement :Listen 127.0.0.1:8080
transformer <VirtualHost *> en <VirtualHost 127.0.0.1:8080>
Ne pas oublier non plus d'installer le mode "rpaf" afin que dans les logs on puisse voir l'ip réelle du client, relayée par NginX.
aptitude install libapache2-mod-rpaf
Finalement on relance apache et nginx pour valider le tout
Et voila. Vous avez maintenant un site un peu plus rapide mais surtout qui consomme moins./etc/init.d/nginx restart
/etc/init.d/apache2 restart
Votre machine vous en remercie d'avance :D
Pour plus d'infos et configs possibles, n'hésitez pas à aller visiter le wiki qui est assez complet :
http://wiki.nginx.org/Main
location ~* ^.+\.(jpg|jpeg|gif|css|png|js|ico|txt|xml)$
totogif != tot.gif
certes, mais c'est pourquoi il y a \. avant la liste d'extensions, de manière à ne pas matcher totogif
merci pour le tuto
you're welcome
nginx marche d'ailleurs aussi pas mal pour servir les pages dynamiques en php (sans apache, donc) et est royal pour faire du load-balancing
Apparemment tu as installé nginx sur la même machine que ton site web. Que ce passe-t-il si tu l'installe sur une autre machine ? La directive root peut-elle pointer vers une autre machine ?
hello
En effet, nginx peut faire suivre les requetes sur la meme machine (par exemple un apache qui écoute en local sur un port autre que 80), ou carrément une autre machine
Et non, la directive root est uniquement en local, mais dans le cas ou on forwarde la requête sur une machine distant, ce n'est pas forcément utile
Fil des commentaires de ce billet
Nginx
Discover a selection of related articles on Pearltrees...
URL de rétrolien : https://blog.crifo.org/trackback/34