mod_fcgid für Apache 2.2

Vorbereitungen:
Ich gehe hierbei davon aus, das PHP5 und Apache bereits installiert sind und schon funktionieren. Wichtig ist noch das bei PHP5 das CGI wie das CLI Modul mit installiert sind. Sonst klappt das ganze nicht. Sind sie das noch nciht installieren wir diese mit apt-get nach:

apt-get install php5-cgi php5-cli

fcgid installieren:
fcgid lässt sich relativ leicht durch das repository installieren. Dazu reicht ein einfaches apt-get aus.

apt-get install libapache2-mod-fcgid

Nach dem sollte es nun noch konfiguriert werden. Dazu nehmen wir aus der Apache2 Konfiguration erstmal das bisherige PHP5-Modul raus. Dazu entfernen wir einfach die LoadModul Aufforderung in der apache2.conf/httpd.conf oder wie bei Debian/Ubuntu-Systemen, dort löschen wir einfach die php5.conf und php5.load aus dem Verzeichnis „/etc/apache2/modules-enabled/“. Da es sich dabei nur um Symlinks handelt bleiben die eigentlichen Dateien also für den Notfall oder ein Rollback erhalten.

Nachdem wir nun das alte php5-Modul entfernt haben binden wir das neue ein. Dies tun wir durch die Direktive

LoadModule fcgid_module /usr/lib/apache2/modules/mod_fcgid.so

Das Modul muss natürlich an dieser Stelle auch liegen! Nutzen wir Ubuntu oder Debian wurde die Konfiguration schon nach „modules-enabled“ geschrieben. So sollte das Modul schon einmal geladen werden. Jetzt muss es natürlich noch konfiguriert werden. Allgemein kann man wieder in der httpd.conf/apache2.conf folgenden Block einfügen oder diesen unter „modules-enabled/fcgid.conf“ bearbeiten:

< IfModule mod_fcgid.c >
AddHandler fcgid-script .fcgi
SocketPath /var/lib/apache2/fcgid/sock
IdleTimeout 600
IdleScanInterval 200
BusyTimeout 300
BusyScanInterval 120
ErrorScanInterval 6
ZombieScanInterval 3
ProcessLifeTime 1200
# SpawnScoreUpLimit 10
# SpawnScore 1
# TerminationScore 2
MaxProcessCount 250
DefaultMaxClassProcessCount 10
DefaultMinClassProcessCount 0
IPCConnectTimeout 20
IPCCommTimeout 200
MaxRequestsPerProcess 500
< /IfModule >

Damit ist das fcgid-Modul schon mal grundsätzlich einsatz bereit. Fehlen nur noch 2 kleine Sniplets und wir sind fertig! Nach den Apache-Konfigurations-Anpassungen muss nun noch ein Wrapper-Skript her um die PHP-Prozesse zu steuern. Dies legen wir uns an einen beliebigen Ort, aber dort wo der Apache2 es auch lesen kann und machen es ausführbar. Ich habe meins z.B. dort abgelegt: „/etc/php5/php-procs.sh“. Der Inhalt des Skripts ist wie folgt:

#!/bin/sh
PHP_FCGI_CHILDREN=5
PHP_FCGI_MAX_REQUESTS=100
export PHP_FCGI_CHILDREN
export PHP_FCGI_MAX_REQUESTS
exec /usr/lib/cgi-bin/php5 "$@"

Zu beachten sei noch der Pfad zum php5-cgi Binary. Dieser sollte noch überprüft werden, da das Ding ja auch mal woanders installiert sein kann oder einen anderen Namen haben kann. Die Anzahl der Kinder kann man je nach Last auf dem System noch hoch oder runter stellen. Genauso wie die Maximalen Requests pro Kind, bevor dieses zerstört wird. Haben wir das alles nun getan, fehlt uns nur noch ein Eintrag im jeweiligen VHost, welcher mit PHP arbeiten soll. Dazu fügen wir in diesen zwei Directory-Kontainer ein oder bearbeiten Vorhandene dementsprechend.

< Directory / >
Options +FollowSymLinks
AllowOverride all
< /Directory >
< Directory /var/customers/webs/Zombie/ >
AddHandler fcgid-script .php
FCGIWrapper /etc/php5/php-procs.sh .php
Options Indexes +FollowSymLinks MultiViews ExecCGI
AllowOverride None
Order allow,deny
allow from all
< /Directory >

FollowSymlinks ist für Anwendungen außerhalb des Webroots gedacht. Das nutz ich meist um phpMyAdmin in verschiedenen Domains zu nutzen, ohne es X-Mal installieren zu müssen. Ist dies dann auch getan, sind wir fertig und geben noch ein finales

/etc/init.d/apache2 reload

ein. Damit werden all unsere Änderungen aktiv und wir können gucken ob sie auch funktionieren. Das sollten sie eigentlich auch ;-)