Attention, cet article a plus d'une année d'ancienneté. Il est possible que les informations présentées ne soient plus à jour, spécialement dans le cadre d'un article technique.
Bonjour à tous,
Aujourd’hui, on va voir comment et pourquoi configurer un Reverse Proxy Nginx.
Un reverse Proxy, c’est quoi ?
Pour cette partie, je vais citer le copain Wikipédia qui a une explication parfaitement convaincante :
Un proxy inverse (reverse proxy) est un type de serveur, habituellement placé en frontal de serveurs web. Contrairement au serveur proxy qui permet à un utilisateur d'accéder au réseau Internet, le proxy inverse permet à un utilisateur d'Internet d'accéder à des serveurs internes.
A quoi ça sert ?
Dans le cas que je vais vous présenter, le reverse proxy va remplir plusieurs fonctions :
- Serveur de cache : Le proxy Nginx va garder tout le contenu statique comme les images en cache et certains résultats PHP.
- Serveur de compression : On peut appliquer la compression gzip à notre contenu sur le serveur NGINX
- Sécurité : Tout notre trafic passe par un point central, c’est donc plus facile de filtrer le trafic
Pourquoi ne pas installer le serveur web NGINX ?
Simplement car les htaccess sous NGINX sont différents de ceux sous apache, et le problème c’est que la majorité de ce qui a déjà été été développé sur le web est écrit avec des htaccess pour apache.
Par soucis de simplicité donc …
Exemple concret
Installation classique
Dans le cas d’une installation classique, voilà ce qui ce passe :
Le visiteur contacte directement le serveur apache et le serveur Apache doit traiter ET les calculs php Et le contenu statique, sauf que lorsque votre site web va rencontrer un pic de visiteur, Apache va demander beaucoup de mémoire et beaucoup de ressources processeur. Pas bon.
Installation avec Nginx en reverse Proxy Cache
Dans le cas d’une installation classique, voilà ce qui ce passe :
Nginx va mettre en cache des requêtes php déjà calculées par le serveur Apache, et il va s’occuper de distribuer tout le contenu statique type javascript, images et autres. La différence c’est que Nginx n’a pas besoin de beaucoup de ressources contrairement à Apache pour faire ce travail.
En schéma ça donne ça au final :
Pré-requis :
Pour nos pré-requis, on va partir du principe que votre ou vos serveurs Apache/Mysql sont configurés et pleinement fonctionnels.
- Un serveur Ubuntu 12.04 LTS/13.x ou Debian 6/7
- Une connexion très haut débit à faible latence vers votre serveur web
- Être root
Pour cet exemple, NGINX n’est pas sur le même serveur que Apache ! Et surtout, cet exemple n’est pas valable avec ISPConfig 3 ! Un article spécial sera fait pour la configuration du proxy NGINX sous ISPCONFIG 3.
Installation et configuration :
On va commencer par mettre la liste des sources de Debian à jour, pour ce faire, tapez la commande suivante
nano /etc/apt/sources.list
Et ajoutez ces sources après le repository officiel d’OVH
deb http://ftp.de.debian.org/debian/ wheezy main contrib non-free deb-src http://ftp.de.debian.org/debian/ wheezy main contrib non-free deb http://security.debian.org/ wheezy/updates main contrib non-free deb-src http://security.debian.org/ wheezy/updates main contrib non-free # wheezy-updates, previously known as 'volatile' deb http://ftp.de.debian.org/debian/ wheezy-updates main contrib non-free deb-src http://ftp.de.debian.org/debian/ wheezy-updates main contrib non-free #NGINX deb http://nginx.org/packages/debian/ wheezy nginx deb-src http://nginx.org/packages/debian/ wheezy nginx
Lancez maintenant la commande
apt-get update && apt-get upgrade
pour mettre à jour votre installation
Après on va installer Nginx
apt-get install nginx
Ensuite, on va modifier la configuration globale du serveur. Modifiez la ligne « worker_processes » avec le nombre de cœur de votre cpu, par exemple pour un double cœur :
nano /etc/nginx/nginx.conf
user www-data; worker_processes 2; error_log /var/log/nginx/error.log; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; access_log /var/log/nginx/access.log; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; tcp_nodelay on; # envoi moins d'information sur le serveur server_tokens off; # taille des buffers et taille max des requêtes normales client_body_buffer_size 1k; client_max_body_size 8m; large_client_header_buffers 1 1K; ignore_invalid_headers on; # définition des différents timeout client_body_timeout 5; client_header_timeout 5; keepalive_timeout 5 5; send_timeout 5; ignore_invalid_headers on; server_name_in_redirect off; # active GZIP gzip on; gzip_comp_level 6; gzip_proxied any; gzip_vary on; gzip_types text/plain text/css application/x-javascript; gzip_disable "MSIE [1-6]\.(?!.*SV1)"; include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; }
On va maintenant configurer les fonctions reverse proxy et cache
/etc/nginx/conf.d/proxy.conf
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; proxy_hide_header X-Powered-By; proxy_intercept_errors on; proxy_buffering on; proxy_cache_key "$scheme://$host$request_uri"; proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=cache:10m inactive=7d max_size=700m;
On va maintenant créer le fichier de configuration de notre site dans le dossier sites-enabled de nginx
cd /etc/nginx/sites-enabled/
Créer un fichier portant le nom de votre site, par exemple abyssproject.net et éditez le
nano abyssproject.net
Et ensuite, on va rentrer la configuration pour le site sur cet exemple :
server { listen 80; server_name www.abyssproject.net abyssproject.net; if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 444; } location / { proxy_pass http://[ip du serveur apache:80/; proxy_cache cache; proxy_cache_valid 12h; expires 12h; proxy_cache_use_stale error timeout invalid_header updating; } location ~*^.+(swf|jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav| bmp|rtf|js)$ { proxy_pass http://ip du serveur apache:80; proxy_cache cache; proxy_cache_valid 2d; expires max; } location ^~ (^/admin|^/identification) { proxy_pass http://ip du serveur apache:80; } error_page 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 500 501 502 503 504 505 506 507 /error.html; location = /error.html { root /var/www/nginx-default; } }
Maintenant, redémarrez le serveur qui héberge Nginx avec la commande suivante :
reboot
Testez l’accès a votre site, mais n’oubliez pas de modifier les dns pour qu’ils pointent vers le serveur NGINX et non plus apache !
Bonjour,
Tu peut gagner des performances avec apache2-mpm-worker …
Les performances de celui ci sont globalement très proche des autres solutions existantes
Et la ton NGINX deviens totalement inutile.
Hello,
Je n’ai jamais entendu parler de ce module apache, tu as des liens vers des comparatifs ?
Mais ça ne devient pas totalement inutile, l’aspect sécurité du Reverse Proxy est toujours là et pour certaines personnes, la motivation est là 🙂