Comment installer PHP 7.2 et PHP-FPM sur CentOS 7

tutoriel php

PHP-FPM, ou PHP FastCGI Process Manager, est une implémentation alternative de PHP FastCGI qui permet de gérer un haut volume de requêtes. Combiné à PHP 7, PHP-FPM permet d’atteindre un niveau de performance supérieur à toutes les versions précédentes de PHP.

Dans ce tutoriel, nous verrons comment installer et configurer PHP 7.2 et PHP-FPM sur un serveur CentOS.

Étape #1: Préparatifs

Dans un premier temps, désactivez SElinux:

setenforce 0

Modifiez le fichier de configuration de SELinux:

vi /etc/selinux/config

Changez la valeur du paramètre « SELINUX » à « disabled »:

# This file controls the state of SELinux on the system. 
# SELINUX= can take one of these three values: 
#     enforcing - SELinux security policy is enforced. 
#     permissive - SELinux prints warnings instead of enforcing. 
#     disabled - No SELinux policy is loaded. 
SELINUX=disabled 
# SELINUXTYPE= can take one of three values: 
#     targeted - Targeted processes are protected, 
#     minimum - Modification of targeted policy. Only selected processes are protected.  
#     mls - Multi Level Security protection. 
SELINUXTYPE=targeted 

Sauvegardez le fichier et quittez l’éditeur. Redémarrez ensuite le serveur:

shutdown -r now

Une fois le serveur redémarré, procédez à la mise à jour du système d’exploitation et des paquets installés.

yum update -y

Sur un serveur CentOS 7, vous devez installer le groupe de paquets « Development Tools ». Débutez par importer la clé GPG:

rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY*

Ajoutez ensuite le dépôt EPEL. Celui-ci contient la majorité des paquets que nous installerons plus tard:

yum install -y epel-release

Finalement, installez le groupe « Development Tools » ainsi que le paquet « yum-utils »:

yum -y groupinstall 'Development Tools'
yum -y install yum-utils

Étape #2: Installation de Apache, PHP 7.2, et PHP-FPM

Sur CentOS 7, la version PHP 5.6 est installée par défaut. Il faut donc ajouter et activer le dépôt REMI afin d’installer PHP 7.

yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum-config-manager --enable remi-php72

Installez ensuite Apache, PHP, et PHP-FPM:

yum -y install httpd mod_ssl php php-zip php-fpm php-devel php-gd php-imap php-ldap php-mysql php-odbc php-pear php-xml php-xmlrpc php-pecl-apc php-mbstring php-mcrypt php-soap php-tidy curl curl-devel perl-libwww-perl ImageMagick libxml2 libxml2-devel mod_fcgid php-cli httpd-devel php-fpm php-intl php-imagick php-pspell wget

Étape #3: Configuration du service Apache

Ajoutez la règle d’entête HTTP suivante à la configuration d’Apache:

echo "RequestHeader unset Proxy early" >> /etc/httpd/conf/httpd.conf

Cette règle de sécurité prévient les attaques exploitant la vulnérabilité HTTPOXY. Activez et redémarrez ensuite le service httpd:

systemctl enable httpd
systemctl restart httpd

Vérifiez ensuite que le serveur Web répond bien:

centos page de test apache

Étape #4: Configuration de PHP-FPM pour le site Web principal

Sur un nouveau serveur CentOS, les fichiers du site Web principal se trouvent dans /var/www/html. Le service Apache accède à ce dossier en tant qu’utilisateur « apache », soit le compte d’utilisateur du service.

Par défaut, PHP est configuré comme module Apache. Pour en faire la vérification, créez un fichier nommé info.php dans /var/www/html:

vi /var/www/html/info.php

Copiez le contenu suivant dans le fichier:

<?php phpinfo(); ?>

Accédez maintenant à ce fichier depuis le Web:

centos apache module php

Le module Apache 2.0 Handler gère actuellement les processus PHP. Nous allons changer cela pour PHP-FPM.

