lighttpd, fastcgi und PHP5 als Ersatz für Apache2 mit mod-php5

2010-01-16 - kostaki Keine Kommentare »

In diesem Tutorial möchte ich zeigen wir einfach ein Apache2/mod-php System auf lighttpd mit fastcgi und php Support umgestellt werden kann. Einen einleitenden Text, allgemeine Einstellungen sowie weitere Anleitungen zum Thema lighttpd gibt es hier: lighttpd aka lighty als apache Ersatz

Die Ausgangsbasis ist ein Debian Lenny mit apache2-prefork und libapache2-mod-php5. Mein Testsystem ist ein äußerst günstiger Vserver mit sehr wenig Arbeitsspeicher (100MB). Die Apache2 Konfiguration belegte sehr schnell den kompletten RAM, aber nach der Umstellung auf lighttpd habe ich sogar noch 58MB frei. Zum testen ob alles Problemlos läuft werden beide Webserver parallel installiert und auf unterschiedlichen Ports gestartet. Sobald alles richtig konfiguriert ist kann man sich vom apache verabschieden. Anzumerken ist noch, das ich auf diesem Server keine vhost Konfiguration habe und brauche. Dies werde ich also in einem anderen Tutorial genauer erklärt! Hier wird nur die Server DocumentRoot benutzt. Vor der Installation natürlich noch ein aptitude update/upgrade.

$ aptitude update && aptitude safe-upgrade

Installation von lighttpd

Die aktuelle Version in Debian Lenny ist lighttpd (1.4.19-5).

$ aptitude install lighttpd php5-cgi
The following NEW packages will be installed:
  fam{a} libfam0{a} lighttpd php5-cgi portmap{a}

Wenn der Apache noch läuft, dann bekommt man diese Fehlermeldung beim starten von lighttpd. Das ist OK weil wir zum testen den Server eh auf einem anderen Port laufen lassen wollen.

Starting web server: lighttpd can't bind to port: 80 Address already in use failed!

Portmap und FAM werden bei der Installation von lighttpd auch installiert. FAM ist ein stat Cache und braucht zu funktionieren Portmap. Wer es einsetzen will, sollte Portmap absichern, da es auf allen Interfaces auf Port 111 lauscht. So kann man es auf das Loopback-Device beschränken.

$ nano /etc/default/portmap
OPTIONS="-i 127.0.0.1"

Wer es nicht braucht, kann beide Daemons entfernen.

$ aptitude purge portmap fam

Konfiguration von lighttpd

Als nächstes wird fastcgi aktiviert und der Port umgestellt.

$ nano /etc/lighttpd/lighttpd.conf

Da der Apache auf Port 80 lauscht, setzen wir lighty auf Port 81.

server.port = 81

Die von Debian mitgelieferte lighttpd.conf ist meiner Ansicht nach überladen. Man sollte sie also runter trimmen und alles was man nicht braucht entfernen. Ich habe erstmal alles raus geschmissen was eh auskommentiert war und habe mir dann die anderen Konfigurationen, die man nicht vom Namen herleiten konnte, genauer in der lighttpd Dokumentation angesehen. Den Debian Manual Block am Ende habe ich auch entfernt, da ich auf einem Server eh keine Manuals lese.

server.modules = (
    "mod_access",
    "mod_alias",
    "mod_accesslog",
    "mod_compress"
)

server.port = 81
server.pid-file = "/var/run/lighttpd.pid"
server.document-root = "/var/www/"
server.upload-dirs = ( "/var/cache/lighttpd/uploads" )
server.errorlog = "/var/log/lighttpd/error.log"

server.username = "www-data"
server.groupname = "www-data"

index-file.names = ( "index.php", "index.html", "index.htm" )
accesslog.filename = "/var/log/lighttpd/access.log"
url.access-deny = ( "~", ".inc", ".htaccess", ".htpasswd" )
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )

server.dir-listing = "disable"
dir-listing.encoding = "utf-8"

compress.cache-dir = "/var/cache/lighttpd/compress/"
compress.filetype = (
	"text/plain",
	"text/html",
	"application/x-javascript",
	"text/css"
)

# aktiviert ipv6 support des lightys wenn es das system unterstützt
include_shell "/usr/share/lighttpd/use-ipv6.pl"

