PHP skaliert in Standardinstallationen relativ schlecht. Grund dafür ist, daß der Webserver jedes mal eine neue Interpreterinstanz erstellen muss und danach wieder zerstört. Das kostet Zeit und eine Menge Performance / Nerven. Besser funktioniert es mit FastCGI. Hier werden die Interpreterinstanzen unabhängig vom Webserver gestartet und stehen fertig geladen bereit wenn der Request beim Webserver eintrifft. Leider ist die Konfiguration etwas schwieriger da es für FastCGI keine richtige Standardlösung gibt. Je nach Webserver werden eigene Wrapper benötigt die gestartet werden müssen. Weshalb ein solches Konstrukt oft auf wackeligen Beinen steht und anfällig für Bedienfehler ist.
Mit PHP 5.3 führt die Interpretersprache einen eigenen Manager für FastCGI Prozesse ein: FPM – FastCGI Process Manager. Mit ihm ist es auf einfache Art möglich Gruppen von Applikationen anzulegen, Skalierung einzustellen und dadurch den Überblick über kritische oder schwer gewichtige Webapplikationen zu behalten.
Ich habe mal versucht den FPM mit Apache2 (mpm-worker) unter Ubuntu am Beispiel von Icinga-web zum laufen zu bekommen. Ausgangssituation ist ein installierter Apache2 und eine Standard Icinga-web Installation aus den Tutorials oder den Quickstart Guides.
1) Installation der benötigten Pakete und aktivieren der benötigten Module:
# aptitude install libapache2-mod-fastcgi php5-fpm
# a2enmod fastcgi actions rewrite
Enabling module fastcgi.
Enabling module actions.
Enabling module rewrite.
2) Vorbereiten der Konfiguration für FPM
# pwd
/etc/php5/fpm
# cat pool.d/icinga-web.conf
[icinga-web]
listen = 127.0.0.1:9000
user = www-data
group = www-data
pm = dynamic
pm.max_children = 100
pm.start_servers = 30
pm.min_spare_servers = 30
pm.max_spare_servers = 50
;pm.max_requests = 500
chroot =
chdir = /usr/local/icinga-web/pub
Ich habe die Standardkonfiguration für „www“ vorher deaktiviert. Ansonsten würden sich die Sockets auf Port 9000 einen Strich durch die Rechnung machen.
3) Fehlt noch eine Apache Konfiguration (Icinga-web Standard mit FastCGI Erweiterung):
# pwd
/etc/apache2/sites-available
# cat fcgi-test
FastCgiExternalServer /var/www/php5.external -host 127.0.0.1:9000
DocumentRoot /var/www
AddHandler php5-fcgi .php
Action php5-fcgi /usr/lib/cgi-bin/php5.external
Alias /usr/lib/cgi-bin/ /var/www/
AliasMatch /icinga-web/modules/([A-Za-z0-9]*)/resources/styles/([A-Za-z0-9]*\.css)$ /usr/local/icinga-web/app/modules/$1/pub/styles/$2
AliasMatch /icinga-web/modules/([A-Za-z0-9]*)/resources/images/([A-Za-z_\-0-9]*\.(png|gif|jpg))$ /usr/local/icinga-web/app/modules/$1/pub/images/$2
Alias /icinga-web/js/ext3 /usr/local/icinga-web/lib/ext3
Alias /icinga-web /usr/local/icinga-web/pub
Order allow,deny
Allow from all
Order allow,deny
Allow from all
Order allow,deny
Allow from all
DirectoryIndex index.php
Options FollowSymLinks
AllowOverride all
Order allow,deny
Allow from all
# a2ensite fcgi-test
Enabling site fcgi-test.
4) Apachen neu laden und den FPM Pool starten:
# ps aux | grep fpm | head -3
root 5213 0.0 0.0 145792 4872 ? Ss 13:18 0:00 php-fpm: master process (/etc/php5/fpm/php-fpm.conf)
www-data 5214 0.1 0.4 173028 34312 ? S 13:18 0:00 php-fpm: pool icinga-web
www-data 5215 0.3 0.4 175140 36824 ? S 13:18 0:00 php-fpm: pool icinga-web
Das ganze ist zwar nur rudimentär getestet und icinga-web nicht optimiert für FastCGI, bietet aber Potential für mehr: Persistenter Agavi Cache, Connection Pooling für die Datenbank, usw.
0 Kommentare