Abandon de Nginx pour Apache et PHP-FPM
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.
Voici un tuto pour implémenter Apache MPM Event associé au PHP-FPM sur les distributions Fedora / CentOS / Red Hat !
Apache en mode PHP-FPM
Le principal intérêt de Nginx est d’utiliser 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.
Installation de PHP-FPM
Sous Linux Fedora 23, vous devez tout d’abord installer le package PHP-FPM :
dnf install php-fpm
Configuration de PHP-FPM
Vous pouvez indifféremment utiliser le PHP-FPM en mode socket ou en application Tcp/Ip. Dans le cas d’un gestion multi-sites, vous devez créer un fichier de pool par site, de préférence, sur la base du fichier /etc/php-fpm.d/www.conf. Dans le fichier d’exemple ci-dessous, j’ai choisi le mode socket !
;Remplacez www par le nom de votre site [srv2] user = apache group = apache #En mode socket listen = /run/php-fpm/srv2.sock #En mode application Tcp/Ip #listen = 127.0.0.1:9000 listen.owner = apache listen.group = apache listen.acl_users = apache listen.acl_groups = apache listen.allowed_clients = 127.0.0.1
Les modules Apache
Au niveau de la gestion des processus, je vous recommande chaudement d’utiliser le module multi-processus Event, parfaitement adapté pour la montée en charge de vos serveurs Apache. Il suffit de modifier le fichier /etc/httpd/conf.modules.d/00-mpm.conf comme suit :
#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
La 2e chose à faire, afin d’éviter les conflits, est de désactiver tous les modules du fichier /etc/httpd/conf.modules.d/00-proxy.conf 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 (les fichiers de configuration sont à ajouter au dossier /etc/httpd/conf.d/), vous devez ajouter les directives correspondant au mode socket ou application Tcp/Ip. Dans l’exemple ci-dessous, le VirtualHost est configuré en 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>