Skip to content

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!

Trackbacks

Netz - Rettung - Recht am : PHP-FPM mit Debian Jessie

Vorschau anzeigen
Statische Webseiten sind nett (und durchaus wieder im Kommen), aber zumindest für manche Zwecke sind dynamisch generierte Seiten und die auf diese Weise ermöglichte Interaktivität doch dann besser oder gar notwendig. Facebook, bspw., würde sich als statis

Kommentare

Ansicht der Kommentare: Linear | Verschachtelt

Sven Hartge am :

Sven Hartge

Also, das Paket libapache2-mod-fcgid ist gar nicht nötig, das kann wieder runter.

Sven Hartge am :

Sven Hartge

Dafür muss man aber mittels "a2enmod proxy_fcgi" aktivieren.

Thomas Hochstein am :

Thomas Hochstein

QUOTE:
Dafür muss man aber mittels "a2enmod proxy_fcgi" aktivieren.

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 :

Marcus Wolf

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:

CODE:
/etc/apache2/conf-available/php5-fpm.conf <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 ".+.ph(p[345]?|t|tml)$">         SetHandler proxy:fcgi://php-fpm     </FilesMatch> </IfModule>
CODE:
sudo a2enod proxy_fcgi sudo a2enconf php5-fpm.conf sudo service apache2 restart

CODE:
/etc/php5/fpm/pool.d/marcus.conf: [marcus] user = marcus group = marcus listen = /var/run/php5-fpm-marcus.sock listen.owner = marcus listen.group = marcus listen.mode = 0660
CODE:
vhost: <VirtualHost *:80>         ServerName subtld.zerberus.lan         ServerAdmin marcus.wolf232@gmail.com         DocumentRoot /var/www/subtld         DirectoryIndex app_dev.php         ErrorLog ${APACHE_LOG_DIR}/subtld_error.log         CustomLog ${APACHE_LOG_DIR}/subtld_access.log combined <Directory /var/www/subtld> AllowOverride All Require all granted Allow from All </Directory> <IfModule mod_proxy_fcgi.c>     <Proxy "unix:/var/run/php5-fpm-marcus.sock|fcgi://php-fpm-marcus">         # we must declare a (any) parameter in here         # or it won’t register the proxy ahead of time         ProxySet disablereuse=off     </Proxy>     <FilesMatch ".+.ph(p[345]?|t|tml)$">         SetHandler proxy:fcgi://php-fpm-marcus     </FilesMatch> </IfModule> </VirtualHost>

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:

CODE:
sudo service php5-fpm status ● php5-fpm.service - The PHP FastCGI Process Manager    Loaded: loaded (/lib/systemd/system/php5-fpm.service; enabled)    Active: active (running) since Do 2016-05-26 09:09:16 CEST; 4min 21s ago   Process: 4382 ExecReload=/bin/kill -USR2 $MAINPID (code=exited, status=0/SUCCESS)   Process: 7095 ExecStartPre=/usr/lib/php5/php5-fpm-checkconf (code=exited, status=0/SUCCESS)  Main PID: 7101 (php5-fpm)    Status: "Processes active: 0, idle: 4, Requests: 0, slow: 0, Traffic: 0req/sec"    CGroup: /system.slice/php5-fpm.service            ├─7101 php-fpm: master process (/etc/php5/fpm/php-fpm.conf)            ├─7103 php-fpm: pool marcus            ├─7104 php-fpm: pool marcus            ├─7105 php-fpm: pool www            └─7106 php-fpm: pool www

Im Log steht folgendes:

CODE:
[Thu May 26 09:11:07.906999 2016] [proxy:error] [pid 6922:tid 139724412942080] (13)Permission denied: AH02454: FCGI: attempt to connect to Unix domain socket /var/run/php5-fpm-marcus.sock (php-fpm-marcus) failed [Thu May 26 09:11:07.907325 2016] [proxy:error] [pid 6922:tid 139724412942080] AH00959: ap_proxy_connect_backend disabling worker for (php-fpm-marcus) for 60s [Thu May 26 09:11:07.907389 2016] [proxy_fcgi:error] [pid 6922:tid 139724412942080] [client 192.168.178.56:51824] AH01079: failed to make connection to backend: httpd-UDS

was habe ich falsch gemacht?

Thomas Hochstein am :

Thomas Hochstein

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

listen.owner = marcus
listen.group = marcus
listen.mode = 0660

in /etc/php5/fpm/pool.d/marcus.conf liegen. Ich wette, dass deshalb /var/run/php5-fpm-marcus.sock als Owner und Group markus:markus und als Rechte rw-rw---- hat. Der Apache läuft aber - bei Debian - unter www-data:www-data und kann daher nicht auf den Socket zugreifen.

In der Default-Config steht daher:

listen.owner = www-data
listen.group = www-data

Das solltest Du bei Dir ändern, php5-fpm reloaden/restarten (sudo service php5-fpm restart), und dann sollte es eigentlich gehen.

Marcus Wolf am :

Marcus Wolf

Genau das war es, hatte es schon durch google herausgefunden, bzw durch probieren. trotzdem vielen Dank.

Wirklich ein sehr guter Artikel :-)

Thomas Hochstein am :

Thomas Hochstein

Danke! - Und freut mich, dass es jetzt läuft.

Kommentar schreiben

HTML-Tags werden in ihre Entities umgewandelt.
Markdown-Formatierung erlaubt
Standard-Text Smilies wie :-) und ;-) werden zu Bildern konvertiert.
BBCode-Formatierung erlaubt
Gravatar, Identicon/Ycon Autoren-Bilder werden unterstützt.
Formular-Optionen
tweetbackcheck