MAMP Stack

Do-it-yourself-AMP-Stack für macOS (High Sierra, Sierra, El Capitan, Yosemite)

AMP steht für „Apache, MySQL, PHP“, also der Webserver Apache, die Datenbank MySQL sowie PHP. Das sind die Ecksteine für ein lokales HTTP-Server-Environment.

In diesem Artikel werden wir im Do-it-yourself-Verfahren einen AMP-Stack auf dem Mac unter macOS Sierra, El Capitan oder Yosemite einrichten, und im Anschluss unsere Online-Site auf den lokalen Server clonen (am Beispiel von WordPress).

Update 7 Okt 2017 @ 18 h: Aktualisiert für macOS 10.13 (High Sierra)

Wozu ein lokaler HTTP-Server?

Ein lokaler HTTP-Server erlaubt es, einen Clone – oder eine Variante – der aktuellen Online-Website auf dem Rechner – also lokal und offline – laufen zu lassen. Das ist zum Beispiel absolut empfehlenswert, um neue Plugins auszutesten oder sonstige Experimente durchzuführen. Man kann/sollte auch neue Websites lokal vorbereiten, bevor man sie überhaupt online stellt.

Warum keine Fertiglösung wie MAMP oder AMPPS?

AMPPS ist ein hervorragender, fertig runterladbarer AMP-Stack, der unserer Do-it-yourself-Lösung mindestens ebenbürtig und in einigen Aspekten sogar überlegen ist (zentrales UI, integrierte Installer für eine Vielzahl von CMS und sonstigen Apps).

Aber …

  • Wo bleibt der Spaß bei Fertiglösungen?
  • Kein Lerneffekt bei der Fertiglösung.
  • Warum etwas doppelt installieren, das (zum größten Teil) schon vorhanden ist?
  • Der Do-it-yourself-Stack ist „nativer“, d.h., besser integriert: Es muss keine Dritt-App gestartet werden, der Server ist nach jedem Mac-Reboot automatisch verfügbar.
Das sind doch genügend Argumente für einen „richtigen“, handgearbeiteten Stack, oder?

Voraussetzungen

Ein paar grundlegende Kenntnisse

Terminal
Nichts spezielles, aber wir sollten wissen, wie wir eine Befehlszeile im Terminal ausführen, und was eine Tilde ~ oder sudo bedeuten. Aber keine Sorge, sämtliche Ausdrücke, die hier in einem Code-Block auftauchen, können einfach ins Terminal kopiert werden.
Texteditor
Wir sollten wissen, was ein Texteditor ist, und mit einem Vertreter dieser Gattung umgehen können. Dabei ist es egal, ob es sich um einen Command-Line-Texteditor wie Nano oder Vim handelt oder um einen GUI-Texteditor wie BBEdit, TextMate, Sublime Text usw. Wichtig ist, dass der Editor korrekt mit root-User-Dokumenten umgehen kann.1 Falls du noch keinen bevorzugten Texteditor hast, empfehle ich dir BBEdit oder die Lightversion TextWrangler, vorzugsweise die Nicht-MAS-Versionen.

Homebrew

Homebrew ist im weitesten Sinne ein Package Manager, ähnlich RPM oder dpkg auf Linux. Homebrew ist so praktisch und gut, dass es eigentlich ein Pflicht-Install für jeden Mac sein sollte. Falls noch nicht installiert, dann ist jetzt der richtige Zeitpunkt, es nachzuholen.2

Wenn bereits installiert, dann bitte sicherstellen, dass es up-to-date ist und sauber funktioniert, mit …

brew update

und anschließend …

brew doctor

Ggf. die Reparaturanweisungen ausführen.

Wir benutzen Homebrew zum Installieren von MySQL und phpMyAdmin. Wir könnten jeweils auch die dmg-Installer hernehmen, aber die Homebrew-Methode hat den Vorteil, dass …

  • wir uns nicht um die $PATH-Variable kümmern müssen,
  • sich die Installationen in der Zukunft halbautomatisch updaten lassen (brew upgrade --all)
Gut, dann kann’s losgehen.

Komponenten installieren

Das meiste ist auf dem Mac bereits vorhanden. Wir brauchen nur noch MySQL und (optional) phpMyAdmin.

MySQL installieren und vorbereiten

Wie bereits angekündigt, erledigen wir das kurz und schmerzlos mit Homebrew. Also Terminal öffnen und mit folgender Zeile MySQL installieren:

brew install mysql

Wenn die Installation abgeschlossen ist, sorgen wir dafür, dass MySQL startet und in Zukunft nach einem System-Reboot auch automatisch startet3:

[Update 2017-08-22] Hierzu bitte beim Installieren von MySQL die Meldungen von Homebrew beachten! Mit neueren Versionen lässt sich der Start (und automatische Neustart nach Reboot) von MySQL z.B. einfach mit

brew services start mysql
bewerkstelligen.

Nur wenn diese Anweisung nicht angezeigt wird, oder nicht funktioniert, nach der alten Methode verfahren:

ln -sfv /usr/local/opt/mysql/*.plist ~/Library/LaunchAgents

Dies legt einen Link zum Launch-Agent ins User-Launch-Agents-Verzeichnis. Den Launch-Agent starten mit:

launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist

MySQL läuft also nun und wird zukünftig automatisch gestartet. Mit der folgenden Zeile erledigen wir die grundlegende Konfiguration:

mysql_secure_installation

Es werden nun nacheinander folgende Optionen abgefragt, die wir auch nacheinander alle mit Y bestätigen:

  • Set root password? [Y/n] Passwort natürlich notieren. Die Passwortqualität ist nicht so wichtig hier, da wir davon ausgehen, dass der Server nie von außen erreicht werden kann.
  • Remove anonymous users? [Y/n]
  • Disallow root login remotely? [Y/n]
  • Remove test database and access to it? [Y/n]
  • Reload privilege tables now? [Y/n]

Nun noch ein Verzeichnis für MySQL anlegen mit …

sudo mkdir /var/mysql

und einen Link anlegen mit …

sudo ln -s /tmp/mysql.sock /var/mysql/mysql.sock

Abschließend MySQL neu starten mit …

brew services restart mysql

MySQL sollte nun betriebsbereit sein.4

phpMyAdmin installieren

Das ist ein optionaler Install, aber da wir später sicher ein schönes GUI für Datenbankarbeiten möchten, installieren wir phpMyAdmin doch gleich mit:

brew install phpmyadmin

Je nach Organisation des Homebrew-Repository kann es passieren, dass wir nun einen Hinweis auf einen tap erhalten. Falls das so ist, dann installieren wir phpMyAdmin einfach aus dem von Homebrew genannten Unterverzeichnis, z.B. …

brew install homebrew/php/phpmyadmin

Das wars schon.

Ordner ~/Sites

Wir wollen die Website später auf Userlevel anlegen und brauchen hierfür einen geeigneten Ort. Der früher übliche „Sites“-Ordner im Userhomeverzeichnis scheint irgendwo unter OS 10.9 oder 10.10 verschwunden zu sein. Ich hatte ihn noch, aber das mag daran liegen, dass ich schon länger keinen Clean-Install mehr gemacht habe.

Also: Wenn der Sites-Ordner fehlt, dann bitte einfach im Homeverzeichnis anlegen.

Sites folder in $HOME

Apache konfigurieren

Jetzt beginnt die eigentliche Arbeit. Apache ist zwar vorinstalliert auf dem Mac, aber wir müssen ihn so konfigurieren, dass alles gut zusammenspielt.

Zuerst testen wir ob Apache überhaupt funktioniert. Hierzu starten wir ihn mit …

sudo apachectl start

Jetzt gehen wir mit dem Webbrowser zum ersten Mal auf unsere lokale Site, indem wir folgende Adresse aufrufen:

http://localhost

Wenn Apache funktioniert, sollten wir jetzt den schönen Satz It works! im Browser sehen.

Apache works
Apache funktioniert

Apaches Haupt-Konfigurationsdatei ist httpd.conf und liegt im Verzeichnis /private/etc/apache2/.

Wenn wir einen GUI-Texteditor verwenden, öffnen wir den „Öffnen“-Dialog des Editors mit ⌘O, drücken dann ⇧⌘G und kopieren diesen Pfad ins Eingabefeld:

/private/etc/apache2/httpd.conf

Falls wir einen Command-Line-Editor verwenden, geben wir im Terminal z.B. nano /private/etc/apache2/httpd.conf/ ein.

Im geöffneten httpd.conf ändern wir nun ein paar Zeilen. Zum leichteren Auffinden gebe ich die Zeilennummern an. Es ist also hilfreich, im Texteditor die Anzeige der Zeilennummern einzuschalten.5

Aber Achtung: Je nach Apache-Version können die Zeilennummern abweichen. Die angegebenen Zeilennummern gelten für macOS 10.13 (High Sierra). Betrachte sie bitte als Orientierungshilfe. Entscheidend ist der Inhalt der Zeile!

Zuerst gehen wir zu Zeile 56 …

Zeile
56Listen 80

und ändern sie zu …

56Listen 127.0.0.1:80

Dies ist eine zusätzliche Sicherheitsmaßnahme, um auszuschließen, dass der Server von außen erreicht werden kann.6

Die nun folgenden Zeilen müssen entkommentiert werden, d.h., durch Entfernen des #-Zeichens am Zeilenanfang aktiviert werden:

Zeile
76#LoadModule authn_core_module libexec/apache2/mod_authn_core.so
77#LoadModule authz_host_module libexec/apache2/mod_authz_host.so
173#LoadModule userdir_module libexec/apache2/mod_userdir.so
175#LoadModule rewrite_module libexec/apache2/mod_rewrite.so
176#LoadModule php5_module libexec/apache2/libphp7.so
510#Include /private/etc/apache2/extra/httpd-userdir.conf

Zeilen 76 und 77 sind wahrscheinlich bereits aktiviert. Wie auch immer, danach müssen die sechs Zeilen so aussehen:

76LoadModule authn_core_module libexec/apache2/mod_authn_core.so
77LoadModule authz_host_module libexec/apache2/mod_authz_host.so
173LoadModule userdir_module libexec/apache2/mod_userdir.so
175LoadModule rewrite_module libexec/apache2/mod_rewrite.so
176LoadModule php5_module libexec/apache2/libphp7.so
510Include /private/etc/apache2/extra/httpd-userdir.conf

Wie gesagt, die Zeilennummern können variieren, v.a. bei älteren Systemen (vor macOS 10.13). Auf 10.12 und früher lautet der vorletzte Eintrag in der Tabelle oben „libphp5.so“

Jetzt kopieren wir ans Ende der Datei noch Folgendes:

Alias /phpmyadmin /usr/local/share/phpmyadmin

<Directory /usr/local/share/phpmyadmin/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
Allow from all
Require all granted
</Directory>

Mit httpd.conf wären wir damit fertig und wir können die Datei sichern und schließen.

Als nächstes legen wir ein neues Textdokument mit folgendem Inhalt an:

<Directory "/Users/*/Sites/">
Options Indexes MultiViews FollowSymLinks
AllowOverride All
Require all granted
</Directory>

