PHP est partout et est sans le doute le langage de programmation le plus utilisé sur le Web. Toutefois, PHP n’est pas reconnu pour sa performance, mais plutôt pour sa flexibilité et sa facilité d’intégration avec Apache et Nginx.
Ceci dit, Il y a plusieurs choses que vous pouvez faire pour améliorer la performance de PHP. La première chose à faire est d’installer PHP-FPM. PHP-FPM, qui signifie PHP FastCGI Process Manager, permet de gérer les requêtes PHP reçues du serveur Web, Apache ou Nginx en occurence.
PHP-FPM brille surtout lorsque vient le temps de traiter un haut volume de requêtes concurrentes. Par conséquent, pour un site Web avec peu de traffic, l’utilisation de PHP-FPM ne présente peut-être pas un gain appréciable.
Dans ce tutoriel, nous verrons comment installer et configurer PHP-FPM sur un serveur Ubuntu 19.04.
Étape #1: Installation de Apache, PHP 7.2, et PHP-FPM
Dans un premier temps, désactivez AppArmor:
service apparmor stop update-rc.d -f apparmor remove apt-get remove apparmor apparmor-utils
Procédez à la mise à jour du système d’exploitation et des paquets installés.
apt update -y && sudo apt upgrade -y && sudo apt autoremove -y
Installez ensuite Apache, PHP, et PHP-FPM:
apt-get -y install apache2 apache2-doc apache2-utils libapache2-mod-php php7.2 php7.2-common php7.2-gd php7.2-mysql php7.2-imap php7.2-cli php7.2-cgi libapache2-mod-fcgid apache2-suexec-pristine php-pear mcrypt imagemagick libruby libapache2-mod-python php7.2-curl php7.2-intl php7.2-pspell php7.2-recode php7.2-sqlite3 php7.2-tidy php7.2-xmlrpc php7.2-xsl memcached php-memcache php-imagick php-gettext php7.2-zip php7.2-mbstring php-soap php7.2-soap php7.2-fpm php7.2-opcache php-apcu
Étape #2: Configuration du serveur Web Apache
Afin de prévenir les attaques HTTPOXY, créez le fichier httpoxy.conf
:
nano /etc/apache2/conf-available/httpoxy.conf
Insérez-y ensuite ces directives:
<IfModule mod_headers.c> RequestHeader unset Proxy early </IfModule>
Sauvegardez le fichier et quittez l’éditeur. Activez le module créé:
a2enconf httpoxy
Activez ensuite les modules Apache nécessaires:
a2enmod suexec rewrite ssl actions include cgi dav_fs dav auth_digest headers proxy_fcgi alias
Si le pare-feu est actif, ajoutez une règle permettant l’accès aux ports 80 et 443:
ufw allow 'Apache Full' ufw delete allow 'Apache'
Activez et redémarrez ensuite le service apache2
:
systemctl enable apache2 systemctl restart apache2
Vérifiez ensuite que le serveur Web répond bien:
D’ailleurs, profitez-en pour vérifier que PHP est fonctionnel. Pour ce, créez un fichier nommé « info.php » dans « /var/www/html »:
nano /var/wwww/html/info.php
Copiez le contenu suivant dans le fichier:
<?php phpinfo(); ?>
Sauvegardez le fichier puis accédez-y depuis votre navigateur Web:
Comme vous pouvez le constater, PHP est actif, toutefois il n’est pas pris en charge par PHP-FPM mais plutôt par le module Apache.
Étape #3: Activation de PHP-FPM
Afin d’activer PHP-FPM comme engin PHP par défaut, tapez cette commande:
a2enconf php7.2-fpm
Activez et démarrez PHP-FPM:
systemctl enable php7.2-fpm systemctl start php7.2-fpm
Rechargez ensuite la configuration d’Apache:
systemctl reload apache2
Étape #4: Configuration de PHP-FPM pour le site Web principal
Lorsqu’on installe Apache, les fichiers du site Web par défaut se trouvent dans « /var/www/html ». Afin d’y accéder, le serveur Apache utilise le compte « www-data ».
Assurez-vous que les droits d’accès sont corrects:
chown -R www-data.www-data /var/www/html
Éditez ensuite le fichier de configuration de l’hôte virtuel créé par défaut:
nano /etc/apache2/sites-enabled/000-default.conf
Insérez ces directives avant la balise de fermeture « </VirtualHost> »:
[...]
<Directory /var/www/html>
AllowOverride All
</Directory>
<IfModule proxy_fcgi_module>
# Enable http authorization headers
<IfModule setenvif_module>
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
</IfModule>
<FilesMatch ".+\.ph(ar|p|tml)$">
SetHandler "proxy:unix:/run/php/php7.2-fpm.sock|fcgi://localhost"
</FilesMatch>
<FilesMatch ".+\.phps$">
# Deny access to raw php sources by default
# To re-enable it's recommended to enable access to the files
# only in specific virtual host or directory
Require all denied
</FilesMatch>
# Deny access to files without filename (e.g. '.php')
<FilesMatch "^\.ph(ar|p|ps|tml)$">
Require all denied
</FilesMatch>
</IfModule>
</VirtualHost>
</IfModule>
Rechargez la configuration d’Apache:
systemctl reload apache2
Rafraîchissez maintenant la page « info.php » et vérifiez que PHP-FPM est bel et bien actif:
Étape #5: Configuration de PHP-FPM pour un hôte virtuel
Dans bien des cas, un seul serveur Web peut héberger plusieurs sites qui doivent être isolés les uns des autres au niveau de la couche PHP. Afin d’éviter que les scripts PHP puissent d’un site puissent accéder aux fichiers d’un autre site, il faut utiliser des pools PHP-FPM distincts.
Pour ce tutoriel, nous allons donc créer un hôte virtuel pour le domaine « webmestre101.home.lan ». Commencez par créer le compte d’utilisateur:
adduser webmestre101
Créez ensuite le répertoire qui contiendra les fichiers du site Web:
sudo -u webmestre101 mkdir /home/webmestre101/public_html chmod -R 0755 /home/webmestre101/public_html chmod +x /home/webmestre101
Copiez ensuite le fichier de configuration PHP-FPM du site Web principal puis éditez-le:
cp /etc/php/7.2/fpm/pool.d/www.conf /etc/php/7.2/fpm/pool.d/webmestre101.home.lan.conf nano /etc/php/7.2/fpm/pool.d/webmestre101.home.lan.conf
Effectuez les modifications identifiées en rouge:
; Start a new pool named 'webmestre101'. ; the variable $pool can be used in any directive and will be replaced by the ; pool name ('www' here) [webmestre101] ; Per pool prefix ; It only applies on the following directives: ; - 'access.log' ; - 'slowlog' ; - 'listen' (unixsocket) ; - 'chroot' ; - 'chdir' ; - 'php_values' ; - 'php_admin_values' ; When not set, the global prefix (or /usr) applies instead. ; Note: This directive can also be relative to the global prefix. ; Default Value: none ;prefix = /path/to/pools/$pool ; Unix user/group of processes ; Note: The user is mandatory. If the group is not set, the default user's group ; will be used. user = webmestre101 group = webmestre101 ; The address on which to accept FastCGI requests. ; Valid syntaxes are: ; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on ; a specific port; ; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on ; a specific port; ; 'port' - to listen on a TCP socket to all addresses ; (IPv6 and IPv4-mapped) on a specific port; ; '/path/to/unix/socket' - to listen on a unix socket. ; Note: This value is mandatory. listen = /run/php/php7.2-fpm-webmestre101.sock php_admin_value[open_basedir] = /home/webmestre101 ; Set listen(2) backlog. ; Default Value: 511 (-1 on FreeBSD and OpenBSD) ;listen.backlog = 511
Sauvegardez la configuration et relancez le service PHP-FPM:
systemctl restart php7.2-fpm
Vous pouvez ensuite vérifier que le nouveau pool PHP-FPM est actif:
root@ubuntu-server:/etc/php/7.2/fpm# ps ax | grep fpm 30000 ? Ss 0:00 php-fpm: master process (/etc/php/7.2/fpm/php-fpm.conf) 30020 ? S 0:00 php-fpm: pool webmestre101 30021 ? S 0:00 php-fpm: pool webmestre101 30022 ? S 0:00 php-fpm: pool www 30023 ? S 0:00 php-fpm: pool www 30028 pts/0 S+ 0:00 grep --color=auto fpm
Copiez maintenant le fichier de configuration de l’hôte virtuel par défaut puis éditez-le:
cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/webmestre101.home.lan.conf nano /etc/apache2/sites-available/webmestre101.home.lan.conf
Modifiez le fichier comme suit:
<VirtualHost *:80> # The ServerName directive sets the request scheme, hostname and port that # the server uses to identify itself. This is used when creating # redirection URLs. In the context of virtual hosts, the ServerName # specifies what hostname must appear in the request's Host: header to # match this virtual host. For the default virtual host (this file) this # value is not decisive as it is used as a last resort host regardless. # However, you must set it for any further virtual host explicitly. ServerName webmestre101.home.lan ServerAdmin webmaster@localhost DocumentRoot /home/webmestre101/public_html # Available loglevels: trace8, ..., trace1, debug, info, notice, warn, # error, crit, alert, emerg. # It is also possible to configure the loglevel for particular # modules, e.g. #LogLevel info ssl:warn ErrorLog ${APACHE_LOG_DIR}/webmestre101.home.lan-error.log CustomLog ${APACHE_LOG_DIR}/webmestre101.home.lan-access.log combined <Directory /home/webmestre101/public_html> AllowOverride All Require all granted </Directory> <IfModule proxy_fcgi_module> # Enable http authorization headers <IfModule setenvif_module> SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1 </IfModule> <FilesMatch ".+\.ph(ar|p|tml)$"> SetHandler "proxy:unix:/run/php/php7.2-fpm-webmestre101.sock|fcgi://localhost" </FilesMatch> <FilesMatch ".+\.phps$"> # Deny access to raw php sources by default # To re-enable it's recommended to enable access to the files # only in specific virtual host or directory Require all denied </FilesMatch> # Deny access to files without filename (e.g. '.php') <FilesMatch "^\.ph(ar|p|ps|tml)$"> Require all denied </FilesMatch> </IfModule> # For most configuration files from conf-available/, which are # enabled or disabled at a global level, it is possible to # include a line for only one particular virtual host. For example the # following line enables the CGI configuration for this host only # after it has been globally disabled with "a2disconf". #Include conf-available/serve-cgi-bin.conf </VirtualHost>
Sauvegardez la configuration puis quittez l’éditeur. Activez ensuite le nouvel hôte virtuel:
ln -s /etc/apache2/sites-available/webmestre101.home.lan.conf /etc/apache2/sites-enabled/webmestre101.home.lan.conf
Redémarrez le service apache2
:
systemctl reload apache2
Copiez ensuite le fichier info.php
créé précédemment:
cp /var/www/html/info.php /home/webmestre101/public_html/ chown webmestre101.webmestre101 /home/webmestre101/public_html/info.php
Accédez maintenant à « info.php » avec votre navigateur Web. Vérifiez que PHP-FPM est bien actif:
Défilez jusqu’à la section « Environment » et vérifiez que PHP-FPM utilise le compte spécifié dans la configuration:
Vérifiez aussi la valeur du paramètre « open_basedir » afin de vous assurer que les scripts PHP soient restreints au répertoire de l’utilisateur « webmestre101 »:
Si vous devez modifier la de configuration de PHP pour un hôte virtuel, sachez les paramètres PHP appliqués dans les fichiers de configuration d’Apache n’ont aucun effet. Vous devez toujours modifier le fichier de configuration du pool PHP-FPM.