Comment installer Apache, PHP 7 et PHP-FPM sur Ubuntu 19.04

Publié par Stéphane Brault

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:

apache2 ubuntu default page

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:

ubuntu phpinfo

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:

ubuntu phpinfo php-fpm

É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:

ubuntu php-fpm hote virtuel

Défilez jusqu’à la section « Environment » et vérifiez que PHP-FPM utilise le compte spécifié dans la configuration:

ubuntu php-fpm environment utilisateur

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 »:

ubuntu php-fpm open_basedir

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.

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.