Installation de PHP 7 FPM avec Nginx sous Debian 8

23 août 2016

Bonjour,

Aujourd’hui nous allons voir comment installer PHP 7 avec Nginx sous Debian 8 (Jessie) en utilisant PHP-FPM.

Afin de disposer de la dernière version à jour de Nginx et PHP, nous allons utiliser les dépôts alternatif DotDeb : https://www.dotdeb.org/instructions/

Ajout du dépôt Dotdeb :

echo "deb http://packages.dotdeb.org jessie all" >> /etc/apt/sources.list.d/dotdeb.list
wget -O- https://www.dotdeb.org/dotdeb.gpg | apt-key add -

Ce qui devrait vous retourner un « OK » à la fin, signifiant que la clef permettant de vérifier l’intégrité des paquets proposés par le dépôt est bien installée.

Pour finir, on met à jour la liste des paquet d’un simple

apt update

et on vérifie que le serveur est bien à jour avec un

apt upgrade

Installation de Nginx

apt install nginx-full

et c’est tout. Nginx est désormais installé sur votre serveur et écoute sur le port 80.

Installation de PHP7 et de quelques dépendances

apt install php7.0 php7.0-fpm php7.0-mysql php7.0-curl php7.0-json php7.0-gd php7.0-mcrypt php7.0-memcached php7.0-intl php7.0-sqlite3 php7.0-gmp php7.0-geoip php7.0-mbstring php7.0-xml php7.0-zip

Si tout se passe bien et que vous n’obtenez aucunes erreur, PHP7 est désormais installé sur votre serveur et est prêt à être utilisé 🙂

Tout est prêt, il nous reste plus qu’a créer un pool FPM et un vhost Nginx afin que notre site soit accessible.

Exemples de pool FPM

Avec PHP-FPM, il faut définir la configuration des processus PHP, leurs limitations, etc.

Je vous conseil d’utiliser un pool FPM par site internet (vhost). Cela a plusieurs avantages : bonne gestion des ressources en définissant par exemple un nombre limite de process PHP pouvant être actif simultanément, etc.

Voici l’un des pools FPM que j’utilise actuellement sur l’un de mes serveurs dont la tâche est d’héberger une instance de NextCloud :

/etc/php/7.0/fpm/pool.d/nextcloud.conf

[nextcloud]
user = www-data
group = www-data

listen = /run/php/php7-fpm-pool_$pool.sock

listen.owner = www-data
listen.group = www-data
;listen.mode = 0660

process.priority = 0

pm = ondemand
pm.max_children = 50
pm.process_idle_timeout = 90s;
pm.max_requests = 1000
pm.status_path = /fpm-status-$pool

;access.log = log/$pool.access.log
;access.format = « %R – %u %t \ »%m %r%Q%q\ » %s %f %{mili}d %{kilo}M %C%% »
;slowlog = log/$pool.log.slow
;request_slowlog_timeout = 2
;request_terminate_timeout = 0

;rlimit_files = 99999
;rlimit_core = unlimited

catch_workers_output = yes

;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com
;php_flag[display_errors] = on
php_admin_value[error_log] = /var/log/fpm-php/pool_$pool.log
php_admin_flag[log_errors] = on
;php_admin_value[memory_limit] = 32M

env[PATH] = /sbin:/bin:/usr/sbin:/usr/bin

Ce qui nous intéresse dans ce fichier sont les directives listen et pm.* :

listen /run/php/php7-fpm-pool_$pool.sock -> il s’agit du socket qui sera créé et utilisé par Nginx pour envoyer les requêtes sur le serveur PHP. Pas très intéressant, mais vous devrez modifier cette valeur à chaque nouveau pool FPM.

pm = ondemand -> ici, on défini comment sont gérés les processus PHP. ondemand signifie qu’au démarrage de PHP-FPM, il n’y a pas de processus en attente de requête, ceux-ci étant spawnés à la volée par le processus PHP-FPM maître.

pm.max_children = 50 -> valeur très importante. En effet, celle-ci définie le nombre de processus php pouvant être à un instant T actif pour ce pool. Ici en l’occurence, il ne pourra pas y avoir plus de 50 requêtes PHP en cours de traitement simultanément. Très utile pour limiter les ressources allouées a tel ou tel site et éviter une surcharge du serveur en cas d’attaque ou de processus qui plante.

pm.max_requests = 1000 -> définie le nombre de requêtes PHP pouvant être traités par le même processus PHP avant que celui-ci ne soit détruit et recréé. Cela peut être utile avec certaine application mal développé/optimisé et permet de limiter les memory leak.

pm.process_idle_timeout = 90s -> dernière valeur extrêmement intéressante, elle défini le temp avant que les processus inactif ne soit détruit afin de libérer les ressources systèmes. Il est intéressant d’utiliser cette valeur lors de l’utilisation du gestionnaire « ondemand » puisque le but est d’avoir le moins de processus actif.

Concernant les autres directives ou bien les différents gestionnaires existant (ondemand/static/dynamic), je vous laisse parcourir la documentation de PHP-FPM : https://secure.php.net/manual/fr/install.fpm.configuration.php

Exemple de vhost nginx :

/etc/nginx/sites-available/monvhost

server {
listen 80 default_server;
server_name toto.tld www.toto.tld;
# on force une redirection vers la version https du site en conservant l’URI
return 301 https://$server_name$request_uri;
}

server {
listen 443 ssl default_server;
server_name toto.tld www.toto.tld;
root /var/www/html/monvhost/;

location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/run/php/php7-fpm-pool_nextcloud.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_intercept_errors on;
fastcgi_ignore_client_abort off;
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffers 4 256k;
fastcgi_buffer_size 128k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
}

location / {
try_files $uri $uri/ =404;
}

location ~ /\.ht {
deny all;
}

access_log /var/log/nginx/nextcloud_access.log;
error_log /var/log/nginx/nextcloud_error.log;

ssl_certificate /etc/letsencrypt/live/monvhost.tld/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/monvhost.tld/privkey.pem;

}

Ne pas oublier de modifier la directive
fastcgi_pass unix:/run/php/php7-fpm-pool_nextcloud.sock;
afin d’indiquer le socket (la direction listen de votre pool FPM) PHP-FPM.

Validation

Il ne reste plus que de procéder à l’activation de votre vhost Nginx en faisant un petit lien symbolique vers le dossier site-enabled de Nginx :

ln -s /etc/nginx/site-enabled/monvhost /etc/nginx/site-available/monvhost

On redémarre l’ensemble des démons :

service nginx restart
service php7.0-fpm restart

On crée un fichier php de test :

echo "<?php phpinfo(); " >> /var/www/html/monvhost/infos.php

et on tente d’y accéder via l’URL https://monvhost.tld/infos.php et la page phpinfo devrait s’afficher sans problème indiquant que tout est fonctionnel 🙂

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

*