Apache/Apache+HTTP2+PHP-FPM+TLS1.3

aus www.kruedewagen.de, Homepage von Ralf und Judith Krüdewagen (Kruedewagen)
Zur Navigation springen Zur Suche springen

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

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

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

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

Apache

Info

MPM

Als MPM kann für HTTP/2 nicht prefork verwendet werden.

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"

Apache neu starten:

systemctl restart apache2

HTTP/2

HTTP2 (h2) einrichten.

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>

Apache neu starten:

systemctl restart apache2

TLS 1.3