Das Dokument speichern wir als [yourusername].conf im Verzeichnis /private/etc/apache2/users/. [yourusername] bitte mit deinem Short-Username7 ersetzen.

Der komplette Pfad der neuen Datei ist also:

/private/etc/apache2/users/[yourusername].conf

Um sicherzugehen prüfen wir noch schnell die Permissions der neuen Datei mit ls -l /private/etc/apache2/users/[yourusername].conf; diese sollten -rw-r--r-- lauten.8

Nun öffnen wir im Texteditor die Datei …

/private/etc/apache2/extra/httpd-userdir.conf

Wir entkommentieren dort die Zeile …

Zeile
16Include /private/etc/apache2/users/*.conf

In Zeile 10 sollte unser Sites-Ordner als UserDir Sites eingetragen sein.

OK, jetzt sollte alles passen. Zeit, den Apache neu zu starten mit …

sudo apachectl restart

Abschließende Tests

Webserver und Webverzeichnis

Im Sites-Ordner (in unserem User-Homeverzeichnis) legen wir jetzt einen Ordner an, in den wir nachher unsere Website kopieren wollen. Nennen wir ihn einfach blog.

Wir öffnen den Webbrowser und gehen zu …

http://localhost/~[yourusername]

[yourusername] natürlich wieder mit deinem Username ersetzen.

Diese Adresse ist das Root-Level unseres Sites-Ordners im Homeverzeichnis. Im Browser sollten wir jetzt den Inhalt dieses Ordners angezeigt bekommen, also den eben angelegten blog-Ordner.

Index of Sites directory
Inhalt des Sites-Ordners

MySQL und phpMyAdmin

Im Browser diese Adresse eingeben:

http://localhost/phpmyadmin/

Es sollte sich nun das phpMyAdmin-Interface öffnen. (Falls nicht, dann bitte versuchen, MySQL neu zu starten mit mysql.server restart)

phpMyAdmin login window
phpMyAdmin-Login

Als Username root eingeben sowie das vorher angelegte Passwort. Wir haben nun Zugang zur phpMyAdmin-Konsole.

phpMyAdmin console
phpMyAdmin-Konsole

Wenn alles geklappt hat: Glückwunsch, der AMP-Stack ist fertig und funktioniert. Wir können jetzt die Online-Site übertragen, oder natürlich eine neue Site aufsetzen.

Tipp: Apache setzt Owner/Group aller Dateien im Website-Verzeichnis (also in unserem Beispiel der blog-Ordner in ~/Sites/) auf _www/staff, d.h. du musst dich jedesmal authentifizieren, wenn du beispielsweise ein CSS extern editieren willst. Wenn das nervt, dann würde ich die Permissions ausweiten mit sudo chmod -R 777 ~/Sites/blog/ (der angegebene Pfad muss dem tatsächlichen Pfad bei dir entsprechen).9

Übertragen einer Online-Site
(WordPress)

Was beim Übertragen einer Site zu beachten ist, hängt vom jeweils verwendeten CMS ab.10 Deshalb kann ich hier keine allgemeingültige Anleitung bringen und beschreibe nur kurz, wie des Backup einer WordPress-Site am einfachsten aufgespielt werden kann.

Für WordPress gibt es ein wunderbares Backup-Plugin, das uns dabei hilft: Duplicator. Das Plugin nimmt uns die ganze Feinarbeit mit wp-config.php und Datenbankimport ab. Das Plugin bitte installieren.

Backup (Clone) erstellen

Bei Duplicator heißen die Backups „Packages“. Sie enthalten das gesamte Verzeichnis und die Datenbank. Im Help-Menü von Duplicator findet sich eine sehr gute Anleitung, die du aber höchstwahrscheinlich nicht brauchst, da das Ganze ziemlich selbserklärend ist. Was wir tun müssen sind zwei Dinge:

  1. Package erstellen: Menüpunkt Duplicator -> Packages -> Create New.
  2. Anschließend Package und Installer-File runterladen.

Tipp: Um das Package klein zu halten, können wir vorher das Site-Verzeichnis etwas verschlanken:

  • In den Plugin-Ordnern nicht benötigte Language-Dateien löschen (via FTP).
  • Caches entleeren: Cache- und Minify-Plugins, v.a. das (sehr gute) Autoptimize-Plugin können im Lauf der Zeit gehörige Datenmengen ansammeln.11 Bitte nicht die Cache-Files via FTP löschen, sondern über die „Entleeren“-Buttons der jeweiligen Plugins!
Duplicator: package completed
Installer und Archive downloaden (klicken)

Backup aufspielen

Jetzt das heruntergeladene Package-Zip und das installer.php-File in den lokalen Site-Ordner kopieren. In unserem Beispiel von oben wäre das der „blog“-Ordner. Darauf achten, das sich außer den beiden Dateien nichts im Ordner befindet! Bei der Gelegenheit können wir eine Kopie des Package-Zip als Backup aufbewahren.12

Im Browser öffnen wir nun das installer.php-File, das sich an dieser Adresse befinden sollte:

http://localhost/~[yourusername]/blog/installer.php

[yourusername] ist natürlich wieder entsprechend zu ersetzen.13

Duplicator ist wieder sehr hilfreich und wir müssen nur den Anweisungen folgen:

  1. Da es die Erstinstallation ist, wählen wir „Create New Database“.14

    Duplicator: create new database

  2. Gültigen Username und Passwort eingeben. Falls wir vorher in phpMyAdmin keinen neuen User angelegt haben ist das also der MySQL-User „root“ mit dem zugehörigen Passwort.
  3. Wir klicken auf „Test Connection“ und erhalten den Fehler „Database Found: Fail“ angezeigt. Das ist normal, da die Database noch nicht angelegt ist. Wichtig ist, dass die Verbindung zum Server geklappt hat („Server Connected“). Falls nicht, haben wir uns wahrscheinlich oben bei Username oder Password vertippt.

    Duplicator: connection test result

  4. Checkmark setzen und „Run Deployment“ klicken.
  5. In Schritt 2 bestätigen wir Pfad und URL.

    Duplicator: confirm path

Duplicator installiert nun Dateien und Database und wir kommen im letzten Schritt zu den „Final Steps“:

Duplicator: final steps

  1. Punkt 2 „Save Permalinks“ klicken. Wir müssen uns jetzt einloggen (Login des Website-Admins, nicht das von MySQL) und kommen auf die Permalinks-Admin-Page. Dort sichern wir die Permalinks („Save Permalinks“-Button“).
  2. Tab schließen und Punkt 4 der Final Steps klicken („File Cleanup“).

Duplicator löscht nun seine Installer-Files und das Zip-Archiv. Wir bekommen den Cleanup-Report angezeigt und …

Duplicator: cleanup report

… sind damit fertig!

Abschließend noch die Plugins auf eventuelle Fehlermeldungen checken und sie ggf. abschalten (z.B. WP Supercache, Ninja Firewall).

Fehler bei der Installation

Wahrscheinlich nicht beim ersten Mal, aber bei späteren Installationen wird Duplicator irgendwann mal die Installation abbrechen mit dem Fehler „Failed in extracting zip file. Please be sure the archive is completely downloaded.“

Meiner Erfahrung nach passiert das dann, wenn der Website-Ordner nicht komplett leer ist, sondern dort noch irgendwelche – unsichtbaren – Dot-Files, wie .htaccess oder andere, rumliegen. Duplicator kann diese manchmal nicht überschreiben und damit das Zip-Archiv nicht komplett entpacken, was zu der etwas irreführenden Fehlermeldung führt.

Dann einfach den Ordner entleeren mit (Beispiel) …

sudo rm -v ~/Sites/blog/.*

Der Pfad muss natürlich dem auf deinem Computer entsprechen!

Footnotes

  1. Aus diesem Grund sollten wir TextEdit nicht benutzen. (Auch Editoren aus dem Mac App Store eignen sich nur bedingt.)
  2. Die Installation ist einfach und auf der Homepage findet sich eine perfekte Anleitung.
  3. Falls MySQL mal aus irgendeinem Grund nicht läuft, lässt es sich jederzeit starten mit mysql.server start bzw. neustarten mit mysql.server restart
  4. Wenn der Neustart mit diesem Befehl nicht klappt, dann die alte Methode mysql.server restart versuchen.
  5. Falls dein Texteditor keine Zeilennummernanzeige hat, dann bitte die Suchfunktion des Texteditors benutzen.
  6. Sofern im Router keine explizite Port-80-Freigabe eingestellt ist, sollte dies eh unmöglich sein.
  7. Identisch mit dem Namen deines Homeverzeichnisses.
  8. Falls nicht, ändern wir das mit sudo chmod 644 /private/etc/apache2/users/[yourusername].conf
  9. Ich weiß, das ist nicht die „saubere“ Art, aber der Inhalt des lokalen Website-Ordners sollte sicherheitstechnisch unbedenklich sein.
  10. Verschiedene config-Dateien, relative Links vs absolute Links, etc.
  11. Vor allem wenn wir viel an den CSS herumgebastelt haben.
  12. Eine Kopie des installer.php ist im Zip-Archiv enthalten.
  13. Wenn es beim Ausführen von installer.php zu einer Fehlermeldung kommt, bitte als Erstes überprüfen, ob wir Schreibrechte für das Verzeichnis haben.
  14. Bei späteren Installationen können wir die bestehende Database überschreiben mit „Connect and Remove All Data“