»Wenn das Aug' nicht sehen will,
So helfen weder Licht noch Brill'.«
– Sprichwort
19 LAMP & Co.
In diesem Kapitel wollen wir uns mit einer sehr populären Erscheinung auseinandersetzen. Die ganze Welt spricht von LAMP – Linux mit Apache, MySQL und PHP [Fn. Manchmal wird das »P« aus LAMP auch als Abkürzung für Perl oder Python interpretiert.]. Mit dieser Open-Source-Kombination kann man einen voll funktionsfähigen Web-Applikationsserver aufsetzen. Die Webseiten können dabei aufgrund der jeweiligen Skriptsprache – in der Regel PHP – dynamisch gestaltet und mit einem Datenbankzugriff auf das MySQL-Backend ausgestattet werden.
Lizenzfreies Setup
Dieses Konzept ist nun in aller Munde, weil bei einem solchen Einsatz ein völlig lizenzkostenfreies System entsteht. Gleichzeitig hat man mit Apache, PHP und MySQL auf Marktführer beziehungsweise Quasistandards gesetzt. In diesem Kapitel zeigen wir Ihnen, wie Sie einen solchen LAMP-Webserver aufsetzen und im Prinzip mit ihm arbeiten.
Die Installation
Die Grundlage für ein solches Setup ist ein frisches, pures Linux-System ohne allzu viel Schnickschnack. Wie Sie verschiedene Linux-Distributionen installieren, erfahren Sie in Kapitel 2. Vermeiden sollten Sie dabei vor allem die grafische Oberfläche X11 sowie andere Netzwerkdienste wie SMTP- oder POP3-Server.
Bei Serversystemen sollte man sich nämlich auf das Wesentliche beschränken. Wenn man einen SMTP-Dienst auf einem Webserver nur laufen lässt, weil dieser zufällig bei jeder Installation der Lieblingsdistribution mit auf die Platte geschaufelt wird, so tut man höchstens einem Angreifer einen Gefallen – denn alle anderen brauchen den Dienst nicht, er hingegen hat eine weitere Angriffsmöglichkeit.
19.1 Apache
Nicht nur beim Basteln der eigenen Homepage kann ein Webserver hilfreich sein. In Zeiten von immer billiger werdenden Flatrates und virtuellen Servern (V-Servern) wird auch ein eigener Internetserver immer verbreiteter. Ein HTTP-Dienst gehört bei einem solchen Setup eigentlich auch immer dazu.
Als Software empfehlen wir dabei das »A« aus LAMP: Apache – den im Internet am weitesten verbreiteten Webserver. Aufgrund seiner Verbreitung ist es ziemlich wahrscheinlich, dass Ihre Distribution bereits ein Apache-Paket enthält.
Etwas zur Geschichte
Der Grund für den Erfolg von Apache liegt sicherlich in seiner Geschichte. Unter der Bezeichnung »NCSA HTTPd« wurde er als einer der ersten Webserver vom National Center for Supercomputing Applications an der University of Illinois entwickelt.
A patchy Server
Irgendwann wurde der Support für das Produkt allerdings eingestellt, und die Administratoren der zahlreichen NCSA-Installationen, die es bis dahin gab, waren auf sich allein gestellt. Schon bald kursierten viele Patches und Erweiterungen. Diese Bestrebungen wurden später im Apache-Projekt koordiniert, dessen Name sich aus dieser Geschichte erklärt: A PAtCHy sErver.
Viele Jahre lang wurde der Apache-Server in der Version 1.3.x eingesetzt, die auch wir noch in der ersten Auflage dieses Buches besprochen haben. Für Neuinstallationen wird allerdings praktisch kaum mehr auf Version 1.3.x zurückgegriffen, weshalb wir uns im Folgenden auf die Apache-Version 2.x konzentrieren werden.
Die Datei »apache2.conf«
Konfiguration
Im Folgenden wollen wir den Apache konfigurieren. [Fn. Die Installation haben Sie bestimmt schon ganz selbstständig über das Paketverwaltungstool Ihrer Distribution erledigt – vielleicht haben Sie sich sogar die Quellen von apache.org gezogen und selbst übersetzt. :-)] Dazu editieren wir die Datei apache2.conf, die sich meistens in /etc/apache2 bzw. /etc/httpd befindet. Die Datei ist relativ groß – kein Wunder bei einer so wichtigen und umfangreichen Software. Falls die Datei bei Ihnen eher klein ist, dann wird es wahrscheinlich mehrere Include-Anweisungen geben, die andere Konfigurationsdateien in diese Datei einbinden (etwa ports.conf zur Konfiguration der Ports, auf denen der Apache Verbindungen entgegennimmt). Eine Übersicht über die Include-Anweisungen Ihrer apache2.conf-Datei liefert Ihnen ein grep-Aufruf:
Listing 19.1 Welche Include-Befehle enthält die apache2.conf-Datei?
$ grep Include /etc/apache2/apache2.conf
# Include module configuration:
Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf
# Include all the user configurations:
Include /etc/apache2/httpd.conf
# Include ports listing
Include /etc/apache2/ports.conf
# Include of directories ignores editors' and
# dpkg's backup files,
# Include generic snippets of statements
Include /etc/apache2/conf.d/
# Include the virtual host configurations:
Include /etc/apache2/sites-enabled/
Wie Sie sehen, existieren für den Apache eine ganze Reihe an Include-Anweisungen, die teilweise sogar ganze Unterverzeichnisse wie mods-enabled einbinden. Aber keine Sorge: Hauptsächlich werden wir in diesem Buch Konfigurationsparameter aus den Dateien apache2.conf, httpd.conf und ports.conf besprechen, schließlich handelt es sich nur um eine Einführung. In welcher Datei sich ein Konfigurationsparameter befindet, erfahren Sie jeweils durch grep -R [Parameter-Name] /etc/apache2. Um beispielsweise herauszufinden, in welcher Konfigurationsdatei der Parameter PidFile versteckt ist, ist folgendes Kommando nötig:
Listing 19.2 Herausfinden, in welcher Datei ein Parameter verwendet wird
$ grep -R PidFile /etc/apache2/
/etc/apache2/apache2.conf:# PidFile: The file in which the
server should record its process
/etc/apache2/apache2.conf:PidFile ${APACHE_PID_FILE}
Doch lassen Sie uns nun die wichtigsten Konfigurationsparameter des Apache-2.x beschreiben.
Listing 19.3 Grundkonfiguration
# Standalone-Server auf Port 80
Listen 80
PidFile /var/run/apache2.pid
Listen, PidFile
Unser Apache läuft auf Port 80 (Listen 80). Sie können durch mehrere Listen"=Befehle auch erzwingen, dass der Apache-Server parallel auf mehreren unterschiedlichen Ports läuft. Um den Server an eine bestimmte IP-Adresse zu binden (hierbei funktionieren auch IPv6-Adressen), genügt ein Listen-Befehl der Form Listen Adresse:Port, also etwa Listen 192.168.2.99:8080. In die unter PidFile angegebene Datei schreibt der Dienst nach dem Start seine Prozess-ID hinein.
Listing 19.4 Timeout
Timeout 300
Timeout
Mit dem Timeout-Befehl geben Sie die Anzahl Sekunden an, nach denen eine Verbindung durch ein Netzwerk-Timeout beim Senden oder Empfangen geschlossen wird.
Listing 19.5 Rechte
User www-data
Group www-data
Kein root
Mit den folgenden beiden Anweisungen legen Sie die Rechte fest, unter denen der Prozess laufen soll. Auf keinen Fall sollten hier administrative root-Rechte vergeben werden. Wichtig ist nur, dass der betreffende Benutzer Zugriff auf das DocumentRoot-Verzeichnis mit allen Webseiten hat.
Listing 19.6 Weitere Konfigurationsparameter
DefaultType text/plain
HostnameLookups Off
DefaultType
Mit der Option DefaultType geben Sie den im Normalfall zu verwendenden MIME- Typ für Dokumente an, bei denen der Server diesen nicht selbst feststellen kann. Diesen Wert müssen Sie im Normalfall nicht verändern.
HostnameLookups
Für die Option HostnameLookups können Sie die Werte On, Double oder Off vergeben. Wenn Sie die Option mit On aktivieren, versucht der Apache-Server die IP-Adressen von Clients über einen Nameserver in Hostnamen umzusetzen. In Ihren Logdateien finden Sie dann entsprechend den Hostname eines Clients anstelle seiner IP-Adresse. Sollten Sie nach einem DNS-Reverse-Lookup noch ein Forward- Lookup durchführen wollen, können Sie die Option Double verwenden. Laut Apache-Dokumentation ist die Option standardmäßig auf Off gestellt, um Netzwerktraffic zu sparen und schneller die Anfragen von Clients beantworten zu können.
Listing 19.7 Logdateien
ErrorLog /var/log/apache2/error.log
LogLevel warn
CustomLog /var/log/apache2/others.log vhost_combined
ErrorLog, LogLevel und CustomLog
Wichtige Konfigurationsparameter sind auch solche, die die Protokollierung (das Logging) betreffen. Dabei ist zu beachten, dass die in der apache2.conf enthaltenen Einstellungen nur für virtuelle Hosts gelten, wenn die Parameter bei deren Konfiguration nicht gesetzt wurden – aber dazu später mehr.
Über die durch ErrorLog angegebene Logdatei werden Fehlermeldungen protokolliert. Der LogLevel kann den Wert debug, info, notice, warn, error, crit, alert oder emerg annehmen. Der Unterschied der einzelnen Werte liegt darin, wie detailliert die Protokollierung erfolgen soll. Während debug alles protokolliert (selbst das Öffnen einer Datei!) und Ihnen die Festplatte mit solchen Meldungen praktisch zumüllt, wodurch durchaus wichtige Meldungen untergehen können, gibt Ihnen das andere Extrem emerg nur Notfall-Warnungen aus. Es ist sinnvoll, die Voreinstellung (warn) beizubehalten. Sollten Sie etwas ausführlichere Informationen benötigen, können Sie auch einmal notice oder (die Vorstufe zu debug) info ausprobieren.
CustomLog legt die eigentliche Logdatei, die Zugriffe enthält, fest. Beachten Sie, dass in dieser Datei HTTP-Requests protokolliert werden; Fehlermeldungen werden in die über ErrorLog angegebene Datei geschrieben.
Listing 19.8 ServerRoot
ServerRoot "/etc/apache2"
In diesem Verzeichnis sucht der Apache weiter nach verschiedenen Konfigurationsdateien. Dieses Verzeichnis kann je nach Distribution auch anders heißen und braucht in der Regel nicht geändert zu werden.
Listing 19.9 Module aktivieren
$ ls -l /etc/apache2/mods-enabled/mime.load \
/etc/apache2/mods-enabled/dir.load
lrwxrwxrwx 1 root root 26 Feb 15 2007
/etc/apache2/mods-enabled/dir.load ->
../mods-available/dir.load
lrwxrwxrwx 1 root root 27 Feb 15 2007
/etc/apache2/mods-enabled/mime.load ->
../mods-available/mime.load
19.1.1 Module
Apache kennt zudem Module, die seine Funktionalität erweitern (es gibt beispielsweise ein PHP-Modul). Die verfügbaren installierten Module finden sich dabei meist im Unterverzeichnis mods-available/ des ServerRoot-Verzeichnisses. Um ein Modul zu aktivieren, wird ein symbolischer Link im Verzeichnis mods-enabled auf die entsprechende Datei im Verzeichnis mods-available/ erstellt. Eine Übersicht der aktivierten Module erhalten Sie daher ganz einfach über einen Blick in das Verzeichnis:
Listing 19.10 Aktivierte Apache-Module
$ ls mods-enabled/
alias.conf cgi.load php5.conf
alias.load dir.conf php5.load
auth_basic.load dir.load rewrite.load
authn_file.load env.load ruby.load
authz_default.load fastcgi.conf setenvif.conf
authz_groupfile.load fastcgi.load setenvif.load
authz_host.load mime.conf status.conf
authz_user.load mime.load status.load
autoindex.conf negotiation.conf
autoindex.load negotiation.load
In diesem Fall wurde eine ganze Reihe an Modulen geladen, die unterschiedlich wichtig sind. Eines der wichtigsten Module ist mime; es bringt unserem Webserver bei, unterschiedliche Datentypen zu verstehen und vor allem, dies dem Browser mitzuteilen. Nur so kann dieser wissen, ob er gerade eine Webseite (also HTML- Code) oder ein JPEG-Bild (also Binärdaten) lädt.
index.html finden
Ein weiteres wichtiges Modul ist dir; es lässt den Webserver nach einem »Standarddokument« suchen, wenn in der URL nichts weiter angegeben wurde. So gelangt man beim Aufruf von example.com auf die Seite example.com/index.html – oder, wenn sie im entsprechenden Verzeichnis vorhanden ist, auf die Seite /index.htm.
Virtuelle Hosts und DocumentRoot
DocumentRoot
Im Apache kann für jede Site, die auf dem Server läuft, ein eigenes Verzeichnis für die angebotenen Webdateien festgelegt werden. Die Standardsite (default site) wird über die Datei sites-available/default konfiguriert. In diesem Abschnitt legt man nun fest, dass das Wurzelverzeichnis für Webdokumente /var/www ist. Lädt man also http://www.example.com/index.html, so wird die lokale Datei /var/www/index.html an den Client gesendet.
Listing 19.11 Die Datei /etc/apache2/sites-available/default (Ausschnitt)
DocumentRoot /var/www/
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
# This directive allows us to have apache2's default start page
# in /apache2-default/, but still have / go to the right place
RedirectMatch ^/$ /apache2-default/
</Directory>
Virtual Hosts
Im Zusammenhang mit Sites spricht man auch von virtuellen Hosts (engl. virtual hosts). Liefert Ihr Webserver etwa bisher die Site meine-site.xyz und soll nun noch eine weitere Site tolle-site.abc zur Verfügung stellen, können Sie für die neue Site einen neuen virtuellen Host anlegen.
Dazu muss zunächst im Verzeichnis sites-available eine Datei für die neue Site angelegt werden (kopieren Sie dazu einfach die default-Site): cp default tolle-site.abc.
Die neue Datei bearbeiten Sie so, dass Sie ihr ein neues Verzeichnis verpassen (über DocumentRoot) und über ServerName die neue Domain konfigurieren, damit Apache weiß, für welche Domain er das neue DocumentRoot verwenden soll. Weitere Alternativ-Domains (etwa mit www-Subdomain) können durch ServerAlias angegeben werden. Insgesamt sieht Ihre neue Datei dann in etwa so aus:
Listing 19.12 Virtual Host mit Apache
<VirtualHost *>
ServerAdmin ich@mein-mail-provider.xyz
ServerName tolle-site.abc
ServerAlias www.tolle-site.abc
DocumentRoot /var/www/tolle-site
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
ErrorLog /var/log/apache2/meine-tolle-site.error.log
# Possible values include: debug, info, notice, warn, error,
# crit, alert, emerg.
LogLevel info
CustomLog /var/log/apache2/meine-tolle-site.access.log combined
</VirtualHost>
Sämtliche Anweisungen, die sich im VirtualHost-Block befinden (der mit </VirtualHost> abgeschlossen wird) beziehen sich dabei auf Ihren neuen virtuellen Host. Wichtig ist hierbei noch, dass über die ErrorLog-Anweisung und die Anweisung CustomLog zwei zusätzliche Logdateien konfiguriert wurden. Unterschiedliche Logdateien für unterschiedliche virtuelle Hosts zu erstellen, können wir Ihnen nur empfehlen, da dadurch die Übersichtlichkeit der Logmeldungen erhalten bleibt.
Um den virtuellen Host zu aktivieren, müssen Sie nun einen symbolischen Link im Verzeichnis sites-enabled erstellen:
Listing 19.13 Den neuen virtuellen Host aktivieren
# cd /etc/apache2
# ln -s sites-available/meine-tolle-site \
sites-enabled/100-meine-tolle-site
Anschließend muss der Server neu gestartet werden, was wir im Folgenden beschreiben.
Apache verwalten
Natürlich muss man einen Serverdienst wie den Apache auch zur Laufzeit verwalten können. Im Folgenden wollen wir kurz auf das Tool apache2ctl und die wichtigsten Logfiles eingehen.
apache2ctl
Mit dem Programm apache2ctl kann man Apache kontrollieren. Dazu gehört neben den Möglichkeiten des Startens, Neustartens und Stoppens natürlich auch die Option, die Konfigurationsdatei auf Korrektheit hin zu überprüfen. Hier eine Übersicht über die Möglichkeiten des Tools:
Listing 19.14 apache2ctl
# Die Konfiguration testen:
# apache2ctl configtest
# Den Server starten:
# apache2ctl start
# Den Server beenden:
# apache2ctl stop
# Den Server neustarten:
# apache2ctl restart
# Statusbericht anzeigen
# apache2ctl status / fullstatus
Konfigurationsdatei prüfen
Ist die apache2.conf fehlerhaft, so wird bei apache2ctl configtest ein Fehler ausgegeben. Mit dieser Hilfe kann das Problem dann oft recht einfach und schnell behoben werden. Nach einer eventuellen Änderung an der apache2.conf kann Apache dann mit der restart-Option neu gestartet werden:
Listing 19.15 Apache neu starten
# apachectl restart
/usr/sbin/apachectl restart: httpd restarted
Ebenfalls interessant ist die Möglichkeit, sich über den Status des Servers informieren zu lassen. Dafür kann man entweder den Parameter status oder – für noch mehr Informationen – den Parameter fullstatus verwenden:
Listing 19.16 apache2ctl zeigt den Status des Apache an
$ apache2ctl fullstatus
Apache Server Status for localhost
Server Version: Apache/2.2.12 (Ubuntu) mod_fastcgi/2.4.6
PHP/5.2.10-2ubuntu6.4 with Suhosin-Patch
mod_ruby/1.2.6 Ruby/1.8.7(2009-06-12)
Server Built: Mar 9 2010 22:11:44
_________________________________________
Current Time: Friday, 02-Apr-2010 15:52:48 CEST
Restart Time: Friday, 02-Apr-2010 10:43:33 CEST
Parent Server Generation: 0
Server uptime: 5 hours 9 minutes 14 seconds
1 requests currently being processed, 4 idle workers
W____...........................................................
................................................................
................................................................
................................................................
Scoreboard Key:
"_" Waiting for Connection, "S" Starting up, "R" Reading
Request,
"W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup,
"C" Closing connection, "L" Logging, "G" Gracefully
finishing,
"I" Idle cleanup of worker, "." Open slot with no current
process
Eine vollständige Liste der von Ihrem apache2ctl-Programm unterstützten Funktionen und Befehle finden Sie in der zugehörigen Manpage.
Module
Diese wenigen Direktiven reichen nun bereits aus, um einen einfachen kleinen Webserver mit Apache zu betreiben. Natürlich gibt es noch viel mehr als die bisher hier vorgestellten Module. Teilweise bringen diese auch ihre eigenen Schlüsselwörter mit, über die entsprechende Funktionalität konfiguriert werden kann. Häufig genutzte Module sind unter anderem:
- mod_cgi.so
Mit diesem Modul kann man CGI-Skripte nutzen. Das CGI (Common Gateway Interface) war historisch die erste Möglichkeit, interaktive Webinhalte zu gestalten. - libphp5.so
Mit diesem Modul kann man in PHP erstellte Webseiten mit dem Apache darstellen. PHP selbst ist, wie viele andere Erweiterungen, nicht Teil der Standard- Apache-Distribution [Fn. Bei diesem umfangreichen Projekt spricht man auch von einer »Distribution«, beachten Sie jedoch den Unterschied zu den Linux-Distributionen.] und muss separat installiert werden. Eine gute Adresse für alles rund um PHP ist www.php.net.
Sicheres Surfen
- mod_ssl.so
Mit diesem Modul kann man einen HTTPS-Server aufsetzen und damit über den sogenannten Secure Sockets Layer eine verschlüsselte Verbindung zwischen Client und Server aufbauen.
Je nach Distribution gibt es nun spezielle Pakete, die den Apache mit der einen oder anderen Funktion nachrüsten, sowie Pakete, die einen zum Beispiel bereits für SSL vorkonfigurierten Apache installieren.
Die Logdateien
Standardmäßig schreibt der Apache in zwei unterschiedliche Logdateien. Die Datei access.log wird zur Protokollierung einzelner Zugriffe genutzt; in error.log werden nur Fehler geschrieben.
Kontrolle
Beide Dateien befinden sich oft in einem Verzeichnis unterhalb von /var/log/ beziehungsweise von /usr/local/(apache2/), falls Sie den Apache von Hand aus den Quellen kompiliert haben.
Listing 19.17 Eine Zeile aus der access.log-Datei
85.181.56.167 – – [05/Sep/2007:22:35:38 +0200] "GET
/favicon.ico HTTP/1.1" 200 1406 "-" "Mozilla/5.0
(Windows; U; Windows NT 5.1; de; rv:1.8.1.5)
Gecko/20070713 Firefox/2.0.0.5"
Hier sehen Sie eine Zeile aus access.log. Wie Sie bemerken, schickt Ihr Browser sehr viele Informationen über sich und das entsprechende Betriebssystem mit. Außerdem können Sie noch ablesen, dass die Anfrage nach index.html vom Rechner 172.20.2.1 kam.
Listing 19.18 Ausschnitt aus der Datei error.log
[Sun Jul 01 08:52:23 2007] [error] [client 66.249.66.180]
File does not exist: /var/www/robots.txt
[Sun Jul 01 09:15:00 2007] [error] [client 65.55.208.135]
File does not exist: /var/www/robots.txt
An dieser Stelle können Sie feststellen, wofür error.log außer für die Fehler-Eintragungen sonst noch genutzt wird: für Servernachrichten. Im Beispiel sehen Sie die Nachrichten, die der Apache bei unserem Restart hinterlassen hat.
Ihr Kommentar
Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.