Vous êtes ici : Accueil / Debian GNU/Linux / Serveurs / PHP / Installer PHP-FPM sur Debian

Installer PHP-FPM sur Debian

Par Pierre-Yves Landuré Dernière modification 07/02/2017 11:08

PHP-FPM est une amélioration sensible de la mécanique FCGI pour PHP. Son utilisation permet d'améliorer sensiblement les performances de vos sites Internet. C'est un outil recommandé pour optimiser l'hébergement de sites générant un fort trafic. Cet article vous guide dans la mise en place de cette mécanique sur Debian, en utilisant les paquets fournit par dotdeb.org.

Ce guide est testé sur:

  • Debian 6.0 Squeeze
  • Debian 7.0 Wheezy
  • Ubuntu 13.10 Saucy Salamander
  • Ubuntu 16.04 Xenial Xerus

Prérequis

Ce guide nécessite:

Pour Debian 6.0 Squeeze, ce guide nécessite:

    Installation

    Détectez le proxy de commande (command ou sudo):

    cmdProxy='command'
    command type -f 'sudo' &>'/dev/null' && cmdProxy='sudo'

    Installation de FPM

    Installez le paquet logiciel:

    if [ -n "$(command apt-cache pkgnames php7.0-fpm)" ]; then
    phpVersion=7.0
    ${cmdProxy} apt-get install php-fpm php
    else
    phpVersion=5
    ${cmdProxy} apt-get install php5-fpm php5
    fi

    Installez l'extension suhosin si elle est disponible:

    if [ -n "$(command apt-cache pkgnames php5-suhosin)" ]; then
      ${cmdProxy} apt-get -y install php5-suhosin
    fi
    

    Détectez le chemin des fichiers de configuration de PHP:

    phpEtcPath='/etc/php5'
    test -d "/etc/php/${phpVersion}" \
      && phpEtcPath="/etc/php/${phpVersion}"

    Sauvegardez le fichier de configuration modèle de php-fpm:

    test -e "${phpEtcPath}/fpm/pool.d/www.conf" \
    && ${cmdProxy} dpkg-divert --divert "${phpEtcPath}/fpm/pool.d/www.conf-dist" \
    --rename "${phpEtcPath}/fpm/pool.d/www.conf"

    Créez le fichier de configuration de PHP-FPM:

    command test -e "${phpEtcPath}/fpm/pool.d/www.conf" \
        || ${cmdProxy} cp "${phpEtcPath}/fpm/pool.d/www.conf-dist" "${phpEtcPath}/fpm/pool.d/www.conf"

    Configurez PHP-FPM pour attendre les connexions sur un socket Unix, et pour autorisez l'exécution de scripts PHP durant jusqu'à 600 secondes:

    if [ -e "${phpEtcPath}/fpm/pool.d/www.conf" ]; then
    ${cmdProxy} sed -i \
    -e 's|^listen =.*$|listen = /var/run/php-fpm.sock|' \
    -e 's|^;*request_terminate_timeout.*|request_terminate_timeout = 605|' \
    -e 's|^;*pm.status_path.*|pm.status_path = /php-fpm-status|' \
    -e 's|^;*ping.path.*|ping.path = /php-fpm-ping|' \
        "${phpEtcPath}/fpm/pool.d/www.conf"
    fi

    Important: Il est maintenant nécessaire de redémarrer le service PHP-FPM à chaque installation d'un module PHP:

    if [ -n "$(command find "${phpEtcPath}/fpm/pool.d/" -name '*.conf')" -a -e "/etc/init.d/php${phpVersion}-fpm" ]; then
    ${cmdProxy} service "php${phpVersion}-fpm" 'restart'
    fi

    Configurez la rotation des fichiers journaux:

    if [ ! -e "/etc/logrotate.d/php${phpVersion}-fpm" ]; then
    command echo -e "/var/log/php${phpVersion}-fpm.log {
    \trotate 12
    \tweekly
    \tmissingok
    \tnotifempty
    \tcompress
    \tdelaycompress
    \tpostrotate
    \t\tinvoke-rc.d php${phpVersion}-fpm force-reload > /dev/null
    \tendscript
    }" \
      | ${cmdProxy} tee "/etc/logrotate.d/php${phpVersion}-fpm"
    fi

    Finalisation

    Ce guide recommande:

    Configuration du serveur HTTP

    Configuration de Apache 2

    Installez le module FastCGI d'Apache 2:

    if [ -d '/etc/apache2' ]; then
    ${cmdProxy} apt-get install libapache2-mod-fastcgi
    fi

    Créez un fichier de configuration pour utiliser PHP-FPM avec le module FastCGI:

    if [ -d '/etc/apache2' ]; then
    ${cmdProxy} wget 'https://raw.github.com/biapy/howto.biapy.com/master/apache2/php-fpm/php-fpm.load' \
    --quiet --no-check-certificate --output-document='/etc/apache2/mods-available/php-fpm.load'
    ${cmdProxy} wget 'https://raw.github.com/biapy/howto.biapy.com/master/apache2/php-fpm/php-fpm.conf' \
    --quiet --no-check-certificate --output-document='/etc/apache2/mods-available/php-fpm.conf'
    fi

    Activez le module php-fpm pour Apache 2:

    if [ -d '/etc/apache2' ]; then
    ${cmdProxy} a2dismod "php${phpVersion}"
    ${cmdProxy} a2enmod php-fpm fastcgi actions
    fi

    Rechargez la configuration d'Apache 2:

    [[ -x '/etc/init.d/apache2' ]] && ${cmdProxy} service 'apache2' 'force-reload'

    Si la configuration fonctionne, installez la version MPM-Worker d'Apache 2:

    if [ -d '/etc/apache2' -a -n "$(command apt-cache pkgnames apache2-mpm-worker)" ]; then
    ${cmdProxy} apt-get install apache2-mpm-worker
    fi

    Configuration de lighttpd

    Configurez Lighttpd pour utiliser php-fpm:

    if [ -d '/etc/lighttpd' ]; then
    echo '# /usr/share/doc/lighttpd-doc/fastcgi.txt.gz
    # http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs:ConfigurationOptions#mod_fastcgi-fastcgi

    ## Start an FastCGI server for php (needs the php fpm package)
    fastcgi.server += ( ".php" =>
    ((
    "socket" => "/var/run/php-fpm.sock"
    ))
    )' \
        | ${cmdProxy} tee '/etc/lighttpd/conf-available/15-fastcgi-php-fpm.conf'
    fi

    Activez la nouvelle configuration:

    if [ -x '/usr/sbin/lighty-enable-mod' ]; then
    ${cmdProxy} lighty-disable-mod fastcgi-php
    ${cmdProxy} lighty-enable-mod fastcgi-php-fpm
    fi

    Rechargez la configuration de lighttpd:

    [[ -x '/etc/init.d/lighttpd' ]] && ${cmdProxy} service 'lighttpd' 'force-reload'

    Résolution des problèmes

    .htaccess: Invalid command 'php_flag'

    Si le journal d'erreur d'Apache 2 contient:

    .htaccess: Invalid command 'php_flag', perhaps misspelled or defined by a module not included in the server configuration

    L'un des sites hébergé utilise la directive "php_flag" dans un fichier .htaccess. Cette directive est fournie par le mod_php5 d'Apache 2, et n'est pas compatible avec FastCGI, ou PHP-FPM.

    Pour corriger l'erreur, commentez les lignes en faute dans le fichier .htaccess, et de créer un fichier ini de configuration équivalent dans /etc/php5/conf.d/.

    FastCGI: comm with server aborted : idle timeout

    Si le journal d'erreur d'Apache 2 contient:

    FastCGI: comm with server "/var/lib/apache2/fastcgi/php5.fastcgi" aborted: idle timeout (610 sec)

    Le temps d'exécution d'une page PHP dépasse les 610s. Cela arrive, par exemple, lors de la mise à jour d'une application Web.

    Pour corriger l'erreur, augmentez la valeur de l'option -idle-timeout dans le fichier /etc/apache2/mods-available/php5-fpm.conf:

    FastCGIExternalServer /var/lib/apache2/fastcgi/php5.fastcgi -socket /var/run/php5-fpm.sock -idle-timeout 910

    Augmentez aussi la valeur de l'option request_terminate_timeout dans le fichier /etc/php5/fpm/pool.d/www.conf (la valeur doit rester légèrement inférieure à celle de idle-timout (voir ci-dessus)):

    request_terminate_timeout = 905

    Ces deux valeurs doivent être supérieures au réglagle PHP max_execution_time.

    ERROR: failed to ptrace(PEEKDATA) pid XXXXX : Input/output error (5)

    Si le journal de PHP-FPM (/var/log/php5-fpm.log) contient:

    ERROR: failed to ptrace(PEEKDATA) pid 25478: Input/output error (5)

    Cette erreur apparaît lorsque l'option "request_slowlog_timeout" est activée. Elle correspond à un échec de création de la trace. Cela peut déclencher une indisponibilité du serveur car:

    1. Après l'arrêt du processus par PHP-FPM pour créer la trace de l'erreur, le processus ne redevient pas disponible à cause de l'échec de création de la trace.
    2. Le processus redevient disponible, mais rentre dans une boucle.

    Pour résoudre ce problème, désactivez l'option "request_slowlog_timeout":

    ${cmdProxy} sed -i \
        -e 's/^request_slowlog_timeout/;request_slowlog_timeout/' \
      '/etc/php5/fpm/pool.d/'*'.conf'

    Rechargez la configuration de PHP-FPM:

    ${cmdProxy} service 'php5-fpm' 'force-reload'

    Remerciements

    Maggie a écrit :
    19/07/2013 12:32
    Je rencontre quelques soucis sur wheezy. Après avoir suivi les instructions et l'ayant déjà fait sur d'autres serveurs (sous squeeze), j'ai un problème sur lequel je bloque depuis une dizaine d'heures. Je ne comprends pas, j'ai même formaté la machine.
    (2)No such file or directory: FastCGI: failed to connect to server "/var/lib/apache2/fastcgi/php5.fastcgi": connect() failed
    FastCGI: incomplete headers (0 bytes) received from server "/var/lib/apache2/fastcgi/php5.fastcgi"

    Je ne comprends pas ce problème..
    Pierre-Yves Landuré a écrit :
    19/07/2013 13:49
    Il y avait un bug dans la dernière version de ce guide:

    lancez :

    if [ -e '/etc/php5/fpm/pool.d/www.conf' ]; then
      command sed -i \
          -e 's|^listen =.*$|listen = /var/run/php5-fpm.sock|' \
          -e 's|^;*request_terminate_timeout.*|request_terminate_timeout = 605|' \
          -e 's|^;*pm.status_path.*|pm.status_path = /php-fpm-status|' \
          -e 's|^;*ping.path.*|ping.path = /php-fpm-ping|' \
          '/etc/php5/fpm/pool.d/www.conf'
    fi

    puis

    /etc/init.d/php5-fpm restart
    Pierre-Yves Landuré a écrit :
    19/07/2013 13:41
    Bonjour,

    cela signifie que le serveur php-fpm n'est pas démarré. Veuillez lancer:

    /etc/init.d/php5-fpm start

    et vérifier dans le fichier journal si tout se passe bien:

    tail -n 200 -f '/var/log/php5-fpm.log'

    N'hésitez-pas à utiliser le formulaire de contact de ce site pour une aide plus détaillée.

    Sincèrement,
    Pierre-Yves Landuré
    Maggie a écrit :
    19/07/2013 15:32
    Ça a marché, merci. Mais maintenant je rencontre une nouvelle erreur :

    FastCGI: server "/var/lib/apache2/fastcgi/php5.fastcgi" stderr: Primary script unknown

    Une idée ? :)
    Pierre-Yves Landuré a écrit :
    19/07/2013 16:07
    Bonjour,

    avez-vous essayé de redémarrer Apache 2 ?:

    /etc/init.d/apache2 force-reload
    Maggie a écrit :
    19/07/2013 16:36
    Oui, je l'avais déjà redémarré. J'ai quand même un peu d'expérience, même si j'utilise vos guides.
    Maggie a écrit :
    19/07/2013 16:52
    Dans le cas de plusieurs VHOST, je peux mettre listen = /var/run/MON_USER.sock ?
    Si je met autre chose que /var/run/php5-fpm.sock, j'ai la première erreur.

    Désolé d'abuser de votre temps.
    Pierre-Yves Landuré a écrit :
    19/07/2013 16:58
    Bonjour,

    si vous souhaitez avoir un utilisateur différent par vhost, et non une configuration PHP commune, il vous faut créer plusieurs pool PHP-FPM (un par vhost). Ce n'est pas décrit dans ce guide.

    le fichier .sock est créé par le pool php5-fpm.

    Sincèrement,
    Pierre-Yves Landuré
    Pierre-Yves Landuré a écrit :
    19/07/2013 16:56
    Je ne voulais pas être désobligeant. Je m'excuse si cela pouvait sembler être le cas.

    Je n'ai pas vraiment d'idée, mis à part une incohérence entre la valeur listen dans /etc/php5/fpm/pool.d/www.conf
    et le chemin renseigné dans '/etc/apache2/mods-available/php5-fpm.load'

    N'hésitez pas à me contacter par téléphone (voir mentions légales) si vous n'arrivez pas à résoudre le problème.

    Sincèrement,
    Pierre-Yves Landuré
    Maggie a écrit :
    19/07/2013 17:08
    Je vous remercie pour vos réponses et vos services. Vous n'avez pas été désobligeant, votre question est logique :)
    Ajouter un commentaire

    Vous pouvez ajouter un commentaire en complétant le formulaire ci-dessous. Le format doit être plain text. Les url et les courriels sont transformés en liens cliquables. Les commentaires sont modérés.