Spätestens wenn man versucht, http2 auf Apache2 zum Laufen zu bekommen, wird man sich über php-fpm und dem Multi-Processing-Modul (MPM) mpm_event Gedanken machen müssen. Jedoch spielen hier einige Apache-Module zusammen und man sollte bei der Umstellung nichts überstürzen.
Vor der Umstellung
Die Apache2 Standardinstallation arbeitet mit dem mpm_prefork, das hat vor allem Kompatibilitätsgründe, denn im Vergleich zum wesentlich effizienteren mpm_event startet es für jeden Klienten einen eigenen Prozess, so kann es zwar nicht zu Problemen wegen nicht-threadsicheren Bibliotheken kommen, allerdings zum Preis eines Overheads der durch das Erstellen der Prozesse entsteht. mpm_event startet dagegen nur wenige Prozesse und verwendet dann dynamisch Multithreading, um die Anfragen zu beantworten. Der Nachteil hier ist, dass im Fall eines Fehlers in einem Thread, auch alle anderen Threads dieses Prozesses beendet werden.
Will man allerdings http2 einsetzen, so führt kein Weg herum, denn das http2-Modul ist explizit nicht mit mpm_prefork kompatibel und verabschiedet sich direkt mit einem Eintrag im Error-Log.
Man sollte sich vor der Umstellung vergewissern, dass man keine Module verwendet, die wiederum auf mpm_prefork angewiesen sind. In meinem Fall hatte ich genau das zu spät bemerkt und musste die Umstellung vorerst wieder rückgängig machen, da ich auf das Modul mpm-itk angewiesen war. Dies ermöglicht es jeden vHost unter einem eigenen Nutzer laufen zu lassen. Einen Weg genau das mit mpm_event und php-fpm umzusetzen habe ich hier beschrieben.
Installation der Module
Unter Ubuntu oder Debian können die Pakete einfach mit apt installiert werden. Im Folgenden müssen die Versionsnummern immer der verwendeten angepasst werden. Hier wird beispielshaft PHP 7.2 verwendet.
apt-get install libapache2-mod-fcgid php7.2-fpm
Aktivieren der neuen Module
Zuerst muss das klassische mod_php7.2 und mpm_preforkt deaktiviert und. Anschließend können die neuen Module aktiviert werden:
a2dismod php7.2 mpm_prefork
a2enmod mpm_event fcgid proxy_fcgi actions alias setenvif
php-fpm bringt eine fertige Standardkonfiguration für Apache mit. Diese kann folgendermaßen aktiviert werden:
a2enconf php7.2-fpm
Nun sollte nach einem Neustart von Apache php-fpm zur Verfügung stehen werden. Vorher sollten allerdings die Einstellungen der alten php.ini unter
/etc/php/7.2/apache2/php.ini
in die neue unter
/etc/php/7.2/fpm/php.ini
übertragen werden. Ich ändere statt der php.ini selbst eine Datei 99-custom.ini
im conf.d
Unterverzeichnis, in dem Fall müsste eben nur diese Datei kopiert werden. Also schließlich noch:
service php7.2-fpm restart
service apache2 restart
Wie anschließend http2 aktiviert werden kann, kann hier nachgelesen werden.