Accueil > NGINX > Installer NGINX, PHP5-FPM, Xcache et MySQL sur une Debian Lenny / Squeeze

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 &gt; /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.

  1. axkiller
    22/01/2011 à 12:19 | #1

    Merci pour cette doc, j’ai réussi a installer sans probleme

  2. Helyousa
    09/10/2011 à 12:49 | #2

    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.

  3. 09/10/2011 à 13:09 | #3

    @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).

  4. 31/10/2011 à 10:18 | #4

    Une très bonne documentation à garder sous le coude, bravo pour la clareté !!

  1. Pas encore de trackbacks