Samstag, 29. März 2008

es-f Tuning auf der NSLU2 (lighttpd, PHP, fastcgi)

Meine esniper-frontend-Installation auf meiner NSLU2 ist etwas träge in der Bedienung. Das liegt zum einen im begrenzten RAM der Slug aber auch an ihren 266 MHz CPU-Takt (nach dem sogenannten De-Underclocking). Da ist halt nicht viel zu reißen, fast jeder Klick in der Oberfläche von es-f zieht somit einige Gedenksekunden nach sich.

Das wäre nur halb so schlimm, wenn nicht seit der 0.9er Serie auch sporadisch noch PHP-Timeouts zuschlagen würden.

Ich habe mich also mit Knuts Hilfe daran gemacht, etwas zu optimieren.

1) FastCGI einschalten

Meine Installation lief ursprünglich nur mit CGI, ich verspreche mir etwas Vorteile, wenn ich auf FastCGI umstelle. FastCGI startet den PHP-Interpreter schon zusammen mit dem Webserver, also in meinem Fall lighty. Zudem erfolgt die Kommunikation zwischen Webserver und Interpreter mittels TCP/IP oder Unix-Domain-Sockets - im Gegensatz zu den üblichen Pipes im CGI-Fall.

Interessantes gibt es dazu auch im lighty-Wiki zu lesen.

Die Umstellung von CGI auf FastCGI ist nicht allzu kompliziert, wenn man versteht, wie lighty konfiguriert wird.

Als erstes überprüfen wir, welche Module aktiviert sind:

(Bei der Abfrage einfach "Enter" drücken!)

//NSLU2/# lighty-enable-mod
Available modules: auth cgi fastcgi proxy simple-vhost ssi ssl userdir
Already enabled modules: auth cgi
Enable module:
Run /etc/init.d/lighttpd force-reload to enable changes
Okay, bei mir also "auth" und "cgi", letzteres wollen wir nicht mehr! Also das ganze abschalten und danach fastcgi einschalten:
//NSLU2/# lighty-disable-mod cgi
Available modules: auth cgi fastcgi proxy simple-vhost ssi ssl userdir
Already enabled modules: auth cgi
Disabling cgi
Run /etc/init.d/lighttpd force-reload to enable changes
//NSLU2/# lighty-enable-mod fastcgi
Available modules: auth cgi fastcgi proxy simple-vhost ssi ssl userdir
Already enabled modules: auth
Enabling fastcgi: ok
Run /etc/init.d/lighttpd force-reload to enable changes
Den Restart des Servers um die neue Konfig zu aktivieren, unternehmen wir noch nicht. Erst wollen wir noch PHP5 einschalten, denn der Debian-Standard ist PHP4.

Dazu gehen wir in die entsprechende fastcgi-Konfigdatei und ändern den Pfad. Die Konfigurationsdateien von lighty befinden sich im Verzeichnis /etc/lighttpd:

//NSLU2/# cd /etc/lighttpd/
//NSLU2/etc/lighttpd# ls -l
insgesamt 16
drwxr-xr-x 2 root root 4096 2008-03-29 12:25 conf-available
drwxr-xr-x 2 root root 4096 2008-03-29 12:32 conf-enabled
-rw-r--r-- 1 root root 4506 2008-03-09 13:09 lighttpd.conf
Im Unterverzeichnis "conf-available" befinden sich die Konfigurationen der verfügbaren Module. Beim Aufruf der "lighty-enable/disable-mod"-Skripte erzeugen bzw. löschen einfach symbolische Links zu den Konfigs im anderen Unterverzeichnis. Hier kann man also auch überprüfen, was aktiv ist. Bei mir müssten somit zwei Links (auth und fastcgi) auftauchen:
//NSLU2/etc/lighttpd# cd conf-enabled/
//NSLU2/etc/lighttpd/conf-enabled# ls -l
insgesamt 0
lrwxrwxrwx 1 root root 41 2007-10-18 18:08 10-auth.conf -> /etc/lighttpd/conf-available/10-auth.conf
lrwxrwxrwx 1 root root 44 2008-03-29 12:32 10-fastcgi.conf -> /etc/lighttpd/conf-available/10-fastcgi.conf
Und richtig geraten :-)
Nun aber den Pfad ändern, dazu im Lieblingseditor die Datei /etc/lighttpd/conf-available/10-fastcgi.conf öffnen un die Zeile "bin-path" anpassen wie unten beschrieben.
## FastCGI programs have the same functionality as CGI programs,
## but are considerably faster through lower interpreter startup
## time and socketed communication
##
## Documentation: /usr/share/doc/lighttpd-doc/fastcgi.txt.gz
## http://www.lighttpd.net/documentation/fastcgi.html

