Lighttpd mit vHosts unter Ubuntu Hardy

Seit einiger Zeit tendiere ich dazu Lighttpd dem guten alten Apachen vorzuziehen. Hauptgrund dafür ist aber weniger die immer wieder hervorgehobene bessere Performance (nicht umsonst setzen z.B. YouTube und MySpace auf den Ultraleichtflieger), sondern das mir die Konfiguration einfach etwas unkomplizierter erscheint als beim, vielleicht etwas mächtigeren, aber dafür auch unübersichtlicheren Apachen. Eigentlich auch egal, denn jeder sollte ja selbst entscheiden wem er den Vorzug gibt.

Eingerichtet wird Lighty hier mit PHP 5 und dem Modul 'simple_vhost', mit dem sehr einfach mehrere virtuelle Hosts angelegt werden können.

Wenn wir fertig sind, werden die Seiten unter folgender Ordner-/Dateistruktur organisiert sein:

/var/www/servers - quasi das Hauptverzeichnis des Webservers, hierin werden die virtuellen Hosts angelegt

/var/www/servers/example.com - Ein Beispiel für einen virtuellen Host

/var/www/servers/example.com/htdocs - Hier landen die Dateien, die beim Aufruf von "http://example.com" angezeigt werden sollen

/var/www/servers/example.com/logs - Hier werden die Logdateien gesammelt

/var/www/servers/example.com/server.conf - In dieser Datei wird die Konfiguration für den Host vorgenommen

So, aber nun direkt rein ins Getümmel und die Installation starten:

Installieren

  1. sudo apt-get install lighttpd php5-cgi

Module aktivieren

Danach werden die oben angesprochenen Module aktiviert ('fastcgi' wird für die Anbindung an PHP benötigt):

  1. sudo lighty-enable-mod fastcgi
  2. sudo lighty-enable-mod simple-vhost

Nach einem 'sudo /etc/init.d/lighttpd force-reload' sollte der der Webserver bereits unter http://localhost erreichbar sein.

Lighttpd Testseite

Konfiguration von mod_simple_vhost

Ausgegangen von der oben erklärten Ordnerstruktur müssen die drei Optionen des 'mod_simple_vost' in der Datei '/etc/lighttpd/conf-available/10-simple-vhost.conf' folgendermaßen konfiguriert werden:

  1. simple-vhost.server-root = "/var/www/servers/"
  2. simple-vhost.document-root = "/htdocs/"
  3. simple-vhost.default-host = "example.com"

Anstatt 'example.com' muss dort natürlich eure Standarddomain stehen!

Danach sollten die angelegten vHosts unter der jeweiligen Domain erreichbar sein.  Dazu ein kleines Beispiel:

Wenn im Browser die Adresse 'http://zeroathome.de/dingsbums.html' aufgerufen werden würde, würde das zur Anzeige der Datei '/var/www/servers/zeroathome.de/htdocs/dingsbums.html' führen.

Nach einem '/etc/init.d/lighttpd force-reload' können neue vHosts unterhalb von '/var/www/servers/' angelegt werden.

Konfiguration der einzelnen vHosts