#liest die mime types /etc/mime.types aus
include_shell "/usr/share/lighttpd/create-mime.assign.pl"

# laedt die Configs unter /etc/lighttpd/conf-enabled/*.conf
include_shell "/usr/share/lighttpd/include-conf-enabled.pl"

Jetzt die fastcgi config nach den eigenen Vorstellungen anpassen.

$ nano /etc/lighttpd/conf-available/10-fastcgi.conf
server.modules += ( "mod_fastcgi" )
fastcgi.server = ( ".php" =>
    ((
        "bin-path" => "/usr/bin/php-cgi",
        "socket" => "/tmp/php.socket" + var.PID,
        "max-procs" => 3,
        "idle-timeout" => 20,
        "bin-environment" =>
        (
            "PHP_FCGI_CHILDREN" => "4",
            "PHP_FCGI_MAX_REQUESTS" => "5000"
        ),
        "bin-copy-environment" =>
        (
            "PATH", "SHELL", "USER"
        ),
        "broken-scriptfilename" => "enable"
    ))
)

Mit den Optionen max-procs und PHP_FCGI_CHILDREN kann man den Arbeitsspeicher Verbrauch nach seinen eigenen Bedürfnissen anpassen. Der Socketname bekommt bei mir noch die PID des Prozesses angefügt. Kurz nachdem ich den Server fertig hatte, starb er mir recht schnell weg wenn mehrere User auf eine Seite zu griffen und produzierte diese Fehlermeldung im errorlog:

(mod_fastcgi.c.2900) backend is overloaded;
we'll disable it for 2 seconds and send the request to another backend instead: reconnects: 0 $
(mod_fastcgi.c.3542) all handlers for  /index.php on .php are down.
(mod_fastcgi.c.2673) fcgi-server re-enabled:  0 /tmp/php.socket

In einem Forum fand ich dann den Tipp mit der PID. Ich weiß nicht ob dies wirklich die Lösung war (weil ich ne Menge anderer Sachen getestet habe), aber seit dem setze ich diese Einstellung immer und hatte diesen Fehler nicht mehr.

Nun ist die php.ini dran. Da ich kein Fan der Standard Config bin, kopiere ich als erstes die php.ini-recommended und passe diese dann an.

$ cp /usr/share/doc/php5-common/examples/php.ini-recommended /etc/php5/cgi/php.ini
$ nano /etc/php5/cgi/php.ini

Wichtig ist das aktivieren von cgi.fix_pathinfo wenn man PATH_INFO und PHP_SELF in seinen Scripten benutzen möchte. Mit cgi.fix_pathinfo = 1 in der php.ini und broken-scriptfilename => "enable" in der fastcgi config hat man beide Variablen zur Verfügung.

cgi.fix_pathinfo = 1

Die fastcgi Config muss natürlich auch noch aktiviert werden.

$ lighty-enable-mod fastcgi

Nun noch lighty neu starten.

$ /etc/init.d/lighttpd restart

Jetzt kann man testen ob alles funktioniert (http://ADRESSE:81/) und vielleicht ein paar Benchmarks laufen lassen um den Vorteil von lighttpd gegenüber apache zu erkennen. Wenn alles fertig ist schaltet man den Apache ab und ändert den Port von lighty auf 80. Ist man zufrieden, kann der Apache komplett entfernt werden.

$ nano /etc/lighttpd/lighttpd.conf
server.port = 80
$ /etc/init.d/apache2 stop
$ /etc/init.d/lighttpd restart

Entfernen des Apache z.B. so:

$ aptitude purge apache2.2-common apache2.2-bin \
apache2-mpm-prefork apache2 libapache2-mod-php5

Abschließend entferne ich noch die mitgelieferte httpd index.html

$ rm /var/www/index.lighttpd.html

Troubleshooting

Bekommt man beim Aufruf von Webseiten nur 403 Fehler, könnte es sein das man vergessen hat die fastcgi config zu aktivieren und danach den lighttpd neu zu laden. Weitere Probleme können mir falschen Zugriffsrechten zusammen hängen. Hier lohnt sich ein Blick in die Logfiles unter /var/log/lighttpd/.

Ähnliche Artikel

Kommentar schreiben

*

*