Howto: LightTPD Webserver unter Debian 5.0

Geschrieben von Eric Scheibler am 29.09.2010

Nachdem ich nun schon einiges an meinem Server getan hatte, durfte auch ein Webserver nicht mehr fehlen. Ziel ist es, Lighty mit PHP5 Unterstützung zu installieren, eine gesicherte Verbindung über https zur Verfügung zu stellen und neben einer allgemein zugänglichen Ablage und einem Upload-Skript auch einen passwortgeschützten Bereich und einen Podcast einzurichten.

Inhaltsverzeichnis

Instalation

# apt-get install lighttpd php5-cgi

Nach der Installation wird das Verzeichnis “/var/www” über Port 80 zur Verfügung gestellt.

Angenommen der Server hat die IP Adresse 192.168.200.200, dann sollte jetzt unter http://192.168.200.200/ die LightTPD Testseite zu finden sein.

Nun sollte man sich vielleicht schon mal die Konfigurationsdatei von Lighty anschauen und ggf. ein paar Parameter den eigenen Wünschen anpassen:

# nano /etc/lighttpd/lighttpd.conf

Ich habe lediglich die Variable “index-file.names” um den Eintrag “inhalt.html” ergänzt, da ich einige Bücher und Zeitschriften mit einer solchen Startdatei besitze und diese sonst nicht angezeigt werden würde.

Will man den Zugang über HTTP komplett unterbinden und statt dessen nur HTTPS erlauben, so muss man z.B. die Variable server.port auf 0 setzen und den Webserver neu starten. Ich brauche den HTTP Zugang aber vor allem für meinen Podcast.

Zugriff über HTTPS

Für die verschlüsselte Kommunikation mit dem Webserver wird ein SSL Zertifikat benötigt. Dessen Erstellung habe ich in diesem Artikel beschrieben.

Lighttpd erwartet das Zertifikat und den privaten Schlüssel allerdings in der gleichen Datei:

# cat /etc/ssl/private/example.org.key /etc/ssl/local/example.org.pem > /etc/lighttpd/example.org.pem
# chmod 600 /etc/lighttpd/example.org.pem

Anschließend aktiviert man das SSL Modul:

# lighty-enable-mod ssl

und erstellt / ersetzt die Datei 10-ssl.conf mit folgenden Zeilen:

# nano /etc/lighttpd/conf-enabled/10-ssl.conf
$SERVER["socket"] == "0.0.0.0:443" {
    ssl.engine                  = "enable"
    ssl.pemfile                 = "/etc/lighttpd/example.org.pem"
    ssl.cipher-list = "ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH:!AESGCM"
    ssl.honor-cipher-order = "enable"
}

Abspeichern und den Webserver neu starten:

# /etc/init.d/lighttpd force-reload

Jetzt sollte unter https://192.168.200.200/ etwas zu sehen sein, beim ersten Besuch wird man vom Browser gewarnt, dass dem Zertifikat nicht vertraut wird. An dieser Stelle muss man einmalig die Fingerprints vergleichen und eine Ausnahmeregel für die Domain hinzufügen. Alternativ das Zertifikat über eine sichere Leitung direkt zu den Clients übertragen.

Ordner mit Passwort schützen

Ich möchte einen Ordner namens “privat” mit einem Passwort schützen. Dazu muss man den Ordner erstmal erstellen:

# mkdir /var/www/privat

Danach das richtige Modul aktivieren:

# lighty-enable-mod auth

Die folgende Datei erstellen / ersetzen:

# nano /etc/lighttpd/conf-enabled/05-auth.conf
auth.backend = "plain"
auth.backend.plain.userfile = "/etc/lighttpd/.lighttpdpassword"

Als nächstes das gerade angegebene passwortfile erstellen:

# nano /etc/lighttpd/.lighttpdpassword
BELIEBIGER_USERNAME:PASSWORT

und die berechtigungen der Datei ändern:

# chown www-data:www-data .lighttpdpassword
# chmod 600 .lighttpdpassword

