Home / WebServer / Apache / HowTo: Apache mit php-fpm und mod-fastcgi unter Debian Wheezy
apache logo

HowTo: Apache mit php-fpm und mod-fastcgi unter Debian Wheezy

Installation des Apache Webservers mit PHP-FPM und mod_fastcgi unter Debian Wheezy. So funktioniert das Setup…

PHP-fpm ist derzeit in aller Munde und alle sprechen vom Nginx Server und vom ultimativen Performance Boost. Doch auch Apache kann PHP-FPM verwenden. Ich will jetzt den Nginx nicht schlecht machen. Er funktioniert wirklich gut und sehr schnell, jedoch benötigt es je nach Anforderung ein wenig Zeit, dass man sich in die Konfiguration einliest. Der „Good Old“ Apache hingegen ist weit verbreitet und die meisten Linux Administratoren sind mit ihm vertraut. Ich möchte daher auch das Setup von php-fpm mit Apache und FastCGI zeigen. In größeren Umgebung ist das Setup auf alle Fälle zu empfehlen, da es nach ersten Benchmarks um einiges schneller ist als Apache mit mod-php. Zusätzlich kann man .htaccess Dateien weiterhin verwenden, was gerade in Shared Hosting Umgebungen für Kunden besonders sinnvoll ist.

PHP FPM ist deshalb so besonders, weil es als eigenständiges Service läuft, ohne dass ein Webserver dafür nötig ist. Ein Webserver, ob nun Apache oder Nginx, leitet via dem FastCGI Protokoll alle PHP Requests an den PHP-FPM Server weiter, welcher auf einen TCP oder einen Unix Socket hört. Das ist auch der große Vorteil, denn unter dem Standard LAMP Setup mit Apache + mod_php wird für jeden Request eine eigene PHP Instanz aufgemacht und anschließend wieder geschlossen. Bei PHP-FPM können außerdem mehrere sogenannte Pools definiert werden, welche mit unterschiedlichen Usern ausgeführt werden können.

(optional: Installation der aktuellsten PHP Version)

Grundsätzlich könnt ihr die PHP Version aus den Debian Repositories verwenden, allerdings sind dies sehr alt. Wer die aktuelle PHP5.5 unter Debian verwenden möchte, kann diese mit den Dotdeb Mirrors installieren, was ich euch wegen der Geschwindigkeit auf jeden Fall nahe lege. (Schritt optional)

Um den dotdeb Mirror hinzuzufügen wird die /etc/sources.list…

[bash]vi /etc/apt/sources.list[/bash]

…und um folgende zwei Einträge erweitert:

[bash]deb http://packages.dotdeb.org wheezy-php55 all
deb-src http://packages.dotdeb.org wheezy-php55 all[/bash]

Anschließend wird noch der GnuPG key heruntergeladen und importiert.

[bash]wget http://www.dotdeb.org/dotdeb.gpg
apt-key add dotdeb.gpg && rm dotdeb.gpg[/bash]

Ein apt-get update aktualisiert nun die Paketlisten (in diesem Schritt wird noch nicht installiert)

[bash]apt-get update[/bash]

Installation von Apache mit php-fpm und fastcgi

Als Apache Worker Prozess wird mpm-worker verwendet. Prefork ist in dem Fall ungeeignet. Zusätzlich wird mod_fastcgi und das PHP Framework installiert. Die Installation wird nun mit folgendem apt-get install Kommando durchgeführt:

[bash]apt-get install apache2-mpm-worker libapache2-mod-fastcgi php5-fpm[/bash]

Das fastcgi Modul wird automatisch geladen, allerdings muss das „actions“ Apache Modul noch aktiviert werden:

[bash]a2enmod actions[/bash]

Die eigentliche Installation ist damit beendet. Nun muss dem Apachen noch die PHP Sprache beigebracht werden. Dazu wird die Apache Konfiguration editiert.

[bash]vi /etc/apache2/sites-available/default[/bash]

Folgende Einträge werden nun im <VirtualHost…> Teil hinzugefügt:

[bash]AddHandler php5-fcgi .php
Action php5-fcgi /php5.fcgi
Alias /php5-fcgi /var/www/php5-fcgi
FastCgiExternalServer /var/www/php5.fcgi -socket /var/run/php5-fpm.sock[/bash]

Ein kompletter Virtual Host Eintrag könne in etwa wie hier aussehen:

[bash]<VirtualHost *:80>
AddHandler php5-fcgi .php
Action php5-fcgi /php5.fcgi
Alias /php5-fcgi /var/www/sysadminslife.com/php5-fcgi
FastCgiExternalServer /var/www/sysadminslife.com/php5.fcgi -socket /var/run/php5-fpm.sock

ServerAdmin admin@sysadminslife.com
ServerName www.sysadminslife.com
ServerAlias sysadminslife.com
DocumentRoot /var/www/sysadminslife.com/
ErrorLog /var/log/apache2/sysadminslife.com_error.log
CustomLog /var/log/apache2/sysadminslife.com.log combined
<Directory /var/www/sysadminslife.com>
Options FollowSymLinks
AllowOverride All
Order allow,deny
allow from all
</Directory>
</VirtualHost>[/bash]

Im zweiten Schritt wird die php fpm Konfigurationsdatei editiert…

