Das Protokoll HTTP/2 beim Apache2 Webserver aktivieren

Der Webserver Apache 2.4 unterstützt in der aktuellen Version in Debian Stretch das neue Webprotokoll HTTP/2. Gerade Seiten, die viele Elemente (Bilder, Skripte, CSS) nachladen, werden deutlich beschleunigt. Bei der Aktivierung gilt es jedoch einige Stolperstellen zu umschiffen.

Einrichtung

Das Webprotokoll HTTP/2 kann nur aktiviert werden, wenn der Webserver nicht im MPM-Prefork, sondern im MPM-Event-Modus betrieben wird. In diesem Modus wird aber PHP als Modul nicht unterstützt, daher muss PHP als FPM-Modul betrieben werden. Dies setzt einige Änderungen voraus, auf die ich noch eingehen werde. Die Installation läuft relativ einfach ab.

apt-get install php7.0-fpm

Ich empfehle, die Konfigurationsdatei /etc/php/7.0/fpm/php.ini den eigenen Vorlieben anzupassen. Die bisher verwendete Datei /etc/php/7.0/apache2/php.ini wird nicht weiter verwendet. Hat man dort Änderungen durchgeführt, sollten diese bei der neuen Konfigurationsdatei bei Bedarf übernommen werden.

a2enmod proxy_fcgi setenvif
a2enconf php7.0-fpm
a2dismod php7.0
a2dismod mpm_prefork
a2enmod mpm_event

Die letzten Befehle deaktivieren das bisherige PHP-Modul, ändern den Betriebsmodus des Webservers und aktivieren das Modul PHP-FPM. Nach einen Neustart des Webservers ist die neue Konfiguration gültig.

Webserverkonfiguration anpassen

Befinden sich in der bisherigen Webserver-Konfiguration die Befehle php_value bzw. php_admin_value, so werden diese nicht mehr erkannt. Diese Einstellungen müssen händisch übernommen werden. Dazu legt man für den Ordner, in dem diese gelten sollen, eine Datei mit den Namen .user.ini an. Dort werden die angepassten Einstellungen für PHP hinterlegt. So wird z.B. aus der Zeile

php_admin_value max_execution_time 600

die Zeile in der Datei .user.ini:

max_execution_time=600

Weitere Optionen können in den nachfolgenden Zeilen angefügt werden. Diese gelten dann für alle PHP-Dateien in diesem Ordner und dessen Unterordnern.

Eigene Fehlerseiten

Die Behandlung von Fehlern durch eigene Skripte ist weiterhin möglich, setzt aber einige Änderungen voraus. In der Webserverkonfiguration muss eine zusätzliche Direktive eingefügt werden.

#muss eingefügt werden
ProxyErrorOverride on

ErrorDocument 404 /index.php

Soll das Skript den HTTP-Status-Code zurückgeben, muss dieses jetzt ebenfalls angepasst werden.

#mit libapache2-mod-php
header($_SERVER["SERVER_PROTOCOL"] . " 200 Ok", true, 200);
#oder
http_response_code(200);

#mit php-fpm
header("Status: 200 Ok", true, 200);

Alle Vorkommen in Skripten müssen entsprechend aktualisiert werden.

Aktivierung von HTTP/2

HTTP/2 kann nur auf SSL-gestützten Webseiten aktiviert werden. Dazu muss in VirtualHost-Einträgen das Folgende ergänzt werden.

<IfModule mod_http2.c>
  Protocols h2 http/1.1
</IfModule>

Versteht ein Client kein HTTP/2, fällt der Server automatisch auf das alte Protokoll HTTP/1.1 zurück. Jetzt sollte einem Neustart des Webservers nichts mehr Weg stehen.

systemctl restart apache2