Apache ist der am meisten verwendete WebServer laut Netcraft.
Homepage: http://httpd.apache.org/
Lizenz: Apache Software License
Derzeit sind 2 Hauptversionen von Apache im breiten Einsatz: Apache1 (1.3.xx) und Apache2 (2.0.xx).
Auch das LinuxWiki läuft mit Apache - allerdings wird die Hauptarbeit von MoinMoin gemacht (Python-CGI).
Inhaltsverzeichnis
Tipps & Tricks
Etwas ziemlich Geniales am Apache ist die /RewriteEngine.
Geld sparen mit /mod_gzip (Kompression)
Platz sparen mit /mod_gunzip
Für Python-Skripte bietet sich /mod_python an.
Bücher zum Thema
Ich habe hier ein sehr gutes Buch über Apache zu empfehlen: Der Apache Webserver; Lars Eilebrecht, Nikolaus Rath, Thomas Rohde; Verlag: mitp; 3-8266-0829-1 -- JanRoehrich 2002-10-06 21:09:14
Ein weiteres Buch: L.Stein and D. MacEachern. Writing Apache Modules with Perl and C. O'Reilly, 1999, 1-5659-2567-X
Es gibt ein Projekt am Hasso-Plattner-Institut Potsdam zur Modellierung des Apache - nicht so sehr interessant für Leute, die Apache nur benutzen, sondern für die, die wissen wollen, wie er "innendrin" funktioniert: http://apache.hpi.uni-potsdam.de/
Apache 2.x & SSL/https
Schnelle Methode
Hier werden die Linux-Distributions eigenen Pakete von Apache und openssl genutzt. Ein Verzeichnis ist anzulegen für die Schlüssel und die Konfiguration, z.B. unter /home/ca. Dorthin muss die openssl.cnf und die CA.pl kopiert werden, zu finden sind diese mit find / -name CA.pl}} und {{{find / -name openssl.cnf
Unter Debian/Ubuntu wäre das z.B.
cp /usr/lib/ssl/openssl.cnf /usr/lib/ssl/misc/CA.pl /home/ca
Nun können die beiden Dateien angepasst werden wenn das gewünscht ist, z.B. wenn die Zertifikate länger als ein Jahr gültig sein sollen.
Nun un das Verzeichnis /home/ca gehen und aufrufen:
./CA.pl -newca ./CA.pl -newreq ./CA.pl -signreq ./CA.pl -pkcs12 "Meine Webseite"
Hier ist nun einiges zu beantworten, wichtig ist insbesondere Common Name (eg, YOUR name), hier muss der Name des Webservers eingetragen werden, wie linuxwiki.de.
Die Zertifikate sind damit erstellt, es fehlt nur noch ein Server-Key, der kein Passwort enthält.
Dieser Schlüssel wird erzeugt mit:
openssl rsa -in newkey.pem -out newkeyohnePW.key
Ausführliche Methode
Da man die meisten Erklärungen für mod_ssl in Verbindung für Apache 1.3.x erhält, soll hier eine kurze Anleitung dafür gegeben werden, wie man das für Apache 2.x macht. Apache 2 hat den Vorteil, das mod_ssl gleich mitgeliefert wird. Zur Zertifikats erstellung ist trotzdem noch eine weitere Software nötig, nämlich OpenSSL. Als erstes muss Apache entpackt und konfiguriert werden. Wichtig sind dabei folgende Optionen: "--enable-ssl" und "--with-ssl=[DIR]". Dabei muss in "[DIR]" der Pfad zu den 'Source'dateien von OpenSSL sein. Es muss auch der absolute Pfad sein, ansonsten bricht das konfigurieren ab. Danach ruft man wie gewohnt "make" und "make install" auf.
Nun muss man OpenSSL kompilieren, hierzu reicht im Grunde der ganz normale Aufruf, ohne bestimmte Parameter. Dann müssen wir zunächst ein Zertifikat erstellen. Genauere Informationen zu den Zertifikaten und den Spezifikationen gibt es auf der mod_ssl-Seite. Man sollte wirklich wissen, wie SSL funktioniert, aber das hier zu erklären sprengt den Rahmen. Um uns erstmal einen Key zu erstellen, benutzen wir die mit OpenSSL gelieferte Funktion (die standardmäßig in den /bin Ordner kopiert wird). Mit diesem Aufruf:
openssl genrsa -des3 -rand file1:file2:file3 -out www.example.com.key 1024
generiert man einen Schlüssel. Wobei "genrsa" der Befehl ist zum Schlüssel erstellen. "-des3" ist optional und besagt, dass der Schlüssel durch ein Passwort geschützt wird. Dies ist ""dringend"" empfohlen, auch wenn man bei jedem Start von Apache dann das Passwort eingeben muss. "-rand" sucht sich aus den Dateien file1, file2, file3 dann Bytes zum Verschlüsseln. Hierbei kann eine biliebige Anzahl von Dateien getrennt durch ":" angegeben werden. Sie sollten doch sehr zufällig ausgewählt und relativ groß sein. "-out" legt fest, in welche Datei der key gespeichert werden kann. Lässt man das weg, wird er angezeigt. Die "1024" gibt die Länge des Schlüssels (in Bit) an. Danach müssen wir uns einen "Certificate Signing Request" erstellen, dies geschieht durch dieses Kommando:
openssl req -new -key www.example.com.key -out www.example.com.csr
Wobei der Dateiname hinter "-key" natürlich auf die eben erstellte .key Datei zeigt.
Dieses Script fragt nun nach ein paar Daten, die wahrheitsgemäß angegeben werden müssen. Bei "Common Name" muss unbedingt die Adresse stehen, die der Benutzer später aufruft, sonst wird eine Warnung an den User ausgegeben. Nun kann man diese csr-Datei an einen sog. CA senden, der dann ein Zertifikat erstellt. Über den genauen Ablauf kann man sich bei VeriSign oder Thawte informieren. Es gibt natürlich noch weitere CAs.
Es gibt aber auch die Möglichkeit sich sein Zertifikat selbst zu erstellen. Dafür führt man diesen Befehl aus:
openssl x509 -req -days 30 -in www.example.com.csr -signkey www.example.com.key -out www.example.com.cert
Hierbei ist bei "-in" und "-signkey" die eben erstellten Dateien zu benutzen. In der Datei von "-out" wird dann das Zertifikat erstellt. Der Parameter "-days" gibt an, wann das Zertifikat abläuft (also in wievielen Tagen).
Nun muss man noch zwei Dateien kopieren. Bei der Standardinstallation muss das Zertifikat nach /usr/local/ssl/certs und der key nach /usr/local/ssl/private.
Einbinden der Zertifikate in Apache
Danach folgt das, was am meisten Zeit beansprucht. Das wirkliche Konfigurieren des Indianers anhand der .conf-Dateien. Es gibt in dem /conf Ordner des Apachen eine ssl.conf, die die Standardeinstellungen bestimmt. Diese können wir erstmal so lassen, bis auf den Bereich über den Virtual Host - diesen kommentieren wir komplett mit "#" aus (also vom Beginn der <Virtualhost> Container bis zum </Virtualhost>). Nun gehen wir zu unserer eigenen Definition unserer Virtualhosts. Ich hatte sie in einer speziellen eigenen Datei namens vhosts.conf. Nun erstellen wir ganz normal einen vHost (die Einstellungsmöglichkeiten sind sehr zahlreich), fügen aber folgendes ein:
SSLEngine On SSLProtocol +all SSLCiphersuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL SSLCertificatefile /pfad/zum/zertifikat.cert SSLCertificatekeyfile /Pfad/zum/schluessel.key
An dem Container <virtualhost> muss zu der IP noch der Port 443 eingetragen werden. Dann den Apachen neu starten und schauen, ob er richtig startet - danach ausprobieren. Es sollte die Meldung über das Zertifikat kommen.
Dies ist jetzt nur eine Standardanleitung. Man sollte sich, wenn man es wirklich produktiv einsetzen will, auf jeden Fall ein paar Dokumentationen durchlesen (insbesondere die Sicherheit betreffend). Gute Seiten dafür sind die Seiten für Apache und die Seite von mod_ssl (s.o.).
Verwandte Projekte
FOP - Formatting Objects Processor - Stylesheet Prozessor.
Fragen & Antworten
Frage: Weiß vielleicht jemand, wie ich mehrere VirtualHosts via SSL mit unterschiedlichen Zertifikaten ansprechen kann? Zur Zeit benutze ich Apache 1.3.26. Einerseits habe ich aus einer Doku von 1und1, dass man nur einen SSL VirtualHost mit dem Apache betreiben kann (http://server.1und1.com/root_server/howto/6.html), andererseits würden dann Direktiven wie z.B. SSLEngine oder SSLCertificateFile, welche innerhalb einer VirtualHost Konfiguration benutzt werden in dieser Form nicht benötigt. Beim Ausprobieren mit verschiedenen Subdomains wurde mir zwar die richtige Seite geliefert, aber immer nur das Zertifikat des ersten Virtual Hosts. Kennt sich jemand mit dem Problem aus und hat eventuell eine Beispielkonfig für mich? In der Apachedoku bin ich bisher nicht fündig geworden, könnte aber auch an meinen mangelhaften Englischkenntnissen liegen. Vielen Dank im voraus, NeoLex
Die Antwort habe ich mittlerweile gefunden: Mit nur einer IP-Adresse lassen sich mehrere namensbasierte virtuelle Hosts nicht betreiben, da der SSL-Handshake (wenn der Browser das sichere Zertifikat des Web-Servers akzeptiert) vor der HTTP-Anforderung stattfindet, die den geeigneten namenbasierten virtuellen Host identifiziert. Die Lösungsmöglichkeiten bestehen also entweder darin weitere IP-Adressen zu mieten oder einen SSL-Proxy mit mod_rewrite, wie in o.g. Anleitung beschrieben, einzurichten. Trotzdem vielen Dank -- NeoLex
Frage: Wo finde ich ne gute Anleitung, wie zwei Apache Instanzen auf einem System laufen lassen kann. Ich brauche das weil ich durch eigene Entwicklungen auf Version 2.0.40 festgelegt bin, andererseits aber für eine Seite LDAP Authentifizierung brauche, welche ers ab Version 2.0.41 enthalten ist. -- JanRoehrich 2003-07-17 13:12:52
Ist doch kein Problem, einfach beim Kompilieren unterschiedliche Verzeichnisse (--prefix normalerweise) angeben (z.B. /opt/httpd-2.0.40 vs. /opt/httpd-2.0.41) und unterschiedliche Ports/IPs nutzen -- RonnyBuchmann 2003-07-17 18:46:20
Ja das ist natürlich klar. Aber ich hab mal irgendwo gelesen, dass es eine Konfiguration mit NamedPipes gibt, bei dem beide Instanzen Port 80 nutzen können und das dann irgendwie über virtuelle Server geregelt wird. Kann aber auch nur ein schlechter Scherz gewesen sein. -- JanRoehrich 2003-07-17 19:32:38
Named pipes kann ich mir nicht vorstellen, aber mit der /RewriteEngine ist es ja auch kein Problem. -- RonnyBuchmann 2003-07-18 08:17:38
Hört sich nach Ente an. Grundsätzlich mal verwende man die -d oder -f Optionen, um die Serverroot bzw. eine andere Config anzugeben (Neukompolieren ist nicht notwendig, beide Instanzen können die selbe Codebase und z.B. auch Module (DSO) gemeinsam benutzen). Um beide auf Port 80 laufen zu lassen, braucht man einen IP-Alias.
-- JürgenHermann 2003-08-01 00:45:17
Ich habe ein kleines Problem. Mein Apache ignoriert meine .htaccess. Was muß ich aktivieren, damit er sie nicht mehr ignoriert? -- ChristianNill
Schau mal in deinen <Directory> Optionen, dort könnte AllowOverride None stehen oder weiter oben ist eine andere Endung fur .htaccess Files angegeben. Wichtig ist wirklich die Option AllowOverride None - ist diese gesetzt, werden .htaccess Dateien schlichtweg ignoriert und der Zugriff nur über <Directory>-Einträge geregelt (was IMHO aber auch der bessere Weg ist, wenn man Zugriff auf die httpd.conf hat). -- Jan Kesten
Bei dem Apache von Debian Woody ist der Content-Length header kaput. Bei Dateien >2G ist er negativ. Bug? Was kann man tun?
http://bugs.debian.org/ würde ich vorschlagen
Frage: Wie bring ich den Apache2 dazu perl auszuführen? -- ThomasHochstetter 2004-05-14 16:59:46
Das steht z. B. im User's Guide von mod_perl 2.0.
siehe auch WebServer, ApacheTop