PHP-FPM (FastCGI Process Manager) est une alternative à l'implémentation FastCGI de PHP avec quelques fonctionnalités supplémentaires utiles pour les sites à fort trafic. C'est la méthode préférée de traitement des pages PHP avec NGINX et elle est plus rapide que les méthodes traditionnelles basées sur CGI telles que SUPHP ou mod_php
pour exécuter un script PHP.
Le principal avantage de l'utilisation de PHP-FPM est qu'il utilise une quantité considérable de mémoire et de processeur en moins par rapport à toute autre méthode d'exécution de PHP. La principale raison est qu'il diabolise PHP, le transformant ainsi en un processus d'arrière-plan tout en fournissant un script CLI pour gérer les requêtes PHP.
Prérequis de configuration PHP-FPM NGINX
- Vous pouvez ouvrir une session SSH sur votre système Ubuntu 18.04 en utilisant root ou un utilisateur activé sudo.
- Vous avez déjà installé NGINX et PHP dans votre système Ubuntu 18.04.
Étapes de configuration de NGINX PHP-FPM
- Installer PHP-FPM
- Configurer le pool PHP-FPM
- Configurer NGINX pour PHP-FPM
- Tester la configuration PHP-FPM de NGINX
1. Installer PHP-FPM
Nginx ne sait pas comment exécuter son propre script PHP. Il a besoin d'un module PHP comme PHP-FPM pour gérer efficacement les scripts PHP. PHP-FPM, d'autre part, s'exécute en dehors de l'environnement NGINX en créant son propre processus. Par conséquent, lorsqu'un utilisateur demande une page PHP, le serveur nginx transmet la demande au service PHP-FPM à l'aide de FastCGI.
L'installation de php-fpm dans Ubuntu 18.04 dépend de PHP et de sa version. Consultez la documentation de PHP installé avant de procéder à l'installation de FPM sur votre serveur. En supposant que vous avez déjà installé la dernière version de PHP 7.3, vous pouvez installer FPM à l'aide de la commande apt-get suivante.
# apt-get install php7.3-fpm
Le service FPM démarrera automatiquement, une fois l'installation terminée. Vous pouvez le vérifier à l'aide de la commande systemd suivante :
# systemctl status php7.3-fpm
● php7.3-fpm.service - The PHP 7.3 FastCGI Process Manager
Loaded: loaded (/lib/systemd/system/php7.3-fpm.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2019-02-17 06:29:31 UTC; 30s ago
Docs: man:php-fpm7.3(8)
Main PID: 32210 (php-fpm7.3)
Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec"
Tasks: 3 (limit: 1152)
CGroup: /system.slice/php7.3-fpm.service
├─32210 php-fpm: master process (/etc/php/7.3/fpm/php-fpm.conf)
├─32235 php-fpm: pool www
└─32236 php-fpm: pool www
2. Configurer le pool PHP-FPM
Le service php-fpm crée un pool par défaut dont la configuration (www.conf) se trouve dans /etc/php/7.3/fpm/pool.d
dossier. Vous pouvez personnaliser le pool par défaut selon vos besoins. Mais c'est une pratique courante de créer des pools séparés pour avoir un meilleur contrôle sur l'allocation des ressources à chaque processus FPM.
De plus, la séparation du pool FPM leur permettra de s'exécuter indépendamment en créant son propre processus maître. Cela signifie que chaque application php peut être configurée avec ses propres paramètres de cache à l'aide de PHP-FPM. Une modification de la configuration d'un pool ne vous oblige pas à démarrer ou à arrêter le reste des pools FPM.
Créons un pool FPM pour exécuter efficacement une application PHP via un utilisateur distinct. Pour commencer, créez un nouvel utilisateur qui aura des droits exclusifs sur ce pool :
# groupadd wordpress_user
# useradd -g wordpress_user wordpress_user
Naviguez maintenant vers le répertoire de configuration FPM et créez un fichier de configuration à l'aide de votre éditeur de texte préféré comme vi :
# cd /etc/php/7.3/fpm/pool.d
# vi wordpress_pool.conf
[wordpress_site]
user = wordpress_user
group = wordpress_user
listen = /var/run/php7.2-fpm-wordpress-site.sock
listen.owner = www-data
listen.group = www-data
php_admin_value[disable_functions] = exec,passthru,shell_exec,system
php_admin_flag[allow_url_fopen] = off
; Choose how the process manager will control the number of child processes.
pm = dynamic
pm.max_children = 75
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.process_idle_timeout = 10s
Les options de configuration FPM ci-dessus et leurs valeurs sont décrites ci-dessous.
- [wordpress_site] :le nom du pool et doit être unique parmi tous les noms de pool.
- utilisateur et groupe :L'utilisateur et le groupe sous lesquels le pool sera exécuté.
- écouter :Le nom du fichier socket pour ce pool.
- listen.owner et listen.group :Doit correspondre à l'utilisateur et au groupe sur lesquels NGINX s'exécute. Dans notre cas, il s'agit de www-data.
- php_admin_value :Permet de définir des valeurs de configuration php personnalisées.
- php_admin_flag :Permet de définir des drapeaux booléens PHP.
- pm :les paramètres du gestionnaire de processus et la valeur sont dynamiques signifient que le nombre de processus enfants est défini dynamiquement en fonction des directives suivantes.
- pm.max_children :Le nombre maximum d'enfants qui peuvent être en vie en même temps.
- pm.start_servers :Le nombre d'enfants créés au démarrage.
- pm.min_spare_servers :Le nombre minimum d'enfants en état "inactif" (en attente de traitement). Si le nombre de processus inactifs est inférieur à ce nombre, des enfants seront créés.
- pm.max_spare_servers :Le nombre maximum d'enfants en état d'inactivité (en attente de traitement). Si le nombre de processus inactifs est supérieur à ce nombre, certains enfants seront tués.
- pm.process_idle_timeout :Le nombre maximal souhaité de processus serveur inactifs. Utilisé uniquement lorsque la valeur pm est définie sur dynamique.
Outre les paramètres ci-dessus, il est également possible de transmettre quelques variables d'environnement système au service php-fpm en utilisant quelque chose comme env['PHP_FOO'] = $bar
.
Par exemple, l'ajout des options suivantes dans le fichier de configuration ci-dessus définira le nom d'hôte et l'emplacement du dossier temporaire sur l'environnement PHP.
...
...
env[HOSTNAME] = $HOSTNAME
env[TMP] = /tmp
...
...
En outre, les paramètres des gestionnaires de processus dans le fichier de configuration de pool ci-dessus sont définis sur dynamique. Choisissez un paramètre qui correspond le mieux à vos besoins.
Les autres options de configuration du gestionnaire de processus sont :
Une fois que vous avez terminé de créer le fichier de configuration ci-dessus, redémarrez le service fpm pour appliquer les nouveaux paramètres :
# systemctl start php7.3-fpm
Le pool FPM sera créé immédiatement pour servir les pages php. N'oubliez pas que vous pouvez créer un service systemd distinct en spécifiant le fichier de configuration FPM ci-dessus, ce qui vous permet de démarrer/arrêter ce pool sans affecter les autres pools.
3. Configurer NGINX pour PHP-FPM
Créez maintenant un bloc de serveur NGINX qui utilisera le pool FPM ci-dessus. Pour ce faire, éditez votre fichier de configuration NGINX et transmettez le chemin du fichier socket du pool en utilisant l'option fastcgi_pass
à l'intérieur du bloc d'emplacement pour php.
server {
listen 80;
server_name example.journaldev.com;
root /var/www/html/wordpress;
access_log /var/log/nginx/example.journaldev.com-access.log;
error_log /var/log/nginx/example.journaldev.com-error.log error;
index index.html index.htm index.php;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php7.2-fpm-wordpress-site.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
}
Bloc serveur NGINX
Assurez-vous que le paramètre de configuration ci-dessus est syntaxiquement correct et redémarrez NGINX.
# nginx-t
# systemctl restart nginx
4. Tester la configuration PHP-FPM NGINX
Pour tester si le fichier de configuration NGINX ci-dessus utilise effectivement le pool FPM nouvellement créé, créez un fichier d'informations php à l'intérieur de la racine Web. J'ai utilisé /var/www/html/wordpress
en tant que racine Web dans le fichier de configuration NGINX ci-dessus. Ajustez cette valeur en fonction de votre environnement.
# cd /var/www/html/wordpress
# echo "<?php echo phpinfo();?>" > info.php
Une fois que vous avez terminé de créer la page d'informations PHP, pointez-y votre navigateur Web préféré.
Vous remarquerez que la valeur de $_SERVER['USER']
et $_SERVER['HOME']
la variable pointe vers wordpress_user
et /home/wordpress_user
respectivement que nous avons défini précédemment dans le fichier de configuration FPM et confirme ainsi que le NGINX sert les pages php en utilisant notre pool FPM souhaité.
Test NGINX PHP-FPM
Résumé
Dans cet article, nous avons appris à installer php-fpm et à configurer des pools séparés pour différents utilisateurs et applications. Nous avons également appris à configurer un bloc serveur NGINX pour se connecter à un service PHP-FPM. PHP-FPM offre fiabilité, sécurité, évolutivité et rapidité ainsi que de nombreuses options de réglage des performances. Vous pouvez maintenant diviser le pool PHP-FPM par défaut en plusieurs pools de ressources pour servir différentes applications. Cela améliorera non seulement la sécurité de votre serveur, mais vous permettra également d'allouer les ressources du serveur de manière optimale !