1. Bascule du serveur HTTP en mode event

Depuis l'origine de la distribution, le serveur utilise le MPM prefork.

Pour des raisons évidentes de performance, il a été décidé de suivre les recommandations du projet et d'utiliser event par défaut.

Ce changement est aussi nécessaire pour bénéficier du support complet du protocole HTTP/2 via mod_http2.

2. Le problème de mod_php

Le module mod_php est uniquement supporté quand le MPM prefork est utilisé.

Dans la documentation PHP on peut lire :

Avertissement : Nous ne recommandons pas l'utilisation de PHP dans un environnement threadé MPM, avec Apache 2.

Et effectivement, quelques rapports de bugs signalent des plantages dans cette configuration.

Il n'était donc pas raisonnable de conserver mod_php par défaut.

De plus ce module a d'autres limitations ennuyeuses :

  • intégré au serveur web, il partage son espace mémoire, pouvant entrainer des problèmes de sécurité
  • une seule version peut être chargée

3. Utilisation de FastCGI

Depuis plusieurs années nous avons travaillé à rendre l'exécution de PHP aussi flexible que possible, dans différentes configurations, fonctionnant sans changement de configuration :

  • httpd + mod_php
  • httpd + php-fpm (lorsque mod_php est désactivé ou absent et que le serveur php-fpm fonctionne)
  • nginx + php-fpm

L'utilisation de FPM est devenu la configuration par défaut recommandée pour une exécution propre de PHP :

  • support de multiples serveurs web (apache httpd, nginx, lighttpd)
  • isolation du frontal pour la sécurité
  • dorsaux multiples
  • architecture micro-services
  • fonctionnement en container (docker)
  • multiples versions de PHP

4. FPM par défaut

Depuis Fedora 27, mod_php ZTS (multi-thread) est toujours fournit, mais n'est plus activé, c'est donc FastCGI qui sera utilisé par défaut.

Pour ne pas casser les configurations existantes lors de la mise à jour, ou obtenir un serveur opérationnel dès l'installation, nous avons choisi de mettre en place quelques solutions, probablement de manière temporaire

  • Le paquet php a une dépendance optionnelle sur php-fpm qui permet son installation par défaut
  • le service httpd a une dépendance sur le service php-fpm qui permet son démarrage automatique

5. Problèmes connus

5.1. Modification de la configuration

Lors d'une modification de la configuration, ou de l'installation d'une nouvelle extension il est désormais nécessaire de redémarrer le service php-fpm.

5.2. Fichiers de configuration

Avec mod_php, il est habituel d'utiliser les directives php_value ou php_flag dans la configuration du serveur Apache ou dans un fichier .htaccess.

Il est désormais nécessaire soit d'utiliser les directives php_value ou php_flag dans la configuration de du pool FPM, soit d'utiliser un fichier .user.ini dans le dossier de l'application.

5.3 Utilisateurs

Par défaut httpd et php-fpm fonctionnement sur le compte utilisateur apache. Si vous devez le modifier pour httpd, il est aussi nécessaire de corriger la configuration du pool par défaut, dans /etc/php-fpm.d/www.conf

user = foo
listen.acl_users = foo

5.4 timeout et max_execution_time

Si vous augmenter la valeur du max_execution_time de PHP pour quelques scripts longs, vous devez aussi adapter la configuration du timeout côté serveur web.

ProxyTimeout 3000

5.5 error_log

Les erreurs php sont désormais enregistrées dans le fichier configuré pour le pool fpm:

php_admin_value[error_log] = /var/log/php-fpm/www-error.log

6. Revenir sur mod_php

Si vraiment vous souhaitez rester (temporairement) sur mod_php, cela reste possible, au choix :

  • Revenir en MPM prefork dans le fichier /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
  • Activer le chargement du module dans le fichier /etc/httpd/conf.modules.d/15-php.conf. Attention, les rapports de bug dans cette configuration ne seront pas acceptés.
 # ZTS module is not supported, so FPM is preferred
 LoadModule php7_module modules/libphp7-zts.so

Dans ce cas, le paquet php-fpm pourra être désinstallé.

7. Conclusion

Fedora 27 utilise désormais une configuration moderne et conforme aux recommandations des projets. La sécurité et les performances sont améliorées.

Tout changement provoque inévitablement quelques petits problèmes et quelques grincement de dents, mais nous essaierons de prendre en compte les difficultés et d'améliorer ce qui doit l'être dans les prochaines mises à jour et dans les prochaines versions de Fedora.

Je prévois de mettre à jour ce billet en fonction des retours.