Configuration de PHP-FPM

Afin que les requêtes PHP soient gérées par PHP-FPM, créez deux répertoires pour contenir les fichiers de configuration:

mkdir /etc/php-fpm.d/sites-enabled
mkdir /etc/php-fpm.d/sites-available

Modifiez ensuite le fichier de configuration de PHP-FPM:

vi /etc/php-fpm.conf

Changez la ligne suivante:

include=/etc/php-fpm.d/*.conf

Pour:

include=/etc/php-fpm.d/sites-enabled/*.conf

Déplacez ensuite le fichier www.conf dans le sous-répertoire sites-available:

mv /etc/php-fpm.d/www.conf /etc/php-fpm.d/sites-available

Créez ensuite un lien vers www.conf dans sites-enabled:

ln -s /etc/php-fpm.d/sites-available/www.conf /etc/php-fpm.d/sites-enabled/www.conf

Créez un répertoire pour accueillir les fichiers de sockets PHP-FPM:

mkdir /var/run/php-fpm

Modifiez ensuite le fichier de configuration www.conf:

vi /etc/php-fpm.d/sites-available/www.conf

Pour des raisons de performances, nous allons utiliser un socket plutôt qu’une connexion réseau pour les communications entre les services Apache et PHP-FPM. Trouvez le paramètre listen:

listen = 127.0.0.1:9000

Et modifiez-le ainsi:

listen = /var/run/php-fpm/default.sock

Vous devez maintenant spécifier quel utilisateur écoutera sur le « socket ». Trouvez les lignes suivantes:

;listen.owner = nobody 
;listen.group = nobody 
;listen.mode = 0660

Retirez le point-virgule devant chacun des paramètres et modifiez-les ainsi:

listen.owner = apache
listen.group = apache
listen.mode = 0660

Défilez jusqu’au bas du fichier www.conf et profitez-en pour activer le module OPCache:

php_value[opcache.file_cache]  = /var/lib/php/opcache

Sauvegardez le fichier puis quittez l’éditeur. Activez et démarrez le service php-fpm:

systemctl enable php-fpm
systemctl start php-fpm

Configuration de Apache

Pour utiliser PHP-FPM sur le site Web principal, vous devez créer un hôte virtuel par défaut pour le port 80. Créez le fichier de configuration default.conf:

vi /etc/httpd/conf.d/default.conf

Copiez les directives suivantes dans le fichiers:

<VirtualHost _default_:80> 
       DocumentRoot "/var/www/html" 

       <Directory "/var/www/html"> 
               # allow from all 
               Order deny,allow 
               Options FollowSymLinks SymLinksIfOwnerMatch 
               Require all granted 
               AllowOverride All 
               php_admin_value open_basedir /var/www/html 
       </Directory> 

       ErrorLog logs/default-error_log 
       LogLevel warn 
       TransferLog logs/default-access_log 
       CustomLog logs/default-request_log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" 

       SuexecUserGroup apache apache 

       <Proxy "unix:/var/run/php-fpm/default.sock|fcgi://php-fpm"> 
               ProxySet disablereuse=off 
        </Proxy> 

       <FilesMatch \.php$> 
               SetHandler proxy:fcgi://php-fpm 
       </FilesMatch> 
</VirtualHost>

Sauvegardez le fichier et quittez l’éditeur.

Lors de l’installation du paquet mod_ssl, un fichier ssl.conf est créé afin d’activer le module SSL pour Apache. Ce fichier contient les directives pour l’hôte virtuel par défaut pour le port 443 (HTTPS). Modifiez ce fichier:

vi /etc/httpd/conf.d/ssl.conf

À la fin du fichier, insérez les directives pour PHP-FPM, avant la fermeture de la section VirtualHost:

# [...]
#   Per-Server Logging: 
#   The home of a custom SSL log file. Use this when you want a 
#   compact non-error SSL logfile on a virtual host basis. 
CustomLog logs/ssl_request_log \ 
         "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" 

SuexecUserGroup apache apache 
<Proxy "unix:/var/run/php-fpm/default.sock|fcgi://php-fpm"> 
  ProxySet disablereuse=off 
</Proxy> 
<FilesMatch \.php$> 
  SetHandler proxy:fcgi://php-fpm 
</FilesMatch> 

</VirtualHost>

Redémarrez ensuite le service httpd:

systemctl restart httpd

Rafraîchissez la page info.php afin de vérifier que PHP-FPM est bien fonctionnel:

phpinfo php-fpm fastcgi

Étape #5: Configuration de PHP-FPM pour un hôte virtuel

Il est fréquent qu’un serveur Web héberge plusieurs sites et souvent, chacun de ces sites appartient à un utilisateur différent. Afin d’éviter que PHP puisse accéder aux fichiers de tous et chacun, différentes instances de PHP-FPM (appelées « pool ») doivent être exécutées sous des comptes d’utilisateur différents.

Configuration de PHP-FPM

Dans un premier temps, créez un compte d’utilisateur ainsi qu’un répertoire pour le nouveau site Web:

adduser webmestre102
sudo -u webmestre102 mkdir /home/webmestre102/public_html
chmod -R +s /home/webmestre102
chmod -R 0755 /home/webmestre102

Il aussi préférable de créer un répertoire pour isoler les fichiers de session PHP:

sudo -u webmestre102 mkdir -p /home/webmestre102/var/lib/php/session

Copiez le fichier de configuration par défaut pour PHP-FPM puis modifiez le nouveau fichier:

cp /etc/php-fpm.d/sites-available/www.conf /etc/php-fpm.d/sites-available/webmestre102.conf
vi /etc/php-fpm.d/sites-available/webmestre102.conf

Modifiez le nom de l’instance:

; Start a new pool named 'www'. 
; the variable $pool can we used in any directive and will be replaced by the 
; pool name ('www' here) 
[webmestre102] 

Entrez le nom d’utilisateur ainsi que le groupe qu’utilisera PHP-FPM pour exécuter les scripts PHP:

; Unix user/group of processes 
; Note: The user is mandatory. If the group is not set, the default user's group 
;       will be used. 
; RPM: apache user chosen to provide access to the same directories as httpd 
user = webmestre102 
; RPM: Keep a group allowed to write in log dir. 
group = webmestre102

Changez le nom du fichier de socket:

listen = /var/run/php-fpm/webmestre102.sock

La valeur des paramètres listen.owner et listen.group doit demeurer la même:

listen.owner = apache 
listen.group = apache 
listen.mode = 0660

À la toute fin du fichier, modifiez le paramètre session.save_path:

php_value[session.save_path] = /home/webmestre102/var/lib/php/session

Sauvegardez le fichier. Quittez l’éditeur et créez un lien symbolique vers le fichier dans sites-enabled:

ln -s /etc/php-fpm.d/sites-available/webmestre102.conf /etc/php-fpm.d/sites-enabled/webmestre102.conf 

Relancez le service PHP-FPM:

systemctl restart php-fpm

Vérifiez ensuite que le nouveau pool est actif:

ps ax | grep php-fpm
13746 ?        Ss     0:00 php-fpm: master process (/etc/php-fpm.conf) 
13747 ?        S      0:00 php-fpm: pool webmestre102 
13748 ?        S      0:00 php-fpm: pool webmestre102 
13749 ?        S      0:00 php-fpm: pool webmestre102 
13750 ?        S      0:00 php-fpm: pool webmestre102 
13751 ?        S      0:00 php-fpm: pool webmestre102 
13752 ?        S      0:00 php-fpm: pool www 
13753 ?        S      0:00 php-fpm: pool www 
13754 ?        S      0:00 php-fpm: pool www 
13755 ?        S      0:00 php-fpm: pool www 
13756 ?        S      0:00 php-fpm: pool www 
13760 pts/0    S+     0:00 grep --color=auto php-fpm

Fichier de configuration de l’hôte virtuel

Le nouveau pool PHP-FPM étant prêt, créez un fichier de configuration pour l’hôte virtuel:

vi /etc/httpd/conf.d/webmestre102.com.conf

Insérez les directives suivantes:

<VirtualHost *:80> 
       DocumentRoot "/home/webmestre102/public_html" 
       ServerName webmestre102.com 
       ServerAlias www.webmestre102.com 

       <Directory "/home/webmestre102/public_html"> 
               # allow from all 
               Order deny,allow 
               Options FollowSymLinks SymLinksIfOwnerMatch 
               Require all granted 
               AllowOverride All 
               php_admin_value open_basedir /home/webmestre102 
       </Directory> 

       ErrorLog logs/webmestre102.com-error_log 
       LogLevel warn 
       TransferLog logs/webmestre102.com-access_log 
       CustomLog logs/webmestre102.com-request_log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" 

       SuexecUserGroup webmestre102 webmestre102 

       <Proxy "unix:/var/run/php-fpm/webmestre102.sock|fcgi://php-fpm"> 
               ProxySet disablereuse=off 
        </Proxy> 

   <FilesMatch \.php$> 
       SetHandler proxy:fcgi://php-fpm 
   </FilesMatch> 

</VirtualHost>
<VirtualHost *:443> 
       DocumentRoot "/home/webmestre102/public_html" 
       ServerName webmestre102.com 
       ServerAlias www.webmestre102.com 

       <Directory "/home/webmestre102/public_html"> 
               # allow from all 
               Order deny,allow 
               Options FollowSymLinks SymLinksIfOwnerMatch 
               Require all granted 
               AllowOverride All 
               php_admin_value open_basedir /home/webmestre102 
       </Directory> 

       ErrorLog logs/webmestre102.com-ssl_error_log 
       LogLevel warn 
       TransferLog logs/webmestre102.com-ssl_access_log 
       CustomLog logs/webmestre102.com-ssl_request_log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" 

       SuexecUserGroup webmestre102 webmestre102 

       <Proxy "unix:/var/run/php-fpm/webmestre102.sock|fcgi://php-fpm"> 
           ProxySet disablereuse=off 
       </Proxy> 

       <FilesMatch \.php$> 
          SetHandler proxy:fcgi://php-fpm 
       </FilesMatch> 

   # SSLEngine on 
   # SSLCertificateFile /etc/pki/tls/webmestre102.com/webmestre102.com.pem 
   # SSLCertificateKeyFile /etc/pki/tls/webmestre102.com/webmestre102.com.key 
   # SSLCertificateChainFile /etc/pki/tls/webmestre102.com/chain.pem 

</VirtualHost>

Sauvegardez le fichier et quittez l’éditeur. 

Notez que cette configuration d’hôte virtuel génèrera une erreur de certificat SSL puisqu’un qu’aucun certificat valide n’est configuré.

Redémarrez le service Apache:

systemctl restart httpd

Copiez le fichier info.php créé à l’étape #4 dans le répertoire de l’hôte virtuel:

cp /var/www/html/info.php /home/webmestre102/public_html
chown -R webmestre102:webmestre102 /home/webmestre102

Accédez maintenant à info.php sur le site Web du nouvel hôte virtuel. Assurez-vous que FPM/FastCGI est maintenant en charge des processus PHP:

php-fpm hote virtuel

Défilez plus bas, jusqu’à la section Environment et vérifiez que les variables User et Home à l’utilisateur créé pour cet hôte virtuel:

php environment user home virtual host

Ainsi, il sera impossible pour les scripts PHP d’accéder à quoi que ce soit en dehors de /home/webmestre102 et les fichiers créés par PHP appartiendront à l’utilisateur webmestre102.

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.