Durch die Umstellung meines Webservers auf http2, war somit auch der Umstieg auf das Multi-Processing Module (MPM) mpm_event, zusammen mit php-fpm besiegelt, da das in die Jahre gekommene mpm_prefork nicht vom http2-Modul unterstützt wird. Bisher hatte ich das Modul mpm_itk verwendet, um die vHosts unter einem eigenen Nutzer auszuführen und somit die Hosts voneinander abzuschirmen. Denn standardmäßig werden alle vHosts unter dem Apache2-Standardnutzer www-data (unter Ubuntu) ausgeführt.

Wie ihr euren Server selbst auf http2 und mpm_event umstellt könnt ihr hier nachlesen.

Wie sich herausstellt, lässt sich das Selbe auch mit mpm_event umsetzten, indem jeder vHost von einem eigenen php-fpm Pool ausgeführt wird.

PHP-FPM Pool erstellen

Die Prozess-Pools werden durch eigene Konfigurationsdateien in

/etc/php/<Version>/fpm/pool.d

konfiguriert. Der Standardpool hat den Namen www und führt alle php-Skripte mit dem Standardnutzer www-data aus. Um einen neuen Pool zu erstellen empfiehlt es sich die Datei www.conf zu kopieren und unter einem anderen Namen abzuspeichern und dort dann die entsprechenden Einstellungen zu ändern.

Mindestens müssen folgende Einstellung geändert werden:

  • Den Namen: Dieser steht zwischen den eckigen Klammern.
  • user und group: Legt den Nutzernamen und die Gruppe fest, mit dem der Pool ausgeführt werden soll. Das ist die entscheidende Einstellung.
  • listen: Die Adresse unter welchen die Anfragen entgegengenommen werden sollen. Das ist standardmäßig ein Unix-Socket, kann aber auch zu einem TCP Socket geändert werden. Siehe dazu am besten die Kommentare innerhalb der Konfigurationsdatei.

Damit steht nach einem Neustart von php-fpm mit

service php7.2-fpm restart

der neue Pool zur Verfügung.

Dennoch lohnt sich noch ein Blick in die Konfigurationsdatei, denn der Pool ist standardmäßig für wenige gleichzeitige Anfragen eingestellt. Dies lässt sich durch Anpassen der pm.* Einstellungen ändern. In manchen Situationen müssen auch die Umgebungsvariablen mit env[***] manuell gesetzt werden. Es empfiehlt sich zudem noch pm.max_requests zu setzten, um gegen Memory Leaks in Bibliotheken geschützt zu sein.

Eine beispielhafte Konfiguration könnte so aussehen:

[www]
user = meinuser
group = meinegruppe
listen = /run/php/php7.2-fpm-meinpool.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.max_requests = 200
vHost auf neuen Pool umschalten

Um einen vHost auf den neuen Pool umzuschalten, wird in dessen Konfiguration ein Handler für alle php-Dateien gesetzt. Dazu wird die Direktive FilesMatch verwendet.

<VirtualHost *:443>
...
<FilesMatch ".+\.ph(ar|p|tml)$">
    SetHandler "proxy:unix:/run/php/php7.2-fpm-meinpool.sock|fcgi://localhost"
</FilesMatch>
...
</VirtualHost>

Trifft die Direktive zu, so wird die Datei an unseren neuen Pool weitergeleitet. Das Modul proxy_fcgi muss dafür aktiviert sein. Es bleibt:

a2enmod proxy_fcgi
service apache2 restart

Ob die Einstellungen wirksam sind, kann zum Beispiel mit phpinfo überprüft werden.