Leider fehlt Mac OS X eine richtige Paketverwaltung, wie man sie von Unix-Derivaten wie Debian oder Ubuntu kennt. Somit ist auch das Installieren von Paketen wie nginx, PHP-FPM und MySQL schwieriger – mag man meinen. Glücklicherweise jedoch gibt es eine externe Paketverwaltung. Diese nennt sich „brew“ und läuft vollkommen autark neben dem System, da sie eigene Verzeichnisse erstellt und lediglich in die eigentlichen Programmverzeichnisse verlinkt.
Mit dieser Paketverwaltung kann man auch in wenigen Schritten einen eigenen lokalen Webserver zu Testzwecken aufsetzen.
Als erstes muss man natürlich die Paketverwaltung „brew“ installieren. Dazu gibt man einfach folgenden Befehl ins Terminal ein:ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew basiert auf git und ruby und installiert alle Inhalte unter /usr/local
, also nicht direkt ins System – wie bereits erwähnt.
Nach der Installation ist brew direkt nutzbar. Um zu sehen, ob alles funktioniert, wie es soll, sollte man erst einmal die Installation mit folgendem Befehl überprüfen:brew doctor
Eine beispielhafte Ausgabe dieses Befehls bei mir unter OS X Yosemite:
$ brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry and just ignore them. Thanks!
Warning: Your XQuartz (2.7.4) is outdated
Please install XQuartz 2.7.7:
https://xquartz.macosforge.org
Warning: Unbrewed header files were found in /usr/local/include.
If you didn't put them there on purpose they could cause problems when
building Homebrew formulae, and may need to be deleted.
Unexpected header files:
/usr/local/include/jack/control.h
/usr/local/include/jack/intclient.h
/usr/local/include/jack/jack.h
/usr/local/include/jack/jslist.h
/usr/local/include/jack/midiport.h
/usr/local/include/jack/net.h
/usr/local/include/jack/ringbuffer.h
/usr/local/include/jack/session.h
/usr/local/include/jack/statistics.h
/usr/local/include/jack/systemdeps.h
/usr/local/include/jack/thread.h
/usr/local/include/jack/transport.h
/usr/local/include/jack/types.h
/usr/local/include/jack/weakjack.h
/usr/local/include/jack/weakmacros.h
Code-Sprache: PHP (php)
Diese Warnungen kann man jedoch getrost ignorieren.
Eine alternative Meldung sieht folgendermaßen aus:
$ brew doctor
Your system is ready to brew.
Auch hier ist alles in Ordnung.
Vorbereitung:
Um die Installation fehlerfrei vollziehen zu können, benötigt man die Xcode Command Line Tools, welche mit folgendem Befehl installiert werden können:xcode-select --install
PHP:
Dann geht es als erstes an die Installation von PHP-FPM. Zwar findet man PHP 5.3–5.6 direkt schon mit brew search php
, allerdings gibt es dort keine FPM-Unterstützung. Dafür benötigt man eine neue Paketquelle, welche sich mit folgendem Befehl hinzufügen lässt:brew tap josegonzalez/php
Die Installation von PHP (in diesem Falle Version 5.6, daher das „php56“) startet man dann mit folgendem Befehl:brew install php56 --with-fpm --with-imap --with-debug --without-snmp
Wichtig ist das --without-snmp
unter OS X Yosemite, da die Installation von PHP-Phar ansonsten abbricht.
Die Installation kann einige Minuten dauern, da PHP erst kompiliert werden muss.
Damit PHP bei jedem Systemstart direkt mitstartet, muss man nach der Installation folgenden Befehl eingeben:ln -sfv /usr/local/opt/php56/*.plist ~/Library/LaunchAgents
Um PHP direkt nach der Installation zu starten, muss man folgenden Befehl eingeben:launchctl load ~/Library/LaunchAgents/homebrew.mxcl.php56.plist
Um PHP wieder zu stoppen, muss man folgenden Befehl eingeben:launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.php56.plist
Die Konfigurationsdatei von PHP befindet sich unter folgendem Pfad:/usr/local/etc/php/5.6/php.ini
MySQL:
Als nächstes ist MySQL an der Reihe. Für die Installation muss man folgenden Befehl eingeben:brew install mysql --with-debug
Auch hier kann die Installation einige Minuten dauern.
Damit MySQL bei jedem Systemstart direkt mitstartet, muss man nach der Installation folgenden Befehl eingeben:ln -sfv /usr/local/opt/mysql/*.plist ~/Library/LaunchAgents
Zum Starten reicht folgender Befehl:mysql.server start
Der Befehl kann folgendermaßen geändert werden, um unterschiedliche Möglichkeiten zu erreichen:Usage: mysql.server {start|stop|restart|reload|force-reload|status} [ MySQL server options ]
Optional kann man mit folgendem Befehl direkt einige Sicherheitseinstellungen bezüglich Passwörter und Zugriffe vornehmen:mysql_secure_installation
nginx:
Nun fehlt noch nginx. Dieser wird mit folgendem Befehl installiert:brew install nginx
Die Konfigurationsdatei befindet sich hier unter folgendem Pfad:/usr/local/etc/nginx/nginx.conf
Wenn man dort den Port auf 80 setzt, kann man nginx nur mit dem Befehl sudo
starten, da OS X standardmäßig dem normalen Benutzer keinen Zugriff auf diesen Port gibt. Zudem ist eine weitere Konfiguration notwendig.
Nun muss man noch das Startskript nutzbar machen:sudo cp /usr/local/opt/nginx/*.plist /Library/LaunchDaemons
sudo chown root:wheel /Library/LaunchDaemons/homebrew.mxcl.nginx.plist
Um den Server zu starten, muss man folgenden Befehl eingeben:sudo launchctl load -w /Library/LaunchDaemons/homebrew.mxcl.nginx.plist
Um den Server zu stoppen, muss man folgenden Befehl eingeben:sudo launchctl unload /Library/LaunchDaemons/homebrew.mxcl.nginx.plist
Informationen:
Informationen über die einzelnen installierten Dienste findet man mit folgenden Befehlen:brew list nginx
brew list php56
brew list mysql
Konfiguration:
Damit nginx und PHP richtig zusammenarbeiten, sind noch einige Änderungen in der Konfiguration notwendig. Hierbei ist es direkt empfehlenswert, PHP-FPM auf Unix-Sockets umzustellen und PATH_INFO
im Zusammenspiel mit nginx zu aktivieren.
Dazu am besten als erstes in der /usr/local/etc/php/5.6/php.ini
die Konfigurationsvariable cgi.fix_pathinfo
suchen, das Semikolon davor wegmachen und den Wert auf 0 (null) stellen.
Dann wird die /usr/local/etc/nginx/nginx.conf
geöffnet und im server
-Block folgendes eingetragen:
location ~ (?U)\.php(/.*$|$) {
gzip off;
fastcgi_split_path_info ^((?U).+\.php)(/.+)?$;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
if (!-e $document_root$fastcgi_script_name) {
return 404;
}
fastcgi_pass unix:/usr/local/var/run/php5-fpm.sock;
fastcgi_index index.php;
}
Code-Sprache: PHP (php)
Nun muss noch PHP-FPM angepasst werden. Dazu wird die Datei /usr/local/etc/php/5.6/php-fpm.conf
geöffnet und wie folgt bearbeitet:
Die Zeile listen = 127.0.0.1:9000
wird zu listen = /usr/local/var/run/php5-fpm.sock
.
In der Zeile listen.owner = _www
wird das _www
durch den System-Benutzer getauscht, der sowohl PHP-FPM als auch nginx startet.
In der Zeile listen.group = _www
wird das _www
durch den System-Benutzer getauscht, der sowohl PHP-FPM als auch nginx startet.
Die darunter folgende Zeile ;listen.mode = 0666
wird entkommentiert, d. h. das Semikolon zu Beginn fällt weg.
Danach lediglich die Dienste neu starten und PHP-FPM sollte erfolgreich mit nginx zusammenarbeiten. Falls nicht, als erstes in die Logs schauen.