Table des matières

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

  1. Installez php-fpm

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

  2. 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) :
    /etc/php/7.4/fpm/pool.d/monsite.conf
    (...)
    #~ [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
    (...)
  1. modules Apache :
    1. 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 :
      /etc/httpd/conf.modules.d/00-mpm.conf
      #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
  2. 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 :
    /etc/httpd/conf.modules.d/00-proxy.conf
    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
  3. 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


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