Apache 2, PHP 5 und MySQL 5 unter MacOS X

Den meisten Webentwicklern dürfte bekannt sein, dass MacOS X von Haus aus, einen Apache-Server mitliefert. Das macht das Verwenden eines lokalen Webservers natürlich einfach: Systemeinstellungen, Web Sharing aktivieren, fertig. Der Zugriff auf http://localhost/ steht direkt zur Verfügung. Es gibt jedoch einen Mangel an der ganzen Sache: die mitgelieferte Version ist die Version 1.3.33. Bereits seit vielen Monaten gibt es den Apache 2. Außerdem wird PHP gar nicht mitgeliefert. Dieser Beitrag soll zeigen, wie es möglich ist, einen Apache 2 inkl. PHP 5 und MySQL 5 (jeweils die aktuellste Version) unter MacOS X 10.4 "Tiger" aufzusetzen.

Voraussetzungen

Bevor es los geht: die aktuellsten Versionen sind häufig nicht als vorkompiliertes Binary vorhanden. Ich habe einige Binaries gefunden, allerdings waren die häufig nicht zueinander stimmig oder ließen sich erst gar nicht installieren. Mit ein wenig Terminal-Arbeit lassen sich aber alle Programmme (außer MySQL) kompilieren und so vom Code her installieren. Das ist aber nicht ganz Ohne und wer gerade mal ein Terminal aufbekommt und dann schon davor kapituliert, sollte eventuell davon absehen, dieser Anleitung zu folgen. Grundsätzlich kann man nämlich über die Konsole/das Terminal jedes noch so stabile System in wenigen Schritten durch kleine Fehler zerlegen. Ein wenig Verständnis über das, was geschieht, sollte also vorhanden sein.
Wer Alternativen sucht, sollte sich den letzten Abschnitt durchlesen.

Die Versionsangaben in diesem Eintrag geben nur an, mit welcher Version ich die Installation gemacht habe (zu diesem Zeitpunkt die aktuellsten Versionen). Im Normalfall sollte es keine Probleme geben, wenn sich die Minor-Version verändert hat. Jedoch könnte es Probleme geben, wenn man versucht eine neue Major-Version zu installieren, also z.B. PHP 6 (sofern es das mal geben wird).

Wie eingangs bereits erwähnt, liefert MacOS X bereits einen Apache-Server mit. Dieser muss zwingend deaktiviert sein (Unter "Sharing" in den Systemeinstellungen), da es sonst zu Versionskonflikten kommen kann. Wer bereits aktiv die alte Version genutzt hat, kann beruhigt sein: alle Dateien und Einstellungen sollten erhalten bleiben.

Sollten während der Installation Probleme auftreten, ist Google eine erstklassige Hilfe. Ich habe in diversen Foren immer wieder die Lösungen zu auftretenden Problemen gefunden.

Apache 2.2.4

Für den Apache 2-Server steht unter http://httpd.apache.org/ der Unix-Source zum Download bereit (auch wenn Unix dran steht, lässt sich das problemlos kompilieren). Einmal als GZip oder BZip2-Paket herunterladen und entpacken. Nun brauchen wir ein Terminal und müssen in das Verzeichnis der gerade entpackten Source-Distribution wechseln.
Nun geht es an's Kompilieren. Die folgenden configure-Zeilen stammen von hier und scheinen wunderbar zu funktionieren. Dabei wird ein Universal Binary erzeugt, d.h.

CFLAGS="-arch ppc -arch i386 -isysroot /Developer/SDKs/MacOSX10.4u.sdk" \
	./configure \
	--prefix=/usr/local/apache2 \
	--enable-mods-shared=all \
	--enable-proxy-balancer \
	--enable-proxy-ajp \
	--enable-proxy-http \
	--enable-proxy-ftp \
	--enable-proxy-connect \
	--enable-proxy \
	--enable-ssl \
	--enable-so

Natürlich könnte man an dieser Stelle auch den --prefix-Pfad verändern, um den Apache an eine andere Stelle zu installieren. Häufig wird der Pfad /Library/Apache2/ vorgeschlagen, aber ich habe mich für die Standard-Unix-Variante entschieden. Das sei jedem selbst überlassen. Wer den Pfad ändert, muss aber im Folgenden auch die Pfad angaben verändern.

Nach dem Konfigurieren, kann es ans Kompilieren gehen:

make

Das kann nun eine Weile dauern, aber sollte ohne Probleme von statten gehen. Anschließend noch ein

sudo make install

Und fertig sollte die Installation sein. Zur Kontrolle einfach erstmal gucken, ob das Verzeichnis /usr/local/apache2/ existiert. Wenn nicht, wird wohl irgendwo ein Fehler aufgetreten sein.

Nun sollte die Config-Datei des Servers bearbeitet werden. Ich habe dazu SubEthaEdit verwendet, aber vi kann in der Konsole hier auch seinen Dienst tun. Die Datei sollte unter /usr/local/apache2/conf/httpd.conf zu finden sein (Achtung! Die Datei kann nur mit Root-Rechten bearbeitet werden, also das sudo bei vi und Konsorten nicht vergessen).
Zuerst muss auf jeden Fall ein ServerName gesetzt werden. Das sollte im Normalfall 127.0.0.1 sein. Wer jetzt in der Konsole ein