Problem bei dieser Variante der vHost-Konfiguration ist, dass die Konfiguration der einzelnen Hosts nicht so einfach ist. Doch Opensource wäre nicht was es ist, wenn es nicht auch dafür eine relativ einfache Lösung gäbe. (Die Grundversion stammt übrigens von hier, wurde von mir nur leicht angepasst: http://redmine.lighttpd.net/projects/lighttpd/wiki/HowToSupportConfigurationPerVirtualHost)

Dazu wird die folgende Zeile in die Datei '/etc/lighttpd/conf-available/10-simple-vhost.conf' eingefügt, die dazu führt das ein kleines Skript ausgeführt wird:

  1. include_shell "/var/www/servers/config_servers"

Anschließend wird die Datei '/var/www/servers/config_servers' angelegt und mit diesem Inhalt befüllt:

  1. #!/bin/bash
  2.  
  3. for VHOST in `find /var/www/servers/ -mindepth 1 -maxdepth 1 \( -type d -or -type l \) -exec test -e "{}/server.conf" \; -exec basename "{}" \; 2>/dev/null` ; do {
  4. echo "\$HTTP[\"host\"] == \"$VHOST\" {"
  5. echo "var.vhost_name = \"$VHOST\""
  6. echo "var.vhost_path = \"/var/www/servers/$VHOST\""
  7. cat "/var/www/servers/$VHOST/server.conf"
  8. echo "server.errorlog = \"/var/www/servers/$VHOST/logs/error.log\"",
  9. echo "accesslog.filename = \"/var/www/servers/$VHOST/logs/access.log\""
  10. echo "}"
  11. } ; done

Zu guter Letzt wird die Datei noch ausführbar gemacht:

  1. sudo chown www-data:www-data /var/www/servers/config_servers
  2. sudo chmod u+x /var/www/servers/config_servers

Dann natürlich noch ein '/etc/init.d/lighttpd force-reload' und die neue Konfiguration ist übernommen.

Die Konfigurationsdatei muss dann, wie oben bereits erwähnt unter '/var/www/servers/example.com/server.conf' liegen um berücksichtigt zu werden. Nachdem eine neue Konfigurationsdatei hinzugefügt wurde oder eine vorhandene geändert wurde, muss immer ein '/etc/init.d/lighttpd force-reload' erfolgen, sonst ist die Konfiguration nicht wirksam!

Fertig!

So, das wars bereits. Ein Grundkonfigurierter Lighty fertig für die Arbeit als lokaler oder Internet-Webserver. Wenn gewünscht gibts demnächst noch einige Erweiterungen, wie zum Beispiel SSL oder WebDAV.

Alle Angaben natürlich wie immer ohne Gewähr und alles auf eigene Gefahr und so!

10 Gedanken zu „Lighttpd mit vHosts unter Ubuntu Hardy

  1. Frager7

    Funktioniert das auch mit mehr als einer Domain? Also mit example1.tld und example2.tld und jeweils Subdomains davon?

  2. zoschel

    Mich würde das auch interresieren ob da mit mehr als einer Seite funktioniert, 😉 ich denke der Server macht das schon, das ist mal klar, also mehrere VHost’S, aber ohne einen DNS mit Record einträgen geht das mal nicht, oder liege ich da falsch? ich glaube nicht.

    MfG Zoschel

  3. zero

    Doch, das funktioniert. So lange die Hauptdomain (also zb example1.tld) auf die IP des Servers zeigt funktioniert das wunderbar sogar.

    Einfach den entsprechenden Ordner unterhalb von /var/www/servers anlegen, Lighttpd kümmert sich um den Rest.

    Auch Subdomains sind damit kein Problem. Es muss wie gesagt nur der Ordnername stimmen….also:

    /var/www/servers/example1.tld
    /var/www/servers/example2.tld
    /var/www/servers/sub.example2.tld
    etc…

  4. zoschel

    Ja, ok, das habe ich schon verstanden, es funktioniert nur wenn alle in der selben Haupdomain sind, das wildcard *.example.tld wird dann durch der Webserver erkannt und zu gewiesen.

    Wie sieht es aus wenn ich eine andere Domain anlege die dann heißt …beispiel.tdl , die wird der Server anhand des Headers auch auflösen, aber ohne DNS wird das nicht gehen, alles eine Haupdomain ok, das geht, aber ander Domains müssen erstmal per DNS aufgelöst und auf die IP gebracht werden. Oder liege ich da falsch?

    MfG Zoschel

  5. zero

    @Zoschel: Klar, die zusätzliche Domain muss natürlich per DNS auf die IP des Server zeigen…

  6. zoschel

    Ok, sorry aber ich musste da mal tiefer nachfragen:) weil ich mich zur Zeit intensive mit dieser Materie befassen muss, ungewollt eigentlich:) Ich ging davon aus das eine Software ohne grössere Probleme läuft, zb ISPconfig 3, Da löst der Mydns nicht die Namen auf, obwohl der Dienst als Online gilt:) ist aber nicht so, da bekommt man dann im Forum solche Ausagen hast die Record einträge gemacht usw….und wirst dann als Tester aufgerufen in den Bugtracker zu schreiben, fragst Du aber nach, wo der Fehler genau sein könnte wirst Du gnadenlos auf auf den bezahlbaren Support verwiesen., ich hab den Fehler gefunden, warum Mydns laut der Beschreibung bei howtoforge nicht läuft, aber nach solch einer Antwort werd ich das weder als Lösung noch als Bug Posten.:) sorry, nur mal so nebenbei, weil ich weiß das ich den Ligthly auch mit ISPconfig betreiben kann, viel mir nur so ein.

    Aber den Ligthserver werd ich gleich mal richtig testen, der gefällt mir!!, hab davon auch schon viel gelesen, Danke für Deinen Beitrag!!!

    MfG Zoschel

  7. muh

    Ihrgendwie fehlt hier die angabe was in der ‚/var/www/servers/example.com/server.conf‘ überhaubt drin stehen soll/muss ?

  8. zero

    @muh: 1. weg vom Server, ab unter den Weihnachtsbaum
    2. In die server.conf kommen die Einstellungen rein, die du sonst in die /etc/lighttpd/lighttpd.conf schreiben würdest…
    3. Müssen tut da gar nichts drin stehen, sollen auch nicht, alles optional, aber in der Regel gehören hier der ganze rewrite, auth, usw. Kram rein…

  9. Alex

    Hi!

    Danke für den Artikel, hat mir schon sehr geholfen 🙂

    Zwei Fragen brennen mir noch auf der Seele:

    1.) Wozu sind „var.vhost_name“ und „var.vhost_path“ gut? Ich finde sie nicht in der Dokumentation zu lighttpd

    2.) Gibt es eine simple Metode zur Ergänzung deines scripts, dass eine Anfrage auf „www.test.de“ auf den vhost „test.de“ leitet? Dein Setup schickt nämlich Aufragen mit „www“ vor der Domain alle auf den default host (was ich jetzt schon seit 4h versuche, zu unterbinden 🙂 )

    Gruß und vielen Dank!

    Alex

  10. zero

    @Alex: zu deinen Fragen:
    1. die var. Einträge sind, wenn ich mich nicht täusche gerade, dazu da um sie evtl. in der jeweiligen server.conf zu verwenden, damit man z.B. nicht immer den kompletten Pfad zu den Dateien des vHosts ausschreiben muss. Sind quasi „selbst ausgedacht“ und gehören nicht standardmäßig zur lighttpd-Konfiguration.

    2. Dafür gibt es eine recht einfache Lösung. Du musst die Zeile
    echo „\$HTTP[\“host\“] == \“$VHOST\“ {“
    im Skript durch
    echo „\$HTTP[\“host\“] =~ \“(www\.)?$VHOST$\“ {“

    bitte aber vorher mal testen 😉
    Es gäbe auch noch 2 weitere Lösungen für dieses Problem, aber das ist glaube ich die eleganteste…

Kommentare sind geschlossen.