HTTP/2.0 Debian 9 Apache 2.4 Umstellung auf php-fpm

In einem der letzen Artikel zu dem Thema HTTP/2.0 unter Debian 9 wurde erwähnt, dass die Kombination libapache2-mod-php und HTTP/2.0 wegen der Inkompatibilität zu mpm_prefork nicht funktioniert. Ein Ausweg kann sein, einen Umstieg auf php-fpm ins Auge zu fassen. Dies wird hier in einem kurz-Howto gezeigt.

Die benötigten Pakete können parallel zu den bestehenden installiert werden.

:~# apt-get install libapache2-mod-fcgid php7.0-fpm
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut.
Statusinformationen werden eingelesen.... Fertig
Die folgenden NEUEN Pakete werden installiert:
  libapache2-mod-fcgid php7.0-fpm
0 aktualisiert, 2 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.
Es müssen 1.359 kB an Archiven heruntergeladen werden.
[...]

Umstellen auf php-fpm erfolgt der Übersicht halber in einzelnen Schritten.

:~# a2dismod php7.0
Module php7.0 disabled.
To activate the new configuration, you need to run:
  systemctl restart apache2

:~# a2dismod mpm_prefork
Module mpm_prefork disabled.
To activate the new configuration, you need to run:
  systemctl restart apache2

:~# a2enmod mpm_event
Considering conflict mpm_worker for mpm_event:
Considering conflict mpm_prefork for mpm_event:
Enabling module mpm_event.
To activate the new configuration, you need to run:
  systemctl restart apache2

:~# a2enmod actions fcgid proxy_fcgi alias setenvif
Enabling module actions.
Module fcgid already enabled
Considering dependency proxy for proxy_fcgi:
Enabling module proxy.
Enabling module proxy_fcgi.
Module alias already enabled
Module setenvif already enabled
To activate the new configuration, you need to run:
  systemctl restart apache2

:~# a2enconf php7.0-fpm
Enabling conf php7.0-fpm.
To activate the new configuration, you need to run:
  systemctl reload apache2

Das Konfigurationsverzeichnis von php-fpm liegt unter:

:~# cd /etc/php/7.0/fpm/
:~# ls -la
drwxr-xr-x 2 root root  4096 Aug 11 09:31 conf.d
-rw-r--r-- 1 root root  4421 Jun 14 15:50 php-fpm.conf
-rw-r--r-- 1 root root 71080 Aug 11 09:50 php.ini
drwxr-xr-x 2 root root  4096 Aug 11 12:21 pool.d

Die getroffenen Einstellungen in der php.ini müssen/sollten übertragen werden. Nur ein einzelnes Beispiel daraus, alle weiteren Änderungen sollten ebenfalls sinnvoll übernommen werden.

:~# diff /etc/php/7.0/apache2/php.ini /etc/php/7.0/fpm/php.ini
[...]
< date.timezone = Europe/Berlin
---
> ;date.timezone =
[...]

php-fpm läuft in seiner default Installation über ein Socket. Will man dies nach TCP ändern sind weitere Konfigurationsänderungen nötig. Hier wird gleich noch eine Status Seite und eine ping/pong Abfrage, für ein evtl. vorhandenes Monitoring des php-fpm Prozesses konfiguriert.

:~# vim /etc/php/7.0/fpm/pool.d/www.conf
[...]
; listen = /run/php/php7.0-fpm.sock
listen = 127.0.0.1:9000
[...]
listen.allowed_clients = 127.0.0.1
[...]
pm.status_path = /status
ping.path = /ping
ping.response = pong

:~# vim /etc/apache2/conf-enabled/php7.0-fpm.conf
[...]
        #SetHandler "proxy:unix:/run/php/php7.0-fpm.sock|fcgi://localhost"
        SetHandler "proxy:fcgi://localhost:9000"
[...]
    <LocationMatch "/(ping|status)">
        #SetHandler "proxy:unix:/run/php/php7.0-fpm.sock|fcgi://localhost"
        SetHandler "proxy:fcgi://localhost:9000"
        Require ip 127.0.0.1 192.168.56.1
    </LocationMatch>
[...]

php-fpm und Apache neu starten.

:~# systemctl restart php7.0-fpm

:~# ps fax
[...]
18600 ?        Ss     0:00 php-fpm: master process (/etc/php/7.0/fpm/php-fpm.conf)
18601 ?        S      0:00  \_ php-fpm: pool www
18602 ?        S      0:01  \_ php-fpm: pool www
:~# netstat -tulpn
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      13791/php-fpm: mast

:~# systemctl restart apache2

Status und ping/pong Abfrage. Der Status kann in weiteren Ausgabeformaten z.B. in JSON und einer full Ausgabe ausgegeben werden. Siehe dazu in der pool.d/www.conf Konfigurationsdatei für weitere Informationen.

http://192.168.56.225/ping
-> pong

http://192.168.56.225/status
pool:                 www
process manager:      dynamic
start time:           05/Aug/2018:12:41:53 +0200
start since:          451
accepted conn:        3
listen queue:         0
max listen queue:     0
listen queue len:     0
idle processes:       1
active processes:     1
total processes:      2
max active processes: 1
max children reached: 0
slow requests:        0

Noch eine kurze HTTP/2.0 Verbindungskontrolle.

:~# curl -s -v --http2 https://localhorst.org/
[...]
* Connected to localhorst.org (94.130.99.225) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
[...]
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-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 0x5655499eca80)
> GET / HTTP/2
> Host: localhorst.org
> User-Agent: curl/7.60.0
> Accept: */*
[...]