Schließlich muss in die Hauptkonfiguration lighttpd.conf noch etwas rein (hab ich gleich unter Server Modules eingefügt):

# nano /etc/lighttpd/lighttpd.conf
...
# authentifikation
auth.require = ( "/privat/" =>
(
"method" => "basic",
"realm" => "Meine privaten Daten",
"require" => "user=BELIEBIGER_USERNAME"
)
)

Auch hier ist wieder ein Neustart nötig, bevors funktioniert:

# /etc/init.d/lighttpd force-reload

Ablage und Upload-Skript

Damit auch jemand eine Datei auf meinen Server hochladen kann, brauchte ich ein kleines PHP Skript, welches sich um den Upload kümmert. Ich habe mich für das frei verfügbare Skript PHUploader von www.phphq.net entschieden, da es kostenlos, klein und sehr einfach konfigurierbar ist. Nach dem Download habe ich die Datei phUploader.php nach /var/www/ kopiert und den Unterordner “uploads” angelegt. Anschließend muss man die php Datei noch mit einem Texteditor öffnen und in einigen Punkten konfigurieren:

  • max Größe einer Datei / max Größe aller Dateien in KB also zb 100000 KB
  • Anzahl der gleichzeitig hochladbaren Dateien, standard ist 4
  • $full_url=“yourdomain.com/uploads/”;
  • $folder=“./uploads”;
  • $random_name=false;
  • Dateitypen, die akzeptiert werden, habe beispielsweise noch .zip und .rar hinzugefügt
  • Passwort für Uploads, Cookies werden benötigt

Zusätzlich wollte ich noch eine Mailbenachrichtigung, wenn eine Datei hochgeladen wurde. Deshalb habe ich direkt unter der Variable $success aber noch über dem else Zweig in die Zeile 251 folgendes eingefügt:

mail("mailuser@localhost", "Datei auf mydomain.de hochgeladen", "Die Datei ".$file_name[$i].".".$file_ext[$i]." (".$_FILES['file']['size'][$i]." Bytes) wurde in den Ordner ./uploads/ hochgeladen.", "From: Webserver <upload@localhost>");

Um den Mailversand kümmert sich Postfix, welches @localhost automatisch intern an das Konto mailuser zustellt, kann man ja leicht testen, indem man einfach etwas hochlädt.

Um das Skript nun auch ausführen zu können, braucht man PHP5. Installiert habe ich es ja schon zu Beginn aber es sind noch einige Einstellungen in der PHP5 Konfigurationsdatei nötig:

# nano /etc/php5/cgi/php.ini

Die folgende Zeile unten anfügen: cgi.fix_pathinfo = 1

Außerdem muss man noch festlegen, wie groß die hochzuladenden Dateien maximal sein dürfen. Hat man oben in dem Upload Skript beispielsweise festgelegt, dass eine einzelne Datei max 100 MB und alle 4 Dateien max 400 MB groß sein dürfen, so empfehlen sich die folgenden Einstellungen:

post_max_size = 400M
upload_max_filesize = 400M

Passt man diese Werte nicht an, so bricht das Upload Skript nach dem Upload von 2 MB kommentarlos ab. Ich habe es nicht genau getestet aber der maximale Wert für diese zwei Parameter liegt zwishen 1500 und 2048 MB.

Nach dem Abspeichern kann man das PHP Modul von Lighty aktivieren:

# lighttpd-enable-mod fastcgi
# lighttpd-enable-mod fastcgi-php

Nach dem abermaligen Neustart des Servers ist man eigentlich fertig, das Upload-Skript sollte funktionieren und der Ordner Uploads kann genutzt werden, um selbst größere Dateien für andere zum Download anzubieten. Der Rest ist also optional.

Ein Nachteil der aktuellen Lösung ist, dass der Ordner /var/www/ auf der Systemplatte liegt und jemand diese restlos füllen und damit den Server zum Absturz bringen könnte. Damit das nicht passiert, habe ich mir ein 5 GB großes LVM Volume namens “ablage” angelegt (siehe dieses frühere Blogposting von mir Abschnitt 2.2) und nach /var/www/uploads gemountet:

