Apache/Apache+HTTP2+PHP-FPM+TLS1.3
Diese Seite beschreibt, wie man Apache so einrichtet, dass es HTTP/2 beherrscht. Dabei wird gleich auch TLS 1.3 und für PHP-Anwendungen PHP-FPM eingerichtet. Die Beispiele sind unter openSUSE entstanden.
Info zu HTTP/2
- https://en.wikipedia.org/wiki/HTTP%2F2
- HTTP/2 mit Nginx mit Erläuterungen zu Request-Analyse mit Browser-Tools: siehe LM 02/21 S.36
PHP-FPM
PHP-FPM wird benötigt, da Apache für HTTP/2 nicht im Prefork-Modus laufen kann, sondern ein anderes Multi-Processing-Modul wie "event" verwendet werden muss (siehe unten). Das Standard-PHP-Modul für Apache funktioniert jedoch nicht mehr mit "event", so dass für PHP-Anwendungen eine andere Lösung implementiert werden muss. PHP-FPM läuft als eigenständiger Dienst und kann sowohl per TCP als auch per Unix Socket angesprochen werden.
Info
- PHP-FPM Apache
- Apache FastCGI and PHP-FPM configuration (SUSE)
- PHP-FPM (cwiki.apache.org)
- HTTP/2.0 Debian 9 Apache 2.4 Umstellung auf php-fpm
- So konfigurieren Sie Apache HTTP mit MPM Event und PHP-FPM unter Ubuntu 18.04
Konfiguration
Datei /etc/php7/fpm/php-fpm.conf: Default-Datei kann verwendet werden.
Datei /etc/php7/fpm/php-fpm.d/www.conf (Erste Variante für TCP, zweite für Unix Socket - geht aber nicht parallel):
user = wwwrun
group = www
listen = 127.0.0.1:9000
listen = /run/php-fpm/php-fpm.sock
listen.owner = wwwrun
listen.group = www
listen.mode = 0660
Tuning der Parameter [1]:
pm = dynamic
pm.max_children = 240
pm.start_servers = 60
pm.min_spare_servers = 60
pm.max_spare_servers = 180
Datei /etc/php7/fpm/php.ini:
- Hier sollte manuell eine Kopie der für Apache gültigen Ini-Datei abgelegt werden.
cp -p /etc/php7/apache2/php.ini /etc/php7/fpm/
- Achtung: Ohne diese Datei fehlen viele Konfigurationseinstellungen!!
Dienst einrichten und starten
systemctl enable php-fpm systemctl start php-fpm
Prüfen
- Prozesse laufen als wwwrun:
ps -ef|grep php-fpm
wwwrun 7295 22565 1 07:43 ? 00:00:08 php-fpm: pool www wwwrun 9294 22565 2 07:51 ? 00:00:00 php-fpm: pool www wwwrun 9406 22565 1 07:51 ? 00:00:00 php-fpm: pool www root 22565 1 0 Nov10 ? 00:00:05 php-fpm: master process (/etc/php7/fpm/php-fpm.conf)
- Datei für Unix Socket (Rechte):
ls -la /run/php-fpm/php-fpm.sock
srw-rw---- 1 wwwrun www 0 10. Nov 15:47 /run/php-fpm/php-fpm.sock
- Für TCP:
netstat -an|grep 9000
- Prüfen per phpinfo():
Configuration File (php.ini) Path /etc/php7/fpm Loaded Configuration File /etc/php7/fpm/php.ini Scan this dir for additional .ini files /etc/php7/conf.d
Fallstricke
AppArmor
- Unter openSUSE läuft AppArmor. Die Default-Konfiguration /etc/apparmor.d/php-fpm schränkt PHP-FPM aber zu sehr ein. Es gibt im Browser einen Fehler "Access denied" bei PHP-Anwendungen.
- AppArmor zum Testen temporär deaktivieren:
aa-teardown aa-status
- Lösung: AppArmor Profile deaktivieren:
aa-disable php-fpm
- Als Ersatz für AppArmor open_basedir in php.ini setzen
- Links
Apache
Info
- Apache HTTP Server unterstützt HTTP/2
- Apache HTTP/2 Modul mod_http2
- Apache HTTP/2 guide / HowTo
- how to h2 in apache
- How to enable HTTP/2 support in Apache
- OpenSuse Leap 15: Apache 2, PHP FPM, HTTP2, ImageMagick
MPM
Als MPM kann für HTTP/2 nicht "prefork" verwendet werden, sondern am besten "event".
MPM aktivieren in Datei /etc/sysconfig/apache2:
APACHE_MPM="event"
PHP Modul
Das Standard-Modul "php7" kann nicht mehr verwendet werden, stattdessen wird "proxy_fcgi" verwendet.
Modul installieren:
zypper in apache2-mod_fcgid
Modul aktivieren in Datei /etc/sysconfig/apache2 ("php7" entfernen):
APACHE_SERVER_FLAGS="... proxy proxy_http proxy_fcgi"
Modul konfigurieren in Datei /etc/apache2/conf.d/mod_fcgid.conf (oder an anderer Stelle):
<IfModule proxy_fcgi_module>
DirectoryIndex index.php
<FilesMatch "\.ph(p[345]?|tml)$">
#SetHandler "proxy:fcgi://127.0.0.1:9000"
SetHandler "proxy:unix:/run/php-fpm/php-fpm.sock|fcgi://localhost/"
</FilesMatch>
<FilesMatch "\.php[345]?s$">
SetHandler application/x-httpd-php-source
</FilesMatch>
</IfModule>
- Achtung: mod_fcgid.conf unter openSUSE war fehlerhaft!
Apache neu starten:
systemctl restart apache2
Prüfen ob Module und Konfig-Dateien geladen wurden
apachectl -t -D DUMP_MODULES apachectl -t -D DUMP_INCLUDES
HTTP/2
HTTP/2 grundsätzlich aktivieren in Datei /etc/sysconfig/apache2:
APACHE_SERVER_FLAGS="... HTTP2"
HTTP/2 Modul aktivieren in Datei /etc/sysconfig/apache2:
APACHE_SERVER_FLAGS="... proxy proxy_http proxy_fcgi http2"
HTTP/2 Protokoll aktivieren in Datei /etc/apache2/protocols.conf:
<IfDefine HTTP2>
<IfModule mod_http2.c>
Protocols h2 h2c http/1.1
</IfModule>
</IfDefine>
- Achtung: Die Datei protocols.conf muss durch httpd.conf geladen werden.
Apache neu starten:
systemctl restart apache2
Prüfen ob Module und Konfig-Dateien geladen wurden
apachectl -t -D DUMP_MODULES apachectl -t -D DUMP_INCLUDES
TLS 1.3
TLS 1.3 kann pro Virtual Host konfiguriert werden:
...
SSLProtocol -all +TLSv1.2 +TLSv1.3
SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4"
...
Endprüfung
HTTP/2 und TLS prüfen:
curl -s -v --http2 https://www.kruedewagen.de/
Ausgabe sollte enthalten:
* ALPN, offering h2 * ALPN, offering http/1.1 ... * TLSv1.3 (OUT), TLS handshake, Finished (20): * SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 * ALPN, server accepted to use h2 ... * Using HTTP2, server supports multi-use * Connection state changed (HTTP/2 confirmed) * Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0 * Using Stream ID: 1 (easy handle 0x5559c77602a0) ...
Alternativen:
- Es kann einen Browsererweiterung wie "HTTP/2 Indicator" für Firefox installiert werden, die in der Adresszeile angibt, ob HTTP/2 verwendet wird.
- Im Entwicklerwerkzeug des Browsers die Antwort inspizieren, z.B.
X-Firefox-Spdy h2