server.modules += ( "mod_fastcgi" )

## Debug wenn 1
fastcgi.debug = 0

## Start an FastCGI server for php4 (needs the php4-cgi package)
fastcgi.server = ( ".php" =>
((
"bin-path" => "/usr/bin/php5-cgi",
"socket" => "/tmp/php.socket",
"max-procs" => 2,
"idle-timeout" => 20,
"bin-environment" => (
"PHP_FCGI_CHILDREN" => "4",
"PHP_FCGI_MAX_REQUESTS" => "10000"
),
"bin-copy-environment" => (
"PATH", "SHELL", "USER"
),
"broken-scriptfilename" => "enable"
))
)
Danach speichern und nicht vergessen, den lighttpd neu starten (oder noch warten und erstmal den zweiten Schritt durchführen):
//NSLU2~# /etc/init.d/lighttpd restart
Stopping web server: lighttpd.
Starting web server: lighttpd.
Soviel zum Thema FastCGI.

2) Timeout erhöhen

Nach Änderungen an den es-f-Templates (also z.B. beim Upgrade oder einer Neuinstallation) müssen diese neu generiert werden. Dies erfolgt beim ersten Aufruf automatisch, aber die NSLU2 ist in der vorgebenen Default-Zeit damit manchmal überfordert und wirft eine Fehlermeldung.

Der globale Wert wird in der php.ini definiert - da ich hier einen eigenen Server betreibe, kann ich diese auch nach eigenem Gusto anpassen. Mann muss nur die richtige nehmen, unter Debian gibt es ja etliche. Ich nutze PHP5 (per CGI), also gilt es, diese zu öffnen:
//NSLU2/# vi /etc/php5/cgi/php.ini  
Im Abschnitt "Resource Limits" kann man den Timeout von 30s auf (zum Beispiel) 300s erhöhen:
;;;;;;;;;;;;;;;;;;;
; Resource Limits ;
;;;;;;;;;;;;;;;;;;;

max_execution_time = 300 ; Maximum execution time of each script, in seconds
Nach dem Speichern den Webserver neu starten (siehe oben) und schon sollte das neue Limit aktiv sein.

Überprüfen kann man das, indem man eine Textdatei mit folgendem Inhalt auf dem Webserver ablegt:

< ?php
phpinfo();
?>

Diese Datei heißt bei mir passender Weise "php.info" und liegt direkt im Root-Verzeichnis des Webservers (/var/www):
//NSLU2/var/www# cd /var/www/
//NSLU2/var/www# ls -l
insgesamt 16
drwxr-xr-x 15 www-data www-data 4096 2008-03-21 23:13 ebay
-rw-r--r-- 1 www-data www-data 3586 2008-03-18 13:35 index.html
-rw-r--r-- 1 www-data www-data 20 2008-03-09 12:56 info.php
drwxr-xr-x 6 www-data www-data 4096 2007-10-07 09:30 scanner
PHP-Info Dies kann man sich jetzt im Browser anschauen und sie zeigt alle PHP-Konfigurationsoptionen. Die 300s habe ich markiert.

Diese beiden schnellen Änderungen in Summe sollten ein besseres "Ansprechverhalten" erzeugen. Messungen habe ich nicht durchgeführt, aber ich hoffe einfach mal, dass mein subjektiver Eindruck stimmt ... :-)

blog comments powered by Disqus

Design von Dicas Blogger, angepasst durch Mario Ruprecht