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.

Weiterlesen