# mount /dev/Name_der_volume-Group/ablage /var/www/uploads

Vorausgesetzt, das Volume liegt auf der Systemplatte, kann man es gleich noch in die FSTab eintragen, damit man’s beim Serverstart nicht vergisst:

# nano /etc/fstab
...
/dev/Name_der_volume-Group/ablage /var/www/uploads ext3 noatime 0 2

Damit ich an die Uploads rankomme, ohne mich erst auf der Kommandozeile via SSH einloggen zu müssen, habe ich einen symbolischen Link in den Ordner /archiv erstellt. /archiv ist via Samba freigegeben, sodass ich die Uploads bequem vom Windows Notebook aus erreichen kann. Dies und die folgende Konfiguration der Dateirechte habe ich ausführlicher in diesem Artikel beschrieben.

Symbolischer Link:

# ln -s /var/www/uploads /archiv/uploads

Um sicher zu gehen, dass alle Dateien dem Webserver Benutzer “www-data” gehören, passe ich jetzt nochmal rekursiv die Rechte des Ordners /var/www/ an:

# chown -R www-data:www-data /var/www
# chmod -R 0775 /var/www

Damit ich nicht wieder Konflikte bei der Erstellung von Dateien unter Windows (also vom User “freigabeuser”) bekomme, werden alle Dateien mit den Rechten 775 erstellt und durch das Suid - Bit wird sichergestellt, dass jede Datei der Gruppe “www-data” gehört (reicht für den Ordner “uploads”): i ~~~ # chmod -R g+s /var/www/uploads ~~~

Nun muss “freigabeuser” nur noch zur Gruppe “www-data” hinzugefügt werden, damit er die Dateien unter “uploads” bearbeiten kann, dies gilt natürlich auch umgekehrt:

# addgroup freigabeuser www-data

Damit der Inhalt von /var/www nicht so leicht eingesehen werden kann, habe ich noch eine leere “index.html” erstellt, man kann da natürlich alles mögliche reinschreiben, z.B. auch den link zum Upload-Skript.

Podcast Feed einrichten

Gelegentlich stoße ich auf interessante Radiobeiträge oder Interviews, die man sich als .mp3 herunterladen kann. Die einfachste Möglichkeit, diese auf mein iPhone zu bekommen war die Erstellung eines Podcast Feeds. Die einzelnen Folgen speichere ich unter /archiv/podcasts, in diesem Ordner liegt nun auch die feed.xml Datei. Nachfolgend ein Beispiel, in dieser Datei befinden sich nur die nötigsten Tags - wer will, kann das ja noch ergänzen, mir reichts so:

nano /archiv/podcasts/feed.xml
<?xml version="1.0"?>
<rss version="2.0">
<channel>
<title>Podcast Sammlung</title>
<link>http://yourdomain.com/podcast/</link>
<description>Interessante Podcasts</description>
<language>de-de</language>
<item>
<title>Lobby Control</title>
<description>by Medienradio</description>
<enclosure url="http://yourdomain.com/podcasts/LobbyControl.mp3" length="88000000" type="audio/mpeg" />
</item>
</channel>
</rss>

Will ich jetzt eine Folge hinzufügen, muss ich nur das Tag “item” kopieren und anpassen, die mp3 muss bei dem Beispiel im gleichen Ordner liegen. Damit der Webserver den Feed auch anzeigen kann, muss man noch einen symbolischen Link nach /var/www anlegen:

# ln -s /archiv/podcasts /var/www/podcasts

Anschließend ist der Feed unter http://yourdomain.com/podcasts/feed.xml zu finden.

Als Podcast Client fürs iPhone nutze ich den 0,79 Euro teuren Podcaster, da der mit VoiceOver ziemlich gut zusammenarbeitet und alle für mich wichtigen Funktionen wie das Resumen der angefangenen Folgen und das Abspielen in doppelter Geschindigkeit bereitstellt.

Quellen