PHP-FPM - jetzt mit mod_proxy_fcgi
Vergangene Woche hatte ich darüber berichtet, wie man - unter Debian Jessie - PHP-FPM mit mod_fastcgi
installieren kann. In den Kommentaren hatte Sven mir dann nachfolgend erläutert, wie sich die Einbindung einfacher und besser über mod_proxy_fcgi
lösen lässt, vorausgesetzt, man hat (wie in Debian Jessie) einen Apache 2.4 vor sich.
Da mir das ebenfalls vorzugswürdig erscheint, beschreiben ich in der Folge nunmehr diese Variante.
PHP-FPM und mod_proxy_fcgi
installieren
Unter Debian Jessie ist die Installation der Pakete hinreichend einfach:
apt-get install php5-fpm php5
Debian hinterlegt dabei die php.ini
für die FastCGI-Prozesse unter /etc/php5/fpm/php.ini
und die Konfiguration für FPM unter /etc/php5/fpm/php-fpm.conf
, ergänzt u.a. um die Konfiguration installierter Module in /etc/php5/fpm/conf.d/
, wie man das so kennt.
Im Verzeichnis /etc/php5/fpm/pool.d/
sind dann die einzelnen Pools definiert, die ebenfalls in die /etc/php5/fpm/php-fpm.conf
inkludiert werden, standardmäßig nur der Pool des Benutzers www-data
, unter dem der Webserver läuft.
mod_proxy_fcgi
für PHP-FPM konfigurieren
Serverweit lässt sich PHP-FPM dann wie folgt in einer neuen Datei /etc/apache2/conf-available/php5-fpm.conf
konfigurieren:
<IfModule mod_proxy_fcgi.c>
<Proxy "unix:/var/run/php5-fpm.sock|fcgi://php-fpm">
# we must declare a (any) parameter in here
# or it won't register the proxy ahead of time
ProxySet disablereuse=off
</Proxy>
<FilesMatch ".+\.php$">
SetHandler proxy:fcgi://php-fpm
</FilesMatch>
</IfModule>
Auf diese Weise werden auf .php
endende Dateien an den darüber definierten Prxoy durchgereicht. Wer will, kann stattdessen bspw. auch <FilesMatch ".+\.ph(p[345]?|t|tml)$">
verwenden, wie Sven das empfohlen hat; das deckt auch alle anderen gebräuchlichen Endungen für PHP-Scripts ab.
Standardmäßig sorgt Debian übrigens dafür, dass das - mitinstallierte - Modul mod_proxy
nicht als forward proxy arbeitet; das ist in der Datei /etc/apache2/mods-available/proxy.conf
konfiguriert und stellt also kein Problem dar.
Nach Aktivieren des Moduls und der Konfiguration vermittels a2enmod proxy_fcgi
und a2enconf php5-fpm
sowie einem Restart des Webservers (service apache2 restart
) sollte PHP nun zur Verfügung stehen.
Pools für einzelne Benutzer einrichten
Um nun verschiedene Pools für verschiedene Benutzer einzurichten, bedarf es neben einer passenden Konfiguration des jeweiligen Pools in /etc/php5/fpm/pool.d/
und eines geänderten Aufrufs in jedem virtual host, der diesem Benutzer zugeordnet ist.
Am einfachsten kopiert man sich die bestehende Konfiguration für den Pool www
und wandelt sie ab:
cd /etc/php5/fpm/pool.d
cp www.conf user1.conf
vim user1.conf
Folgende Teile der Konfiguration müssen ersetzt werden: der Name des Pools, user
, group
und listen
:
; Start a new pool named 'user1'.
; the variable $pool can we used in any directive and will be replaced by the
; pool name ('user1' here)
[user1]
[...]
user = user1
group = users
[...]
listen = /var/run/php5-fpm-user1.sock
Selbstverständlich können auch andere, für diesen Pool spezifische Änderungen vorgenommen werden
Und danach bekommt der bspw. in /etc/apache2/sites-available/user1-domain.example
konfigurierte virtual host noch folgende Ergänzung (zwischen <VirtualHost ...>
und </VirtualHost>
):
<IfModule mod_proxy_fcgi.c>
<Proxy "unix:/var/run/php5-fpm-user1.sock|fcgi://php-fpm-user1">
# we must declare a (any) parameter in here
# or it won't register the proxy ahead of time
ProxySet disablereuse=off
</Proxy>
<FilesMatch ".+\.php$">
SetHandler proxy:fcgi://php-fpm-user1
</FilesMatch>
</IfModule>
In diesem virtual host kommuniziert der Apache also nicht mit dem FastCGI-Server über /var/run/php5-fpm.sock
, sondern über /var/run/php5-fpm-user1.sock
, und den haben wir ja anders konfiguriert. Ein service apache2 restart
bzw. service php5-fpm restart
später sollte die geänderte Konfiguration zur Verfügung stehen.
Soll PHP in mehreren virtual hosts unter derselben Benutzerkennung laufen, empfiehlt es sich, die o.g. Konfiguration in eine eigene Datei (bspw. /etc/apache2/sites-available/user1.fcgi
) auszulagern und diese Datei dann in die virtual host-Konfiguration einzubinden:
Include /etc/apache2/sites-available/user1.fcg
Das spart nicht nur Tipparbeit, sondern erleichtert auch spätere Änderungen sehr.
Die Installation testen
Am einfachsten gestaltet sich der Test, wenn man im Webroot des Servers (Debian Jessie: /var/www/html/
)
und der einzelnen virtual hosts jeweils eine Datei test.php
speichert, die nur phpinfo()
aufruft:
<?php phpinfo(); ?>
In der Ausgabe von phpinfo()
wird angezeigt, unter welchem Benutzer das Script ausgeführt wird.
Vielen Dank an Sven für den hilfreichen Tip!
Kommentare
Ansicht der Kommentare: Linear | Verschachtelt
Sven Hartge am :
Also, das Paket libapache2-mod-fcgid ist gar nicht nötig, das kann wieder runter.
Sven Hartge am :
Dafür muss man aber mittels "a2enmod proxy_fcgi" aktivieren.
Thomas Hochstein am :
Ja, das steht auch schon im Text.
Wie ich auf
libapache2-mod-fcgid
gekommen bin, weiß ich auch nicht … War wohl noch vom Testen übrig.Danke & Gruß, Thomas
Marcus Wolf am :
Ich bekomme diese konfig einfach nicht zum laufen Ein frishc installiertes Jessie mit Apache 2.4.10 und ich habe alle schritte genauestens befolgt. Hier die Konfigs:
Im Verzeichnis /var/www/subtld habe ich eine phpfinfo erstellt, beim aufruf bekomme ich einen 503: The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.
PHP-FPM läuft:
Im Log steht folgendes:
was habe ich falsch gemacht?
Thomas Hochstein am :
Die Fehlermeldung
(13)Permission denied: AH02454: FCGI: attempt to connect to Unix domain socket /var/run/php5-fpm-marcus.sock (php-fpm-marcus) failed
zeigt, dass es ein Rechteproblem gibt: der Apache kann nicht auf/var/run/php5-fpm-marcus.sock
zugreifen.Das Problem dürfte in
in
/etc/php5/fpm/pool.d/marcus.conf
liegen. Ich wette, dass deshalb/var/run/php5-fpm-marcus.sock
als Owner und Groupmarkus:markus
und als Rechterw-rw----
hat. Der Apache läuft aber - bei Debian - unterwww-data:www-data
und kann daher nicht auf den Socket zugreifen.In der Default-Config steht daher:
Das solltest Du bei Dir ändern, php5-fpm reloaden/restarten (
sudo service php5-fpm restart
), und dann sollte es eigentlich gehen.Marcus Wolf am :
Genau das war es, hatte es schon durch google herausgefunden, bzw durch probieren. trotzdem vielen Dank.
Wirklich ein sehr guter Artikel
Thomas Hochstein am :
Danke! - Und freut mich, dass es jetzt läuft.