Recherche de site Web

Comment connecter NGINX à PHP-FPM à l'aide d'un socket UNIX ou TCP/IP


Le serveur Web NGINX (en tant que proxy inverse) sert les applications PHP via le protocole FastCGI (en tant que serveur d'applications backend). NGINX utilise PHP-FPM (FastCGI Process Manager), une implémentation alternative de PHP FastCGI qui s'exécute en arrière-plan en tant que démon, à l'écoute de Requêtes CGI. Il est doté de fonctionnalités supplémentaires conçues pour alimenter des sites Web ou des applications Web très chargés, mais il peut être utilisé pour des sites de toute taille.

Non seulement PHP-FPM prend en charge la configuration des pools de ressources FastCGI, mais il améliore également de nombreux composants internes de FastCGI et augmente les rapports d'erreurs, les scripts. résiliation, et bien plus encore. Il propose la diabolisation PHP, la gestion des processus, un nombre dynamique de processus à partir desquels les requêtes peuvent provenir, un en-tête d'erreur, une prise en charge du téléchargement accéléré, etc.

Pour accepter les requêtes FastCGI de NGINX, PHP-FPM peut écouter sur un socket TCP/IP ou sur un domaine UNIX. prise. Quelle que soit l'adresse que vous choisissez d'utiliser, c'est celle que NGINX utilise pour se connecter (requêtes de proxy) à PHP-FPM, en utilisant la directive fastcgi_pass.

Ce guide explique comment configurer NGINX pour serveur d'applications PHP à l'aide de PHP-FPM. Il décrit quand utiliser un socket TCP/IP ou un socket de domaine UNIX pour connecter NGINX à PHP-FPM et pourquoi.

Ce guide suppose que NGINX et PHP-FPM sont installés sur votre système Linux. Sinon, consultez :

  • Comment installer le serveur LEMP sur CentOS 8
  • Comment installer la pile LEMP PhpMyAdmin sur le serveur Ubuntu 20.04
  • Comment installer NGINX, MySQL/MariaDB et PHP sur RHEL 8
  • Comment installer LEMP sur le serveur Debian 10

Que dois-je utiliser : Socket de domaine UNIX ou Socket TCP/IP ?

Les sockets de domaine UNIX (ou IPC) sont un moyen de communication inter-processus (IPC) qui permet un échange de données efficace entre les processus exécutés sur le même système d'exploitation tandis que TCP Les sockets /IP (ou Internet Domain) permettent aux processus de communiquer sur un réseau.

Contrairement à un socket TCP/IP qui identifie un serveur par une adresse IP et un port (par exemple 127.0.0.1:9000), vous pouvez lier un serveur à un socket de domaine UNIX en utilisant un chemin de fichier (par exemple /run/php-fpm/www.sock), qui est visible dans le système de fichiers.

Un socket de domaine UNIX est un type spécial de fichier : les autorisations de fichier et de répertoire s'y appliquent (comme c'est le cas pour tout autre type de fichier UNIX) et peuvent être utilisées pour restreindre les processus sur l'hôte qui peuvent lire et écrire dans le fichier. (et ainsi communiquer avec le serveur backend).

De cette façon, un socket de domaine UNIX est sécurisé car seuls les processus sur l'hôte local peuvent l'utiliser. Un socket TCP/IP peut être exposé à Internet, ce qui présente un risque de sécurité à moins que des mesures de sécurité supplémentaires telles qu'un pare-feu ne soient mises en œuvre.

Il est important de noter que l'utilisation d'un socket de domaine UNIX n'est pas la même chose que l'utilisation d'un socket TCP/IP en termes de performances. Plusieurs tests et benchmarks ont prouvé que les sockets de domaine UNIX sont plus rapides. Le principal inconvénient des sockets de domaine UNIX est qu'ils sont moins évolutifs, ils ne prennent en charge que la communication inter-processus au sein du même système d'exploitation (OS).

Où puis-je configurer l'adresse d'écoute PHP-FPM ?

Vous pouvez configurer l'adresse sur laquelle PHP-FPM écoute dans un fichier de configuration de pool de ressources. Notez qu'avec PHP-FPM, vous pouvez exécuter plusieurs pools de processus avec des paramètres différents. Le pool par défaut s'appelle www.

L'emplacement du fichier de configuration du pool de ressources dépend de la manière dont PHP et PHP-FPM sont installés sur un système Linux (qu'il s'agisse d'une version par défaut/unique ou de plusieurs versions simultanément). .

Par exemple, sur CentOS 8, avec une seule version, tous les fichiers de configuration PHP se trouvent dans le répertoire /etc et dans le répertoire PHP-FPM par défaut. Le fichier de configuration du pool (www) est /etc/php-fpm.d/www.conf :

Pour répertorier tous les fichiers de configuration PHP, utilisez la commande ls suivante.

ls /etc/php*

Sur Ubuntu 20.04, les fichiers de configuration PHP se trouvent dans le répertoire /etc/php// et dans le répertoire PHP-FPM par défaut. Le fichier de configuration du pool (www) est /etc/php//fpm/pool.d/www.conf :

ls /etc/php/7.4/

Configuration de PHP-FPM pour écouter sur un socket de domaine UNIX

Pour configurer PHP-FPM pour écouter sur un socket de domaine UNIX, ouvrez votre fichier de configuration de pool PHP-FPM par défaut, à l'aide de votre éditeur de texte préféré.

