Installer NGINX, PHP5-FPM, Xcache et MySQL sur une Debian Lenny / Squeeze
Une architecture alternative – Pourquoi ?
On assiste depuis quelque temps à une industrialisation du développement PHP, conséquence inéluctable de son utilisation dans des applications d’entreprise et e-commerce conséquentes l’utilisation de frameworks PHP permet de développer plus vite, en équipe, dans un cadre normalisé en respectant des normes de codage strictes qui non seulement facilitent le partage et la réutilisation du code mais également sa maintenance.
Le point noir, car il y a toujours un revers, c’est la dégradation des performances, même avec un code optimisé et un cache d’optcode tel que APC, eAccelerator ou Xcache. Mais pour des sites à forte charge, ces optimisations ne suffisent pas.
Plusieurs solutions sont alors envisageables : augmenter la puissance des serveurs, modifier l’architecture en déportant les bases de données sur d’autres serveurs, rajouter des serveurs et mettre en place une solution de load-balancing… Solutions qui peuvent s’avérer efficaces – dans une certaine mesure tout au moins – mais dont le coût est lui à coup sûr exponentiel, d’autant que ces solutions vont généralement demander une revue de code et des modifications ou ajustements plus ou moins lourds.
Autre solution : passer du serveur web APACHE à NGINX. Divers articles vous expliquent comment monter un serveur NGINX couplé à PHP, le plus souvent avec LIGHTTPD ou d’autres hacks, mais un article en portugais : PHP 5.3, PHP-FPM, XCache, Nginx no Debian Lenny – Performance extrema, explique de manière détaillée comment monter correctement un serveur LEMP. La trame de cet article m’a d’ailleurs servi d’abord à monter mon propre serveur, des serveurs en production pour mes clients, et finalement à rédiger cet article.
Prérequis
Il est recommandé d’avoir des connaissances en administration Linux, en administration de sites web et une bonne dose de curiosité pour aller plus loin…
Vous pouvez également parcourir le wiki officiel de NGINX ainsi que la présentation sur Wikipédia
L’installation sera plus simple sur un serveur ou la distribution Debian vient d’être installée. Testée sur un serveur OVH et sur une Dedibox, cette méthode vous permettra de mettre en place un serveur LEMP en moins de 30 minutes.
Présentation des composants
Debian Lenny
La distribution Linux Debian ne se présente pas. Moins accessible peut-être que les distributions grand public, Debian reste au même titre que CentOS ou REDHAT une référence pour les administrateurs de serveurs web. La dernière version en date est la 6 baptisée Squeezee. Ce tutoriel est basé sur la v5 (Lenny), vous trouverez les indications pour la Squeezee dans le dernier paragraphe.
NGINX
Vous n’êtes pas arrivé ici par hasard. Vous avez certainement entendu parler des performances de ce serveur web certes moins riche en terme de fonctionnalités qu’APACHE mais qui permet de tenir une charge beaucoup plus élevée et d’obtenir des temps de réponse réduits sur des sites à fort trafic sans pour autant requérir des serveurs survitaminés. NGINX est utilisé par des sites web à très fort trafic, dont WordPress pour sa plateforme de blogs ou encore Github.
On peut optimiser APACHE. Oui. Mais on peut aussi optimiser NGINX. Un choix est fait, on fait avec…
PHP5-FPM
PHP5-FPM est une alternative à la version FastCGI. Pour ce que l’anglais ne rebute pas, vous trouverez quelques informations sur ce site :php-fpm
MySQL
Revendue à SUN, lui-même revendu à ORACLE, MySQL reste la base de données la plus utilisée dans le monde PHP. Simple à utiliser et à administrer, elle offre suffisamment de fonctionnalités pour la plupart des projets web.
Certains s’inquiètent pour son avenir, ORACLE n’ayant pas forcément bonne réputation auprès des acteurs du libre, mais des alternatives intéressantes existent déjà, forks de la version open source de MySQL. Et les annonces d’ORACLE concernant la version 5.5 sont plutôt rassurantes, tant quant au suivi qu’en termes de performances.
Configurer les dépôts
Il existe des dépôts pour php5-fpm et MySQL 5.1 sur dotdeb. Éditez le fichier sources.list :
vim /etc/apt/sources.list
et insérez les lignes suivantes :
deb http://packages.dotdeb.org oldstable all deb-src http://packages.dotdeb.org oldstable all deb http://php53.dotdeb.org oldstable all deb-src http://php53.dotdeb.org oldstable all
Récupérez ensuite les clés GnuPG :
gpg --keyserver keys.gnupg.net --recv-key 89DF5277 gpg -a --export 89DF5277 | apt-key add
Lancez ensuite cette commande pour mettre à jour vos dépôts :
apt-get update
puis celle-ci pour mettre à jour votre système (ce qui permettra entre autre bénéfice d’accroître la sécurité de votre serveur) :
apt-get upgrade
Installation
Préliminaires
Avant de commencer l’installation, passez en root si vous vous êtes identifié sur un autre compte, ce qui est fortement recommandé : su
Et renseignez le mot de passe.
installation du serveur MySQL
Le premier serveur installé est par défaut MySQL.
apt-get install mysql-server
Lors de l’installation, il vous sera demandé un mot de passe administrateur. Choisissez un mot de passe solide(8 caractères semblent être un minimum), différent du mot de passe système, comprenant au moins une majuscule, une minuscule, un symbole et un chiffre. Voilà, MySQL est installé.
installation de PHP5-FPM
Pour installer PHP 5 et les librairies essentielles, adaptez la ligne de commande suivante à vos besoins :
apt-get install php5-fpm php5-xcache php5-gd \ php5-curl php5-mysql libssl-dev libpcre3-dev build-essential -y
installation du serveur NGINX
Nous allons maintenant télécharger et compiler NGINX pour installer la toute dernière version, actuellement la 1.0.0 :
cd /tmp mkdir nginxinstall cd nginxinstall apt-get install libgeoip-dev wget http://sysoev.ru/nginx/nginx-1.0.0.tar.gz tar -zxvf nginx-1.0.0.tar.gz cd nginx-1.0.0 ./configure --prefix=/usr/local/nginx --user=www-data --group=www-data \ --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module \ --with-http_stub_status_module --with-http_ssl_module --with-http_geoip_module \ --http-log-path=/var/log/nginx/access.log --conf-path=/etc/nginx/nginx.conf \ --pid-path=/var/run/nginx.pid make make install
Tous les logiciels nécessaires au bon fonctionnement d’un serveur web – de base – sont installés, reste à les configurer.
Configuration
configuration du serveur NGINX
Commençons par configurer NGINX, qui est en fait l’élément central de notre article et de notre serveur web :
vim /etc/init.d/nginx
Supprimez l’existant et insérez le code suivant :
#! /bin/sh
### BEGIN INIT INFO
# Provides: nginx
# Required-Start: $all
# Required-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts the nginx web server
# Description: starts nginx using start-stop-daemon
### END INIT INFO
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local
DAEMON=/usr/local/nginx/sbin/nginx
NAME=nginx
DESC=nginx
test -x $DAEMON || exit 0
# Include nginx defaults if available
if [ -f /etc/default/nginx ] ; then
. /etc/default/nginx
fi
set -e
case "$1" in
start)
echo -n "Starting $DESC: "
start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \
--exec $DAEMON -- $DAEMON_OPTS || true
echo "$NAME."
;;
stop)
echo -n "Stopping $DESC: "
start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid \
--exec $DAEMON || true
echo "$NAME."
;;
restart|force-reload)
echo -n "Restarting $DESC: "
start-stop-daemon --stop --quiet --pidfile \
/var/run/$NAME.pid --exec $DAEMON || true
sleep 1
start-stop-daemon --start --quiet --pidfile \
/var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS || true
echo "$NAME."
;;
reload)
echo -n "Reloading $DESC configuration: "
start-stop-daemon --stop --signal HUP --quiet --pidfile /var/run/$NAME.pid \
--exec $DAEMON || true
echo "$NAME."
;;
configtest)
echo -n "Testing $DESC configuration: "
if nginx -t > /dev/null 2<&1
then
echo "$NAME."
else
exit $?
fi
;;
*)
echo "Usage: $NAME {start|stop|restart|reload|force-reload|configtest}"<&2
exit 1
;;
esac
exit 0
Refermons le fichier après avoir enregistré (séquence [esc] puis :x) et lançons les deux commandes qui suivent :
chmod +x /etc/init.d/nginx update-rc.d nginx defaults
Allons maintenant dans le fichier /etc/nginx/nginx.conf :
vim /etc/nginx/nginx.conf
À nouveau, supprimez tout et insérez le code suivant :
worker_processes 4;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
gzip on;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_proxied any;
gzip_min_length 1100;
gzip_buffers 16 8k;
gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript image/gif image/jpeg image/png;
gzip_disable "MSIE [1-6].(?!.*SV1)";
gzip_vary on;
server {
root /var/www;
listen 80;
server_name www.mondomaine.com;
server_name_in_redirect off;
location / {
index index.php;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|txt|srt|swf)$ {
root /var/www/public;
access_log off;
expires 30d;
}
location ~ \.htaccess {
deny all;
}
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php?q=$1 last;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name;
fastcgi_param SERVER_NAME $http_host;
fastcgi_ignore_client_abort on;
}
}
}
À nouveau refermons le fichier après avoir enregistré.
configuration de Xcache
Ouvrons le fichier xcache.ini :
vim /etc/php5/fpm/conf.d/xcache.ini
Supprimons son contenu et remplaçons-le par le contenu suivant :
extension=xcache.so [xcache.admin] extension = xcache.so xcache.admin.user = "mOo" xcache.admin.pass = "" [xcache] xcache.shm_scheme = "mmap" xcache.size = 64M xcache.count = 3 # nb de processeurs +1 xcache.slots = 8K xcache.ttl = 0 xcache.gc_interval = 0 xcache.var_size = 64M xcache.var_count = 1 xcache.var_slots = 8K xcache.var_ttl = 0 xcache.var_maxttl = 0 xcache.var_gc_interval = 300 xcache.test = Off xcache.readonly_protection = Off xcache.mmap_path = "/dev/zero" xcache.coredump_directory = "" xcache.cacher = On xcache.stat = On xcache.optimizer = On [xcache.coverager] xcache.coverager = Off xcache.coveragedump_directory = ""
Refermons le fichier, Xcache est configuré. Pour plus de détails sur la configuration de Xcache, référez-vous au wiki officiel.
configuration de PHP5-FPM
Éditons le fichier php5-fpm.conf :
vim /etc/php5/fpm/php5-fpm.conf
Le fichier par défaut contient toutes les instructions nécessaires au bon fonctionnement du module php5-fpm, mais depuis a version 5.3.2, avec le passage du format xml au format texte/ini, certaines valeurs pourtant indispensables peuvent être commentées. Il suffit donc de supprimer le point-virgule de début de ligne pour les valeurs suivantes :
pid = /var/run/php5-fpm.pid pm.max_spare_servers pm.min_spare_servers
Pour que le module soit opérationnel.
Configuration de Logrotate
Éditons le fichier :
vim /etc/logrotate.d/nginx
et configurons-le comme suit :
/var/log/nginx/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 640 root adm
sharedscripts
postrotate
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.p$
endscript
}
Dernière étape
Relançons les services que nous venons de configurer :
/etc/init.d/php5-fpm restart /etc/init.d/nginx restart
Votre serveur LEMP est prêt à l’usage.
Un serveur NGINX sous Windows
Pour effectuer vos tests sous Windows en reprenant un environnement le plus proche possible de celui que vous venez d’installer, il existe un outil appelé Easy WEMP. Téléchargez, et quelques clics plus tard, vous avez un serveur prêt à l’emploi.
URL rewriting
L’url rewriting ou réécriture d'url est utile au référencement naturel, utilisée par la majorité des frameworks et systèmes de gestion du contenu, on ne peut écrire un tutoriel sur NGINX et faire l’impasse sur ce sujet.
Contrairement à APACHE, NGINX ne traite pas la réécriture des urls au travers d’un fichier .htaccess, mais en intégrant les règles de réécriture dans la configuration du serveur. Différents exemples sont disponibles sur le wiki officiel, je vous livre quelques configurations prêtes à l’emploi :
- Zend Framework
# variante 1 if (!-e $request_filename) { rewrite ^.*$ /index.php last; } # variante 2 if (!-e $request_filename) { rewrite ^/(.*)$ /index.php?q=$1 last; } # variante 3 try_files $uri $uri/ /index.php; - wordpress
# variante 1 location @wordpress { fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $document_root/index.php; include /etc/nginx/fastcgi_params; fastcgi_param SCRIPT_NAME /index.php; } location ~ \.php$ { try_files $uri @wordpress; fastcgi_index index.php; fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include /etc/nginx/fastcgi_params; } # variante 2 try_files $uri $uri/ /index.php;
Debian 6 Squeeze
La distribution Debian est passé depuis peu en v6 Squeeze, la procédure d’installation reste la même que sur une Debian 5 Lenny, à l’exception des dépôts dotdeb (cf. le site dotdeb).
Aller plus loin
Nous avons vu ici l’installation et la configuration d’un serveur, mais avant de pouvoir s’en servir en production, il sera nécessaire de renforcer la sécurité.
En installant un système de détection d’intrusion, en changeant le port de votre serveur ssh (choisissez un port au-delà de 1024, les adresses 0-1023 sont réservées par le système), en interdisant de se logger via ssh avec le compte root, en changeant régulièrement votre mot de passe en y incluant une lettre minuscule, une lettre majuscule, un caractère spécial, un signe de ponctuation et un chiffre pour une longueur minimum de 8 caractères… pour ne citer que des points basiques mais qui vont accroître de manière exponentielle votre sécurité.
De même, il sera intéressant d’adjoindre un outil de monitoring tel que Munin (voir l’article Munin (logiciel) sur Wikipédia.
Et… mais la liste est longue, chacun adaptera son serveur à ses besoins.
Installation simplifiée grâce à Dotdeb
Dans cet article, j’utilise Dotdeb pour installer PHP5 et MySQL. Le site Dotdeb s’est entre temps étoffé, il est désormais possible d’installer un serveur en utilisant uniquement les dépôts proposés sur ce site. Vous trouverez la procédure complète en lisant cet article : Configurer un serveur web sur Debian Squeeze via Dotdeb.

Merci pour cette doc, j’ai réussi a installer sans probleme
Bonjour,
En installant tout ça, et en lançant php5-fpm j’ai un message qui me dit Illegal instruction. Pouvez vous m’aider svp ?
sudo /etc/init.d/php5-fpm start
Illegal instruction
sudo /etc/init.d/nginx start
Starting nginx: nginx.
@Helyousa
Bonjour,
Pourriez-vous m’envoyer les fichiers /etc/init.d/php5-fpm et /etc/php5/fpm/php5-fpm.conf par email ( pascal.cescato[at]expert-php.fr ) ?
Il se peut qu’il y ait un caractère illégal dans l’un ou l’autre… Sinon pour une installation rapide et fonctionnelle vous pouvez utiliser les dépôts dotdeb (voir l’article Configurer un serveur web sur Debian Squeeze via Dotdeb).
Une très bonne documentation à garder sous le coude, bravo pour la clareté !!