blog.alexanderkoch.net Nerdy news from /home/alex

16Feb 110

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

15Feb 100

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
2Feb 100

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.

lighttpdDiesmal 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.