sudo vim /etc/php/7.4/fpm/pool.d/www.conf	#Ubuntu/Debian
OR
vim /etc/php-fpm.d/www.conf			#CentOS/RHEL/Fedora

Recherchez ensuite la directive d'écoute et définissez-la sur le chemin d'accès au fichier du socket de domaine UNIX comme suit. Notez que la plupart des installations utilisent par défaut un socket de domaine UNIX.

listen = /run/php/php7.4-fpm.sock	#Ubuntu/Debian
OR
listen = /run/php-fpm/www.sock		#CentOS/RHEL/Fedora

Si vous utilisez un socket de domaine UNIX, vous devez également définir les autorisations de lecture/écriture appropriées pour le fichier, afin d'autoriser les connexions à partir du serveur Web NGINX. Par défaut, NGINX s'exécute en tant qu'utilisateur et groupe nginx sur CentOS/RHEL/Fedora et www-data sur Ubuntu et Debian.

Alors, recherchez les paramètres listen.owner et listen.group et définissez-les en conséquence. Définissez également le mode sur 0660 à l'aide du paramètre listen.mode.

------------- On Debian and Ubuntu -------------
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

------------- On CentOS/RHEL and Fedora  -------------
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

Notez que si les autorisations sur le fichier de socket de domaine UNIX ne sont pas définies correctement, NGINX peut renvoyer une erreur de passerelle incorrecte.

Configuration de PHP-FPM pour écouter sur un socket TCP/IP

Bien qu'un socket de domaine UNIX soit plus rapide qu'un socket TCP/IP, le premier est moins évolutif, car il ne peut prendre en charge la communication inter-processus que sur le même système d'exploitation. Si NGINX et le serveur d'applications backend (PHP-FPM) s'exécutent sur des systèmes différents, vous devrez configurer PHP-FPM pour écouter sur un socket TCP/IP pour les connexions.

Dans le fichier de configuration du pool PHP-FPM, définissez l'adresse listen comme suit. Assurez-vous que le port que vous avez choisi n'est pas utilisé par un autre processus ou service sur le même système.

listen = 127.0.0.1:3000

Configuration de NGINX pour fonctionner avec le serveur d'applications PHP-FPM

Une fois que vous avez configuré l'adresse sur laquelle PHP-FPM écoute, vous devez configurer NGINX pour lui envoyer une requête proxy via cette adresse, en utilisant le fastcgi_pass paramètre de configuration, dans un fichier de configuration de bloc de serveur virtuel.

Par exemple, si le fichier de configuration de votre site Web est /etc/nginx/conf.d/example.com.conf, ouvrez-le pour le modifier.

vim /etc/nginx/conf.d/example.com.conf 

Recherchez le bloc location pour traiter les fichiers .php et définissez le paramètre fastcgi_pass comme suit, si vous avez configuré PHP-FPM pour écouter sur un UNIX. socket de domaine.

fastcgi_pass unix:/run/php/php7.4-fpm.sock	#Ubuntu/Debian
OR
fastcgi_pass unix:/run/php-fpm/www.sock		#CentOS/RHEL/Fedora

Ou utilisez une adresse TCP/IP si vous avez configuré PHP-FPM pour écouter sur un socket TCP/IP. Si le serveur d'applications backend (PHP-FPM) s'exécute sur un serveur distinct (remplacez 10.42.0.10 par l'adresse IP de la machine sur laquelle le serveur PHP-FPM FastCGI est en cours d'exécution).

fastcgi_pass  10.42.0.10:3000;

Important : Sur CentOS 8, PHP-FPM est défini comme un serveur en amont dans le / fichier etc/nginx/conf.d/php-fpm.conf, dans un bloc en amont, avec le nom php-fpm.

Vous pouvez apporter des modifications ici en conséquence en fonction de l'adresse sur laquelle PHP-FPM est configuré pour écouter, dans le fichier de configuration du pool. La configuration par défaut pointe vers un socket de domaine UNIX.

upstream php-fpm {
        server unix:/run/php-fpm/www.sock;
}

et dans le fichier de blocage du serveur de votre site, définissez simplement le paramètre fastcgi_pass comme indiqué.

fastcgi_pass php-fpm;

Après avoir modifié les configurations PHP-FPM et NGINX, vérifiez l'exactitude de leur syntaxe de configuration comme suit.

------------- On Debian and Ubuntu -------------
sudo php-fpm -t
sudo nginx -t

------------- On CentOS/RHEL and Fedora  -------------
php-fpm -t
nginx -t

Bien que le résultat de la commande affiche uniquement le fichier de configuration principal, tous les autres fichiers de configuration sont également inclus et vérifiés.

Ensuite, vous devez redémarrer les deux services pour appliquer les modifications, à l'aide de la commande systemctl.

------------- On Debian and Ubuntu -------------
sudo systemctl restart nginx
sudo systemctl restart php7.4-fpm

------------- On CentOS/RHEL and Fedora  -------------
systemctl restart nginx
systemctl restart php-fpm

Si vous obtenez des erreurs, vous pouvez vérifier les fichiers journaux NGINX et PHP-FPM à l'aide de la commande cat.

------------- On Debian and Ubuntu -------------
cat /var/log/nginx/error.log
cat /var/log/php7.4-fpm.log

------------- On CentOS/RHEL and Fedora  -------------
cat /var/log/nginx/error.log
cat /var/log/php-fpm/www-error.log

C'est tout ce que nous avions pour vous. La section commentaires ci-dessous peut être utilisée pour poser des questions. Pour plus d'informations, consultez la documentation NGINX et la documentation PHP-FPM.