Documentation du Dr FRAPPE

Ce wiki regroupe les résultats de mes expériences en informatique accumulés au cours de mes recherches sur le net.

Dans la mesure du possible, j'ai cité mes sources ; il en manque certainement… :-)

Ceci est une ancienne révision du document !


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
    ; Start a new pool named 'www'.
    ; the variable $pool can be used in any directive and will be replaced by the
    ; pool name ('www' here)
    #~ [www]
    [monsite]
     
    ; 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 = 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 listen(2) backlog.
    ; Default Value: 511 (-1 on FreeBSD and OpenBSD)
    ;listen.backlog = 511
     
    ; 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