mercredi 19 juin 2013

[TUTO] Nginx en Revers Proxy + Apache


Dans ce post je vais vous partager mon expérience dans la mise en place d'un serveur Nginx.
J'ai travaillé sur le sujet lorsque je menais des 'expériences' en matière de sécurité de serveur.
Le but était d'utiliser Apache sous un autre port que le 80 pour prévenir de certaines attaques et utiliser quelques contrôles en amont avant d'envoyer le client à apache. Au final je ne sais pas vraiment si cela m'évite des attaques pirates mais en attendant Nginx me sert à dispatcher les ressources avant d’envoyer les scripts à apache. Gain de performances.


Pour imaginer tout ça plus facilement je vous ai confectionné un petit schéma. En vrai c'est bien évidement plus complexe, mais l'essentiel est là :) .



Je vais vous épargner l'installation de Nginx car vous trouverez assez de tuto pour installer le serveur.
Pour ma part un simple Yum install nginx (ou sudo apt-get install nginx) suffisait. Je vous invite à vous rendre sur le site officiel qui est très bien documenté => http://wiki.nginx.org/Install

1- Modification du fichier /etc/nginx/nginx.conf


nginx.conf :
user apache;
worker_processes 2;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

events {
worker_connections 4096; 
}

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 600;
tcp_nodelay on;
send_timeout 3600;
client_body_timeout 3600;
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/site-enabled/*; 
}
Le code ci-dessus est presque à l'identique comparé au code de base recommandé par nginx.
Quelques variables comme user, keepalive_timeout, send_timeout, client_body_timeout ont étés modifiées de mon côté, pour le reste la plupart des sites fonctionneront avec cette configuration.

Vous remarquerez également en bas du fichier les lignes :
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/site-enabled/*;
La première indique au fichier de configuration d'appeler tous les autres fichiers de configuration se trouvant dans le répertoire /etc/nginx/conf.d/.
La dernière ligne va appeler les fichiers se trouvant dans le répertoire /etc/nginx/site-enabled/ que j'ai créé au préalable pour ranger les fichiers de configuration de mes sites.
Dans ce répertoire nous allons y placer autant de fichier que nous aurons de site sur le serveur.

2 - Paramètres de notre site côté nginx


Il nous faut maintenant placer un fichier de configuration pour notre site, nommons-le "site-1.conf" :
vim /etc/nginx/site-enabled/site-1.conf
(vim est l'éditeur de texte que j’utilise pour travailler mes fichiers rien ne vous empêche d’utiliser un autre comme nano par exemple.)

Rappel :  Pour les débutant, vim est un éditeur de texte. Vous pouvez également utiliser vi ou nano. Une fois dans l'éditeur de texte vim, il vous faudra appuyer sur la touche [A] pour activer le mode modification du fichier. [alt]+[W] pour sortir de ce mode et  :wq pour valider, enregistrer et quitter l'éditeur. Si vous êtes dans l'éditeur et que vous souhaitez en sortir sans enregistrer ce sera la ligne :q!

site-1.conf
server {
server_name domain_name.fr;
rewrite ^(.*) http://www.domain_name.fr$1 permanent;
}

server {
listen 80;
server_name *.domain_name.fr;
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
root /var/www/vhosts/domain_name.fr/httpdocs;
access_log /var/log/nginx/domain_name_access.log;
error_log /var/log/nginx/domain_name_errors.log;
expires 30d;
}
location / {
proxy_pass http://127.0.0.1:8080/;
access_log /var/log/nginx/domain_name_access.log;
error_log /var/log/nginx/domain_name_errors.log;

#root /var/www/vhosts/$host/httpdocs;
}
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;
}
}
En gros, Nginx va réceptionner les requêtes client et traiter directement sur le port 80 les fichiers statiques (images, css, js, etc...) ce qui évitera à apache de le faire de lui même, et de gagner en performance pour travailler à l’exécution des fichiers php et de l'échange avec mysql. Petite remarque, les gains de temps sont infime sur des sites à faible fréquentation.
Pour le reste, Nginx va envoyer le reste sur le port 8080 (port que l'on va attribuer à apache dans le prochain point)

Nginx est maintenant configuré, on redémarre le service pour pendre les modifications en compte.
service nginx restart

!Attention : la moindre petite erreur de frappe va entrainer une erreur de type :
configuration /etc/nginx.conf test failed
Il est donc important de vérifier votre code et vous assurer de n'avoir rien oublié.

3 - Configuration de Apache


Première chose importante : dire à apache de travailler sur le port 8080.
vim /etc/httpd/conf/httpd.conf


On s'en va chercher la ligne : Listen 80 pour la modifier en : Listen 127.0.0.1:8080
Il nous reste maintenant à modifier le fichier de configuration apache.
Pour cela il faut ouvrir le fichier ports.conf ou httpd.conf selon les distributions:
vim /etc/apache2/ports.conf

Repérez ou ajouter la ligne :
Listen 80
Pour les modifier en :
Liste 8080

Redémarrage de Apache :
service apache2 restart
ou
service httpd restart

 

4 - Installation de Mod_rpaf


Sans l’installation de ce module php on ne pourra pas récuperer l'adresse ip du client.
Pour ce faire il faut suivre les points suivant :
1 - copiez le code ci-dessous dans le fichier /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;
client_max_body_size    150m;
client_body_buffer_size 128k;
client_header_buffer_size 64k;
proxy_connect_timeout   800;
proxy_send_timeout      800;
proxy_read_timeout     800;
proxy_buffer_size   16k;
proxy_buffers       32   16k;
proxy_busy_buffers_size 64k;
2 - Installez mod_rpaf pour appache
apt-get install libapache2-mod-rpaf
3 - On reboot les services
service nginx restart
service apache2 restart

5 - Conclusion


Ce tuto est optimisé dans un but de permettre à Nginx de gérer plusieurs sites sur un même serveur. Il vous faudra renouveler les opérations autant de fois que vous avez de site bien entendu.
Si ce n'est pas le cas et que vous n’avez qu'un site, la configuration ci-dessous tournera quand-même.

Voilà qui est fait ! J’espère n'avoir rien oublié, je vous laisse poster vos erreurs et vos bugs dans les commentaires ci-dessous, afin que nous puissions trouver une solution ensemble ;)