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: */* [...]