Lighttpd und MIME types unter Debian
Bei einer Standard-lighttpd-Installation unter Debian Lenny fehlen in der automatisch generierten MIME-assignment-Liste[1] einige wichtige Einträge, z.B. für .gz oder .bz2. Das führte bei meinem Arch Repo auf tuxed.org dazu, dass in der HTTP-Response diverse Header fehlten, u.A. Last-Modifed.
Über diesen entscheidet aber pacman, ob sein gespeicherter Index für das betreffende Repo noch aktuell ist oder neu geladen werden muss. Fehlt der Header, so zieht pacman den Index jedes Mal neu, was auf Dauer ziemlich nervt.
Kurios dabei ist, dass die generierte Liste weit über 400 (!!) Einträge umfasst - wie um Himmels Willen bekommt man eine so lange Liste zustande, ohne gzip oder bzip2 einzuschließen??
Ich bin mir nicht sicher, ob sich das als Packaging-Bug ansehen lässt, werde bei Gelegenheit weiter nachforschen und evtl. einen Bugreport erstellen.
Vielen Dank an dieser Stelle nochmal an Schnouki, der mir die Erleuchtung bescherte.
[1] /usr/share/lighttpd/create-mime.assign.pl
Automatische Vhosts mit Lighttpd
Mein bereits erwähntes lighttpd-vhost-script hat ein Update erfahren und unterstützt jetzt Subdomains und Vhost- sowie Subdomain-spezifische configs:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | #!/bin/bash VHOST_ROOT="/var/www" VHOST_DEF="default" VHOST_CONF="vhost.conf" SBD_ROOT="subdomains" DOC_ROOT="htdocs" for VHOST in $(find $VHOST_ROOT -mindepth 1 -maxdepth 1 -type d -exec basename {} \;); do # skip default vhost if [ "$VHOST_DEF" == "$VHOST" ]; then continue fi echo "\$HTTP[\"host\"] =~ \"^(www\.|)$VHOST\" {" echo " server.document-root = \"$VHOST_ROOT/$VHOST/$DOC_ROOT\"" echo " accesslog.filename = \"/var/log/lighttpd/$VHOST.access.log\"" if [ -e "$VHOST_ROOT/$VHOST/$VHOST_CONF" ]; then # include vhost config cat "$VHOST_ROOT/$VHOST/$VHOST_CONF" fi echo "}" echo "" # subdomains if [ -d "$VHOST_ROOT/$VHOST/$SBD_ROOT" ]; then for SBD in $(find $VHOST_ROOT/$VHOST/$SBD_ROOT -mindepth 1 -maxdepth 1 -type d -exec basename {} \;); do echo "\$HTTP[\"host\"] =~ \"^$SBD.$VHOST\" {" echo " server.document-root = \"$VHOST_ROOT/$VHOST/$SBD_ROOT/$SBD/$DOC_ROOT\"" echo " accesslog.filename = \"/var/log/lighttpd/$VHOST.access.log\"" if [ -e "$VHOST_ROOT/$VHOST/$SBD_ROOT/$SBD/$VHOST_CONF" ]; then # include subdomain's custom config cat "$VHOST_ROOT/$VHOST/$SBD_ROOT/$SBD/$VHOST_CONF" fi echo "}" done echo "" fi done |
Server Setup – Teil 2: Webserver
Disclaimer: Okay, das könnte jetzt evtl. Richtung Jammerpost gehen, aber auf der anderen Seite könnte es jemandem die vier Stunden rumconfen und Wikis abgrasen ersparen, die jetzt hinter mir liegen.
Diesmal war der Webserver an der Reihe. Für meine paar kleinen Seiten war ich auf der Suche nach einem leichtgewichtigen Webserver ohne viel Schnickschnack (load-balancing, usw.) und lighttpd schien mir da ideal.
Aufgesetzt ist das Ding schnell, das Wiki gibt einem mit dem 10-Minutes-Setup eine wunderbare Starthilfe und bietet zu jedem Modul eine eigene Wiki-Seite.
Einzig bei der Konfiguration von etwaigen virtuellen Hosts muss Hand angelegt werden. Es gibt zwar mit mod_simple_vhost ein Modul für eine automatische Konfiguration anhand der Verzeichnishierarchie, hat aber einen kleinen Schönheitsfehler: www.domain.tld und domain.tld sind zwei verschiedene Hosts und würden in verschiedene Vhosts abgebildet werden.
Nun ist dieses Problem alles andere als neu und es existieren diverse Lösungen, beispielsweise:
- Symlinks erstellen - bläht den Vhost-Root auf, unschön
- URL-Redirection - sauberer, zwingt aber jeden Aufruf in ein fixes Format
Nachdem ich mal einen Blick in die Sourcen riskiert habe, ist mir aufgefallen, dass die simple_vhost-Methode auch nicht performanter umgesetzt wird als einfache Conditionals, daher erstelle ich einfach für jeden Vhost einen Block der Form:
$HTTP["host"] =~ "^(www\.|)test.tld" {
server.document-root = "/var/www/test.tld/htdocs"
server.errorlog = "/var/log/lighttpd/test.tld.error.log"
accesslog.filename = "/var/log/lighttpd/test.tld.access.log"
}Der Regex matcht sowohl auf "test.tld" als auch "www.test.tld". Diese Methode hätte jetzt allerdings den Nachteil, alle Vhosts manuell eintragen zu müssen, also simuliere ich die Automatik von mod_simple_vhost mit einem kleinen Bashscript, welches ich in einer sonst leeren config mit include_shell "/etc/lighttpd/vhost-autoconf.sh" einfach direkt einbinde:
#!/bin/bash VHOST_ROOT="/var/www" VHOST_DEF="default" DOC_ROOT="htdocs" # we exclude the default vhost for VHOST in $(find $VHOST_ROOT -mindepth 1 -maxdepth 1 -type d -exec basename {} \;); do if [ "$VHOST_DEF" != "$VHOST" ]; then echo "\$HTTP[\"host\"] =~ \"^(www\.|)$VHOST\" {" echo " server.document-root = \"$VHOST_ROOT/$VHOST/$DOC_ROOT\"" echo " server.errorlog = \"/var/log/lighttpd/$VHOST.error.log\"" echo " accesslog.filename = \"/var/log/lighttpd/$VHOST.access.log\"" if [ -e "$VHOST_ROOT/$VHOST/server.conf" ]; then cat "$VHOST_ROOT/$VHOST/server.conf" fi echo "}" fi done
Das if-statement bindet existierende server.conf für jeden Vhost ein, sodass hier noch separate Einstellungen getätigt und automatisch eingefügt werden können.