Der Pilgermaske Blog

der andere blog - Willkommen!

Http/2, PHP-fpm, MPM-event: Webserver-Party 2.0

- Veröffentlicht unter Linux von

Auf einen Webserver muss nicht unbedingt Http/2 aktiviert sein. Wir können auch bei Http/1.1 bleiben. Http/1.1 überträgt die Webseiten in menschen-lesbaren Stream, es macht für jede Übertragung vom Webserver zum Browser mehrere TCP Verbindungen auf und es liefert, was abgefragt wird. Punkt. Damit hat im Internet 20 Jahre lang die Auslieferung von Webseiten funktioniert.

Mit Http/2 hat eine Entwicklergruppe einen Standard entwickelt, der auf neue Anforderungen im Internet – wie Sicherheit und Performance – reagiert.

Http/2 liefert Webseiten nicht mehr als menschen-lesbaren sondern als binären Stream aus. Außerdem ermöglicht Http/2 parallele Verbindungen über einen(!) TCP connect und über die Http/2-eigene push Funktion, können vorhersehbare Anforderungen im Client cache bereitgelegt werden. Mehrere Webseiten zum Thema berichten, dass Http/2 damit fast doppel so schnell wie Http/1.1 ist.

Und? Warum sollte Admina Http/2 aktivieren? Natürlich geht es um Performance. Mittlerweile hat es sich bestimmt herum gesprochen, dass Google für seine Suchmaschine verschiedene Parameter auswertet, um Seiten entsprechend im Suchergebnis zu platzieren. Je schneller der Seitenaufbau, umso weiter vorne im Suchergebnis. Auch die Sicherheit ist für Google relevant: Eine binäre Übertragung ist da schon ansprechender als ein menschen-lesbarer Stream. Davon abgesehen, dass Http/2 auf einen Entwurf basiert, der vormals von Google (siehe SPDY) vorgelegt wurde.

Http/2 finde ich super – aber wie aktivieren?

Erst einmal sollten wir mal die Voraussetzungen klären. Und die sind einfach: Apache2 ab Version 2.4.17 und eine verschlüsselte Übertragung (also Https) eingerichtet. Laut RFC keine Voraussetzung – allerdings zeigen verschiedene Browser (z.B. Chrome, FF) nur bei verschlüsselten Verbindungen Seiten über Http/2 an. Also:

  • TLS/Https für den Webserver einrichten
  • Setze in /etc/apache2/apache2.conf folgenden Eintrag: Protocols h2 h2c http/1.1
  • Aktiviere das Apache2 Modul http2: a2enmod http2

Damit wird Http/2 für alle virtuellen Hosts auf dem Webserver aktiviert. Der Eintrag h2c ist optional – er aktiviert Http/2 ohne verschlüsselte Verbindung. Wenn du Http/2 nur für einen bestimmten virtuellen Host aktivieren willst, dann setze den Eintrag in deine VHost Konfiguration. Starte den Apache2 einmal durch. Fertig.

Http/2 sehen wollen

Sicherlich kennst Du als Admina die Seite ssllabs.com und dort kannst Du deinen Webserver testen. Im Abschnitt ‘HTTP Requests’ siehst Du einen Eintrag ‘upgrade: h2’ der Dir sagt, dass auf deinen Webserver Http/2 aktiviert ist. Welche Aufrufe mit welcher Http Version von deinem Webserver beantwortet wurden, zeigt auch ein Webreport von GoAccess:

GoAccess Report Seite

Allerdings sagt dein Apache Webserver log noch etwas anderes:

[mpm_prefork:notice] [pid 2031] AH00169: caught SIGTERM, shutting down 
[Sat Jul 20 11:17:47.358412 2019] [http2:warn] [pid 2558] AH10034: The mpm module (prefork.c)
is not supported by mod_http2. The mpm determines how things are processed in your server. HTTP/2
has more demands in this regard and the currently selected mpm will just not do.
This is an advisory warning. Your server will continue to work, but the HTTP/2 protocol will be inactive.

