Ein neuer Flickenteppich

Apple ist nicht in allen Bereich innovativ und liefert mit Mac OS 10.3 die altertümliche Apache-Version 1.3.29 aus. Sie lässt sich allerdings sehr einfach durch eine aktuelle Apache-Version ersetzen.

Nach dem Download des Source muss man ihn auspacken (gunzip -c httpd-2.0.50.tar.gz | tar -xf -) und mit folgenden Optionen konfigurieren:

./configure --enable-layout=DARWIN --enable-so

Die Option --enable-so kompiliert Apache für die Verwendung von shared objects (falls man später externe Module wie PHP als DSOs einbinden möchte). Wenn Geschwindigkeit und Sicherheit kein Thema sind (i.e. bei einem lokalen Testserver), kann man auch --enable-shared=max verwenden, um alle mit Apache gelieferten Module schon bei der Installation als DSOs einzubinden.

Die Layout-Angabe stellt sicher, dass bei der Installation das Apple-eigene Layout verwendet wird, d.h. der alte Server wird überschrieben. Lässt man die Layout-Angabe weg, landen die Dateien in /usr/local/apache2 und diversen Unterverzeichnissen. Dieses Layout ist m.E. übersichtlicher, führt aber dazu, dass man den Server nicht automatisch über die Option Personal Web Sharing in den Systemeinstellungen starten kann (dazu s.u.).

Danach muss man lediglich make und [sudo] make install ausführen. Der frische Webserver lässt sich über apachectl, manuellen Start von httpd oder über die Systemsteuerung kontrollieren. Die Konfigurationsdatei httpd.conf findet sich nicht mehr in /etc/httpd/, sondern in /etc/apache2/.

Hinweis: Aus unerfindlichen Gründen lässt sich Apache 2 nach dem Update auf Mac OS 10.3.5 nicht mehr mit dem Darwin-Layout konfigurieren. configure gibt folgende Fehlermeldung aus:

configure: error: expected an absolute directory name for --bindir: NONE/bin configure failed for srclib/apr

Dieser Fehler wurde bereits an die Apache-Entwickler gemeldet.

Ich habe als Notlösung das Default-Layout (Installation in /usr/local/apache2/) gewählt und PHP 5 entsprechend neu konfiguriert (--with-apxs2=/usr/local/apache2/bin/apxs).

Um Apache 2 trotz des abweichenden Layouts beim Bootvorgang automatisch starten zu lassen, kann man das ursprüngliche apachectl umbenennen und einen symlink von /usr/local/apache2/bin/apachectl nach /usr/sbin/apachectl legen:

cd $(dirname $(which apachectl)) sudo mv apachectl apachectl.$$ sudo ln -s /usr/local/apache2/bin/apachectl apachectl

Damit lässt sich Apache 2 auch über die Systemeinstellungen (Personal Web Sharing) kontrollieren.

Alternativ kann man auch die in Mac OS X vorgesehene Prozedur für Unix-basierte Startup Items nutzen. Dazu legt man innerhalb des Verzeichnisses /Library/StartupItems ein Verzeichnis Apache an. Innerhalb dieses Verzeichnisses sollten sich zwei Dateien befinden: Apache und StartupParameters.plist. Die Datei Apache enthält folgenden Code:

#!/bin/sh # # /Library/StartupItems/Apache/Apache # # A script to automatically start up Apache 2 on system bootup # for Mac OS X. # # Source the common setup functions for startup scripts test -r /etc/rc.common || exit 1 . /etc/rc.common StartService () { if [ "${APACHE:=-NO-}" = "-YES-" ] ; then ConsoleMessage "Starting Apache 2 web server" /usr/local/apache2/bin/apachectl -k start fi } StopService () { ConsoleMessage "Stopping Apache 2 web server" /usr/local/apache2/bin/apachectl -k stop } RestartService () { ConsoleMessage "Restarting Apache 2 web server" /usr/local/apache2/bin/apachectl -k restart } RunService "$1"

StartupParameters.plist beschreibt das zu startende Programm:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Description</key> <string>Apache 2.0.50</string> <key>OrderPreference</key> <string>None</string> <key>Provides</key> <array> <string>Apache</string> </array> <key>Uses</key> <array> <string>Network</string> <string>Resolver</string> </array> </dict> </plist>

Alle drei Elemente (Verzeichnis und Dateien) sollten root als Benutzer haben. Schließlich gehört noch eine Zeile in die Datei /etc/hostconfig, die Bezug auf die in Apache festgelegte Variable nimmt:

APACHE=-YES-

Diese Vorgehensweise ist etwas aufwändiger als die Erzeugung eines symlinks, lässt sich dafür aber für beliebige Unix-Programme anwenden.