/usr/local/apache2/bin/apachectl -k start

Eingibt sollte ohne Probleme auf http://localhost/ zugreifen können.

Falls sich der Apache aber direkt wieder beenden (d.h. das Starten läuft problemlos, nur lässt sich die localhost-Seite dann nicht aufrufen) und im Error-Log (/usr/local/apache2/logs/error_log) so etwas wie (EAI 7)No address associated with nodename: mod_unique_id: unable to find IPv4 address of "mbp-"chris" stehen sollte, dann muss noch das Modul mod_unique_id deaktiviert werden (einfach die entsprechende Zeile in der Config-Datei auskommentieren). Hat mir bisher keine Nachteile eingebracht.

Interessant wird jetzt die Einstellungen des Apple-eigenen Apaches zu übernehmen, damit wir Zugriff auf die alten Verzeichnisse haben. Ich habe die Verzeichnisse einfach direkt übernommen - dass das auch anders geht und man auch Kopien anlegen kann, ist mir klar. Trotzdem habe ich diesen Weg gewählt und er erweist sich als durchaus angenehm.

Zuerst muss der DocumentRoot auf /Library/WebServer/Documents gesetzt werden (erfordert zwei Ersetzungen). Als Nächstes sollten folgende Zeilen eingefügt werden, um die Darstellung des Index wieder schöner zu machen (zugegeben, das ist nur eine Schönheits-OP am Server):

<IfModule mod_autoindex.c>
	IndexOptions FancyIndexing

	#
	# AddIcon* directives tell the server which icon to show for different
	# files or filename extensions.  These are only displayed for
	# FancyIndexed directories.
	#
	AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip

	AddIconByType (TXT,/icons/text.gif) text/*
	AddIconByType (IMG,/icons/image2.gif) image/*
	AddIconByType (SND,/icons/sound2.gif) audio/*
	AddIconByType (VID,/icons/movie.gif) video/*

	AddIcon /icons/binary.gif .bin .exe
	AddIcon /icons/binhex.gif .hqx
	AddIcon /icons/tar.gif .tar
	AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
	AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
	AddIcon /icons/a.gif .ps .ai .eps
	AddIcon /icons/layout.gif .html .shtml .htm .pdf
	AddIcon /icons/text.gif .txt
	AddIcon /icons/c.gif .c
	AddIcon /icons/p.gif .pl .py
	AddIcon /icons/f.gif .for
	AddIcon /icons/dvi.gif .dvi
	AddIcon /icons/uuencoded.gif .uu
	AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
	AddIcon /icons/tex.gif .tex
	AddIcon /icons/bomb.gif core

	AddIcon /icons/back.gif ..
	AddIcon /icons/hand.right.gif README
	AddIcon /icons/folder.gif ^^DIRECTORY^^
	AddIcon /icons/blank.gif ^^BLANKICON^^

	#
	# DefaultIcon is which icon to show for files which do not have an icon
	# explicitly set.
	#
	DefaultIcon /icons/unknown.gif

	#
	# AddDescription allows you to place a short description after a file in
	# server-generated indexes.  These are only displayed for FancyIndexed
	# directories.
	# Format: AddDescription "description" filename
	#
	#AddDescription "GZIP compressed document" .gz
	#AddDescription "tar archive" .tar
	#AddDescription "GZIP compressed tar archive" .tgz

	#
	# ReadmeName is the name of the README file the server will look for by
	# default, and append to directory listings.
	#
	# HeaderName is the name of a file which should be prepended to
	# directory indexes.
	#
	ReadmeName README.html
	HeaderName HEADER.html

	#
	# IndexIgnore is a set of filenames which directory indexing should ignore
	# and not include in the listing.  Shell-style wildcarding is permitted.
	#
	IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t Icon*
</IfModule>

Dazu müssen außerdem noch die Aliase übernommen werden (hier habe ich übrigens das ScriptAlias rausgenommen, weil Apache2 später nochmal sein eigenes definiert und ich keine CGI-Skripte einsetze):

<IfModule mod_alias.c>

	#
	# Note that if you include a trailing / on fakename then the server will
	# require it to be present in the URL.  So "/icons" isn't aliased in this
	# example, only "/icons/".  If the fakename is slash-terminated, then the
	# realname must also be slash terminated, and if the fakename omits the
	# trailing slash, the realname must also omit it.
	#
	Alias /icons/ "/usr/share/httpd/icons/"

	<Directory "/usr/share/httpd/icons">
	Options Indexes MultiViews
	AllowOverride None
	Order allow,deny
	Allow from all
	</Directory>

	# This Alias will project the on-line documentation tree under /manual/
	# even if you change the DocumentRoot. Comment it if you don't want to
	# provide access to the on-line documentation.
	#
	Alias /manual/ "/Library/WebServer/Documents/manual/"

	<Directory "/Library/WebServer/Documents/manual">
		Options Indexes FollowSymlinks MultiViews
		AllowOverride None
		Order allow,deny
		Allow from all
	</Directory>

</IfModule>

Nun wieder zu etwas Wichtigerem: die userspezifischen Sites-Verzeichnisse. Eigentlich aber keine große Sache:

<IfModule mod_userdir.c>
	UserDir Sites
</IfModule>

<Directory "/Users/*/Sites/">
	Options Indexes MultiViews
	AllowOverride None
	Order allow,deny
	Allow from all
