OS X: nginx, PHP-FPM und MySQL mit „brew“ installieren

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.hCode-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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert