Eine interessante Alternative zum Apache Webserver bietet der lighttpd-Webserver, kurz "lighty". Viele haben wahrscheinlich von ihm gehört, da auch große Seiten wie YouTube auf diesen Server aufsetzen. Jetzt wollen wir uns selber mal diesen schnellen und ressourcensparenden Server aufsetzen und PHP5- sowie Ruby-tauglich machen.
- Da ich von Apache auf lighttpd migriert habe, war für einen reibungslosen Umstieg natürlich eine präzise Planung nötig, sodass Überraschungen vermieden werden konnten. Zunächst muss also geprüft werden, ob alle beim Apache verwendeten Module auch in ähnlicher Form für lighttpd existieren, was hier der Fall war. Aber jetzt legen wir mal los...
- Nachdem die Ports aktualisiert sind und eine neue Jail erstellt ist, machen wir uns direkt mal an die Installation:
# cd /usr/ports/www/lighttpd/ && make install clean
Folgende Optionen wählen wir im Konfigurationsmenü aus:
[*] BZIP2
[*] CML
[*] MAGNET
[*] MEMCACHE
[*] MYSQL
[*] OPENSSL
[*] WEBDAV - Nachdem lighty installiert ist, müssen wir folgende Zeile in die Datei '/etc/rc.conf' einfügen:
lighttpd_enable="YES" - Jetzt geht es auch schon an die Konfiguration des Servers. Hierbei bietet die Beispielkonfiguration unter '/usr/local/etc/lighttpd.conf.sample' viele Hinweise darauf, wie du was konfigurieren kannst. Folgende Tipps will ich dir zur Konfiguration von lighttpd geben:
- Lade nur die Module die du brauchst, und das ganz am Anfang der Datei
- Binde die MIME-Types per "include"-Befehl ein, das erhöht die Übersichtlichkeit
- Erstelle eine Kopie der Beispielkonfiguration und entferne in deiner Konfiguration alle Teile, die du nicht mehr benötigst. Auch das verbessert die Übersichtlichkeit.
- Jetzt kannst du, nachdem du die entsprechenden Pfade angepasst hast, eigentlich schon statische Seiten aufrufen. Jetzt haben wir zunächst mal eine Basiskonfiguration, die wir in den nächsten Schritten weiter ausbauen werden. Beispielsweise werden wir PHP5 oder Ruby on Rails installieren.
Hinweis: Lese dir die Dokumentationen zu den Modulen auf der Website durch. Diese geben viele sinnvolle Ratschläge, wie du was konfigurieren kannst.
Meine Konfiguration kannst du hier herunterladen: lighttpd.conf
vHosts anlegen
Wichtig ist die Konfiguration der vHosts. Ich empfehle dir für den Anfang mal meine Ordnerstruktur zu übernehmen, wenn du dann verstanden hast wie es funktioniert, kannst du sie gerne an deine Bedürfnisse anpassen.
Hinweis: Ich lege, um die Sicherheit der PHP-Skripte zu erhöhen, für jeden Host einen eigenen User an. Zusammen mit der FastCGI-Unterstützung und einem kleinen Wrapper kannst du jedem Host eine eigene php.ini zuweisen und das Überkreuzlesen zwischen Hosts verhindern. Der Nachteil dieser Methode ist allerdings, dass für jeden Host eigene sog. Children aufgerufen werden, also PHP-Prozesse. Dadurch ist das gemeinsame Nutzen von Speicherplatz (RAM) nicht möglich.
Literatur: Lies dir bitte hierzu auch unbedingt diesen Wiki-Artikel durch.
- Zunächst legen wir die Grundordnerstruktur an, die legen wir nur einmal für alle Hosts an. Die Struktur sieht so aus (die Zahl in Klammer gibt die Rechte an, das Kürzel den Owner im Format USER:GROUP):
- /www (755 www:www)
- /www/fastcgi (755 www:www)
- /www/vhosts (755 www:www)
- /www/vhosts/fastcgi/startup (700 root:wheel)
- /www/vhosts/config (700 root:wheel)
- /www/vhosts/domain.de (550 domain.de:domain.de)
- /www/vhosts/domain.de/htdocs (550 domain.de:domain.de)
- /www/vhosts/domain.de/.logs (750 www:domain.de)
- /www/vhosts/domain.de/.session (750 domain.de:domain.de)
- /www/vhosts/domain.de/.tmp (750 domain.de:domain.de)
- Jetzt will ich dir die Ordnerstruktur noch kurz erklären.
- /www/fastcgi: Hier wird später für jeden Host ein Verzeichnis angelegt, in welches dann die zu ladende PHP.INI und das Socket gelegt werden, also bspw. /www/fastcgi/domain.de/php.ini
- /www/fastcgi/startup: Wir werden jeden FastCGI-Prozess mit Hilfe eines Wrappers abkapseln. Hierfür sind Startskript nötig um verschiedene Parameter zu übergeben. Diese Startskripte legen wir später hier rein.
- /www/vhosts/config: In diesem Verzeichnis werden die einzelnen vHost-Konfigurationen abgespeichert, die dann in der lighttpd.conf eingebunden werden.
- /www/vhosts: In diesem Verzeichnis wird für jeden Host ein Unterverzeichnis angelegt, in welches dann die Logfiles, temporäre Dateien und vor allem das Basisverzeichnis (htdocs) gelegt werden. Hier kommen dann später also die Webseiten rein. Also bspw. /www/vhosts/domain.de/htdocs
- Wie du siehst sind es einige Ordner die anzulegen sind für jeden Host. Wenn ich dir jetzt noch sage, dass für jeden Host noch ein eigener Benutzer und eine eigene Gruppe angelegt werden müssen, wird dir sicherlich übel ;-) Aber ich auch hier habe ich eine Lösung in Form eines kleinen Shell-Skriptes für dich, was "Quick & Dirty" für dich einen neuen Host, einen Benutzer und entsprechende Unterverzeichnisse mit den richtigen Berechtigungen anlegt.
Lediglich die vHost-Konfiguration und die Konfiguration des Erstellungsskriptes musst du per Hand vornehmen, wobei das Erstellungsskript nur einmal an deine IP angepasst werden muss. Hierzu lies dir bitte die Kommentare im Skript durch. Und nicht vergessen die erstellten Konfigurationen entsprechend dem Beispiel in die Datei '/usr/local/etc/lighttpd.conf' einzubinden ("include_shell..."). - Lade dir also hier das Skript vhostcreate.sh herunter und passe es an dein System an. Anschließend kannst du einen neuen Host über folgenden Befehl anlegen:
# vhostcreate.sh create domain.de - Anschließend solltest du noch PHP installieren, was du ja bereits in diesem Tutorial gelernt hast, wobei du die Apache-Module nicht kompilieren, allerdings CGI aktivieren musst: Apache, PHP5, SSL, eAccelerator und Zend
- Um nach der Installation von PHP die FastCGI-Prozesse beim Start der Jail automatisch zu starten, füge folgende Zeile in die Datei "/etc/rc.local" der Jail ein:
for i in /www/fastcgi/startup/*.php.sh; do $i; done
Logrotation
Logfiles werden auf hochfrequentierten Webseiten sehr schnell sehr gross. Dies kann irgendwann zu Problemen führen, aber auch einfach der übermässige Speicherplatzverbrauch können tierisch auf die Nerven gehen, gerade wenn die Daten noch zur Datensicherung auf einen anderen Server übertragen werden sollen. Um dem Problem entgegen zu wirken, gibt das so genannte "Logrotating", was soviel bedeutet, dass die Logfiles bei Erfüllung bestimmter Kriterien rotiert werden, also neu angelegt und archiviert werden.
- FreeBSD nutzt für die Logrotation das Tool "newsyslog", welches in der Datei "/etc/newsyslog.conf" konfiguriert wird. Wenn du die Datei öffnest, siehst du schon einige Beispiele und wie diese konfiguriert sind.
- Zwar kannst du newsyslog für sämtliche Files verwenden, allerdings nutzen wir es in diesem Beispiel für lighttpd-logs, die auf vHost-Basis erstellt werden. Daher fügen wir folgende Zeile am Ende der "newsyslog.conf" ein:
/<pfad-zu>/access.log <uid:gid> 640 7 500 * Z /var/run/lighttpd.pid
Die Konfiguration gliedert sich in 8 Spalten:
- "<pfad-zu>/access.log": Das ist der Pfad zu dem zu rotierenden Logfile.
- "uid:gid": Das ist der Benutzer und die Gruppe, denen die Dateien gehören sollen; <uid:gid> bspw. durch "www:www" ersetzen.
- "640": Das sind die Rechte, die den Dateien nach der Rotation gegeben werden.
- "7": Dies bestimmt die Anzahl der Dateien, die erhalten werden sollen, zusätzlich zum Original (7 bedeutet also 7+1 Dateien)
- "500": Das ist die Dateigrösse in MB die überschritten werden muss um die Dateien zu rotieren
- "*": Anstelle des "*" kannst du auch ein Zeitintervall schreiben, wenn du bspw. jede Woche, unabhängig von der Dateigrösse rotieren möchtest. Das Format sieht so aus: $M1D0 = jeden ersten Tag des Monats, @T23 = jede Nacht um 23 Uhr
- "Z": Bedeutet, dass die Dateien per gzip komprimiert werden sollen, alternativ kannst du auch bzip2 verwenden, dann müsstest du "J" schreiben. Hier gibt es noch mehr Parameter (bspw. RegEx), hierzu konsultiere bitte die man-pages.
- "/var/run/lighttpd.pid": Pfad zum pid-File des entsprechenden Prozesses, um ein SIG-HUP bspw. nach dem Rotieren zu schicken.
- Wenn du nun die Konfiguration vorgenommen hast, musst du den Service einmal per
# /etc/rc.d/newsyslogd restart
neustarten. Sollte kein Syntaxerror vorliegen, wird ab jetzt dein Logfile rotiert.