[bash]vi /etc/php5/fpm/pool.d/www.conf[/bash]

…und folgende Punkte hinzugefügt bzw. auskommentiert (Strichpunkt enfernen):

[bash]listen.owner = www-data
listen.group = www-data
listen.mode = 0660[/bash]

Nach der Änderung sollte der PHP-FPM Prozess neu gestartet werden

[bash]/etc/init.d/php5-fpm restart[/bash]

Um nun die Installation zu testen wird einfach eine test.php Datei im Webserver Verzeichnis angelegt und im Browser aufgerufen:

[bash]vi /var/www/test.php[/bash]

Als Inhalt lassen wir phpinfo ausgeben:

[bash]<?php phpinfo(); ?>[/bash]

Ein Aufruf der IP bzw. des Hostnames (zB: http://192.168.1.100/test.php) sollte folgende Ausgabe bereit halten:

Apache PHP5.5 FPM Installation

[sam id=“2″ codes=“true“]

PHP-FPM Idle Timeout erhöhen

Es kann passieren, dass in den Error Logs folgende Fehlermeldung auftaucht:

[bash][Fri Apr 25 10:18:23 2014] [error] [client xxx.xxx.xxx.xxx] FastCGI: comm with server "/var/www/php5.fcgi" aborted: idle timeout (30 sec)
[Fri Apr 25 10:18:23 2014] [error] [client xxx.xxx.xxx.xxx] FastCGI: incomplete headers (0 bytes) received from server "/var/www/php5.fcgi"[/bash]

In diesem Fall sollte das idle Timeout in der Zeile „FastCgiExternalServer“ erhöht werden (Standard: 30 Sekunden):

[bash]FastCgiExternalServer /var/www/php5.fcgi -idle-timeout 250 -socket /var/run/php5-fpm.sock [/bash]

WordPress und Apache + php-fpm + mod-fastcgi – Probleme mit mod_rewrite

Wenn ihr in eurem Setup ein WordPress System einsetzt und dieses schöne Urls also Permalinks verwendet, dann muss die .htaccess, welche generiert wird um eine RewriteCond erweitert werden:

Es wird sonst folgende Fehlermeldung in der Apache Error Log erscheinen: Request exceeded the limit of 10 internal redirects due to probable configuration error. Use ‚LimitInternalRecursion‘ to increase the limit if necessary. Use ‚LogLevel debug‘ to get a backtrace. 

Der Eintrag sieht wie folgt aus und muss vor der letzten RewriteRule ./index.php [L] eingefügt werden:

[bash]RewriteCond %{REQUEST_URI} !^/php5.fcgi[/bash]

Der Inhalt der .htaccess solllte dann wie folgt aussehen:

[bash]# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ – [L] RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/php5.fcgi
RewriteRule . /index.php [L] </IfModule>
# END WordPress[/bash]
3.7/5 - (10 votes)

Auch cool

Linux richtig anwenden: Tipps und Tricks für eine optimale Erfahrung

Die Kombination aus Spiele-Plattformen, und dem Betriebssystem Linux mag auf den ersten Blick ungewöhnlich erscheinen. …

9 Kommentare

  1. … falls jemand PHP-FPM mit nginx betreiben möchte. Hier meine Beispielkonfiguration -> https://github.com/voku/CONFIG–nginx—php-fpm—mysql

  2. super anleitung!!!

    trozdem habe ich folgende probleme:
    ich habe alles nach deiner anleitung erledigt, jedoch bekomme ich eine blanke html seite mit dem source code

    in den logs finde ich keine errors
    eine ahnung was das sein koennte?

    scheint als wuerde irgendetwas auf php vergessen

  3. Hi, danke für den Artikel echt super erklärt und ganz simpel Daumen Hoch.

    MfG Alex

  4. Hatte das Problem, dass mir die shell folgendes ausspuckte:

    Package ‚libapache2-mod-fastcgi‘ has no installation candidate

    Lösung: Non-Free Paketquellen hinzufügen:

    deb http://security.debian.org/ wheezy/updates main non-free
    deb-src http://security.debian.org/ wheezy/updates main non-free

    • So wie sich mir das darstellt, wurde in Wheezy mittlerweile „libapache2-mod-fastcgi“ durch „libapache2-mod-fcgid“ ersetzt. Jedenfalls finde ich auch mit den non-free Quellen erstgenanntes Paket nicht.

  5. Hier wird eigenartiger weise erst fastcgi installiert,
    und dann fcgi konfiguriert, oder habe ich irgendetwas verpasst?

  6. Hier:

    Alias /php5-fcgi /var/www/php5-fcgi
    FastCgiExternalServer /var/www/php5.fcgi -socket /var/run/php5-fpm.sock

    ist ein Fehler drin – der Handler muss exakt matchen (php5-fcgi vs. php5.fcgi

    Gruß

  7. Hallo,

    unter Apache 2.4.10 funktioniert die Anleitung nicht mehr – da hat sich einiges geändert.

    Kannst Du diese aktualisieren?

    gruß

    Sebastian

  8. Hey,

    super Anleitung, aber wie von phronk schon beschrieben fehlt ein kleines „a2enmod fastcgi“ 🙂

    Sonst super! Lääuft