</Directory>

Im Wesentlichen ist damit die Konfiguration des Apaches abgeschlossen. Datei speichern und Apache neu starten mit

/usr/local/apache2/bin/apachectl -k restart

Jetzt sollte es möglich sein, ohne Probleme auf http://localhost/ und http://localhost/~<username>/ zuzugreifen.

MySQL 5.0

Eigentlich der leichteste Part. Einfach von hier die aktuelle Version als Binary herunterladen (zu finden unter Mac OS X (package format)). Die heruntergeladene DMG-Datei mounten, den .pkg-Installer starten, anschließend das .prefPane installieren (einfach Doppelklick) und der Rest läuft ganz einfach über die Systemeinstellungen.

Das Problem ist nur, dass die Installation einige Dateien nicht da ablegt, wo PHP sie erwarten wird. Wir müssen also ein paar Dateien mit Hilfe von symbolischen Verweisen (Symlinks) umleiten. Also rein in's Terminal:

cd /usr/local/mysql/lib
sudo mkdir mysql
cd mysql
sudo ln -s ../libmysqlclient.15.0.0.dylib libmysqlclient.15.0.0.dylib
sudo ln -s ../libmysqlclient.15.0.0.dylib libmysqlclient.15.dylib
sudo ln -s ../libmysqlclient.15.0.0.dylib libmysqlclient.dylib

Jetzt sollte auch der Installation von PHP nichts mehr im Wege stehen.

PHP 5.2.2

Die Installation von PHP ist etwas haarig. Das größte Problem ist, dass es auf der offiziellen Seite keine Hinweise zur Installation von PHP5 unter Apache2 gibt. Dennoch ist es theoretisch relativ einfach möglich.

Zuerst das aktuelle Source Code-Paket von PHP 5 herunterladen und entpacken. Dann geht es wieder im Terminal weiter:

./configure \
	--with-apxs2=/usr/local/apache2/bin/apxs \
	--with-mysql=/usr/local/mysql \
	--prefix=/usr/local/php5

make

Auch hier sollten die beiden Befehle und Probleme ausgeführt werden. Ein testweises

make test

Ist sinnvoll, auch wenn bei mir am Ende ein Fehler kam - allerdings ließ sich das Paket trotzdem installieren.
Falls an dieser Stelle jedoch ein Fehler auftreten sollte, der irgendwie so lautet:

dyld: Library not loaded: /usr/local/mysql/lib/mysql/libmysqlclient.15.dylib
Referenced from /.../php-5.2.2/sapi/cli/php
Reason: image not found

dann wurden die bei der Installation von MySQL genannten Hinweise nicht beachtet (s.o.).

Ein abschließendes

sudo make install

Sollte die Installation durchführen und erfolgreich abschließen. Nun muss noch die httpd.conf an PHP angepasst werden (s.o.):

Falls noch nicht geschehen, muss das PHP5-Modul noch eingebunden werden:

LoadModule php5_module modules/libphp5.so

Bei mir wurde diese Zeile jedoch automatisch eingefügt. Außerdem müssen wir noch die Dateiendung .php vergeben:

AddType application/x-httpd-php .php

Fertig. Jetzt sollte der Server "up and running" sein. Einfach testweise mal eine .php-Datei mit dem Inhalt

<?php phpinfo(); ?>

erstellen und auf dem Server aufrufen.

Fazit / Alternativen

Natürlich ist es ein wenig Arbeit, auf diese Weise einen lokalen Apache-Testserver aufzusetzen. Aber es hat den entscheidenen Vorteil, dass alle Programme auf dem aktuellsten Stand sind und für das aktuelle System kompiliert sind.

Natürlich kann man sich auch nach Alternativen umsehen. In diesem Artikel bei Tucows werden drei Pakete verlinkt: Apache 2.0.48, MySQL 4.0.15 und PHP 4.3.4RC2. Die Versionsnummern zeigen schon, dass das Ganze ein wenig veraltet ist, aber für manch einen mag das reichen.

Wie anfangs bereits gesagt, ist Google eine gute Anlaufstelle, wenn es mit dem Kompilieren nicht auf Anhieb funktioniert. Ansonsten besteht auch die Möglichkeit über die Kommentarfunktion nach Hilfe zu fragen. Allerdings kann ich nicht garantieren, dass ich alle Fragen beantworten kann - ist auch davon abhängig, wie viel Resonanz dieser Eintrag hervorruft.
Über Feedback würde ich mich aber auf jeden Fall freuen.


Artikel ist Copyright © by Christopher Harms, 2005-2007 und steht unter der CC-By-NC-ND 2.0.