De Nginx à Apache : remplacer Nginx par Apache sans perdre les données du site Web et avec le minimum de temps d'arrêt

Introduction

Voici un tuto pour implémenter Apache MPM Event associé au PHP-FPM sur les distributions Fedora / CentOS / Red Hat !

J’ai mis en production Nginx depuis plusieurs mois et l’essai, à vrai dire, est peu concluant. Complexité de la configuration, complication à mettre en place Awstats, pas de .htaccess, modules à compiler du fait de leur indisponibilité, plantages intempestifs inexpliqués … Du coup, j’ai décidé de revenir à ce bon vieux Apache, plus riche, plus simple.

Apache en mode PHP-FPM : Nginx utilise le PHP en mode CGI, en s’appuyant sur PHP-FPM (PHP FastCGI Process Manager). Vous pouvez en faire de même sur un serveur Apache.

Pré-requis

Première étape

Installez php-fpm

...@...:~$ sudo apt install php-fpm

Configurez PHP-FPM : créez un fichier de pool par site, sur la base du fichier /etc/php/7.4/fpm/pool.d/www.conf (Remplacez www par le nom de votre site) :

(...)
#~ [www]
[monsite]
(...)
; 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 = www-data
group = www-data
; 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.4-fpm.sock
(...)
; Set permissions for unix socket, if one is used. In Linux, read/write
; permissions must be set in order to allow connections from a web server. Many
; BSD-derived systems allow connections regardless of permissions.
; Default Values: user and group are set as the running user
; mode is set to 0660
listen.owner = www-data
listen.group = www-data
;listen.mode = 0660
; When POSIX Access Control Lists are supported you can set them using
; these options, value is a comma separated list of user/group names.
; When set, listen.owner and listen.group are ignored
#~ ;listen.acl_users =
#~ ;listen.acl_groups =
listen.acl_users = www-data
listen.acl_groups = www-data
; List of addresses (IPv4/IPv6) of FastCGI clients which are allowed to connect.
; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original
; PHP FCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address
; must be separated by a comma. If this value is left blank, connections will be
; accepted from any ip address.
; Default Value: any
#~ ;listen.allowed_clients = 127.0.0.1
listen.allowed_clients = 127.0.0.1
(...)

modules Apache :Utilisez le module multi-processus Event : Éditez avec les droits d'administration le fichier /etc/httpd/conf.modules.d/00-mpm.conf pour le modifier comme ceci :

#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
LoadModule mpm_event_module modules/mod_mpm_event.so

Pour éviter les conflits, éditez avec les droits d'administration le fichier /etc/httpd/conf.modules.d/00-proxy.conf pour désactiver les modules qui ne sont pas nécessaires :

LoadModule proxy_module modules/mod_proxy.so
#LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
#LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
#LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
#LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so
#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
#LoadModule proxy_connect_module modules/mod_proxy_connect.so
#LoadModule proxy_express_module modules/mod_proxy_express.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
#LoadModule proxy_fdpass_module modules/mod_proxy_fdpass.so
#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
#LoadModule proxy_http_module modules/mod_proxy_http.so
#LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
#LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so

Configuration du VirtualHost : Dans la configuration du VirtualHost, ajoutez les directives correspondant au mode socket

<VirtualHost *:80>
DocumentRoot "/home/www"
ServerAdmin dszalkowski@gmail.com
ServerName 195.154.102.202:80
ServerAlias 2001:bc8:34b7:200::
ErrorLog logs/srv2-error_log
CustomLog logs/srv2-access_log combined env=!dontlog
#En mode socket
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php-fpm/srv2.sock|fcgi://127.0.0.1"
</FilesMatch>
#En mode application Tcp/Ip
#ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/home/www/$1
</VirtualHost>

Autres étapes

Conclusion

Problèmes connus

Voir aussi

(fr) https://www.dsfc.net/infra/lamp-infrastructure/abandon-de-nginx-pour-apache-et-php-fpm/

Basé sur << Abandon de Nginx pour Apache et PHP-FPM >> par Denis Szalkowski.