Tja, war noch nix. Standard wird Apache2 bei Ubuntu mit mpm_prefork ausgeliefert und Http/2 läuft nicht mit mpm_prefork – was diese Meldung auch sagt. SSLabs erkennt also das Http/2 Potential des Servers, zeigt aber auch, dass der Webserver alle Seiten mit Http/1.1 ausliefert (ähnlich so):

ssllabs.com Bericht

Also müssen wir noch das Apache2 mpm Modul von ‘prefork’ auf ‘event‘ umstellen (mpm_workers funktioniert auch). Dafür können wir die fertig vorliegenden Module von Apache2 benutzen. Aber kommen wir gleich zum entscheidenden Harken an der Sache! Das PHP Modul funktioniert nicht mit mpm_event. Tja.

PHP Umbau

Ich wage zu behaupten, dass so gut wie jeder Webserver irgendwas mit PHP ausliefert. Also können wir das nicht ignorieren. Aber es gibt eine Lösung. Kurz: de-aktiviere PHP für den Apache, installiere PHP-fpm und aktiviere dann mpm_event. Dazu habe ich mal eine kleine Liste erstellt, wie was an- und ausgeknipst oder installiert werden muss:

apt install php7.2-fpm libapache2-mod-fcgid
a2dismod php7.2 mpm_prefork
a2enmod proxy_fcgi setenvif actions alias http2 mpm_event
a2enconf php7.2-fpm

Das Ergebnis sieht dann folgendermaßen aus:

a2enmod proxy_fcgi setenvif actions alias http2 mpm_event

Considering dependency proxy for proxy_fcgi:
Module proxy already enabled
Module proxy_fcgi already enabled
Module setenvif already enabled
Module actions already enabled
Module alias already enabled
Module http2 already enabled
Considering conflict mpm_worker for mpm_event:
Considering conflict mpm_prefork for mpm_event:
Module mpm_event already enabled

Interessant ist dabei die Ausgabe von ps -ax und top oder htop vor und nach dem Umbau. Beachte, wie sich die Apache2 und PHP Prozesse ändern. Das Ergebnis ist, dass PHP-fpm, nach unseren Umbau, ständig läuft. Ich denke, dass dies den entscheidenden Performance Gewinn von Http/2 (in Verbindung mit mpm_event) ausmacht.

Linux Konsole Ausgabe ps ax

Einen sehr guten Artikel mit ausgiebiger Betrachtung/Vergleich von verschiedenen mpm Modulen und PHP Installationen findet sich hier.

Zusätzlich finde ich an PHP-fpm interessant, dass sogenannte ‘pool’s angelegt werden können. Standard ist der pool ‘www’ aktiv, in dem verschiedene PHP Optionen konfiguriert werden. Wenn ich aber z.B. für ein Monitoring Tool bestimmte/vielleicht gegensätzliche PHP Einstellungen brauche, kann ich diese z.B. als pool ‘monitor’ konfigurieren und über die vhost Konfiguration diesen pool für meine Webanwendung Monitoring verwenden. Interessante Sache. Und so sieht Http/2 auf ssllabs.com aktiv und im Einsatz aus:

ssllabs.com Bericht http2

Alternativ gibt es hier noch eine Seite für einen anderen http/2 online check. Einen sehr guten Artikel zu PHP-fpm mit Beispielen wie pools eingerichtet werden, findet sich hier.

Dreimal testen erspart einen Gang

Ich würde einen Umstieg von Http/1.1 auf Http/2 auf einen produktiven Webserver vorher ausgiebig auf einen Testserver prüfen. Zu klären wäre, ob alle Anwendungen auf dem Server mit der Bereitstellung von PHP-fpm funktionieren. Auch das kein menschen-lesbarer Stream vom Server kommt, könnte z.B. Analyse Tools blockieren. Letztlich ist zu testen, wie viel Auslastung auf dem Webserver durch Besucher mit einem mpm Modul ‘event’ (oder ‘worker’) entsteht.

Zum Performance Gewinn kann ich sagen, dass selbst in meiner kleinen Testumgebung ein subjektiv spürbarer schnellerer Aufbau der Webseiten zu beobachten ist. Ich bleibe mal dabei…

Comments