MacOS X wird standardmäßig mit dem Apache-Server ausgeliefert, so dass ein (eigentlich) voll funktionstüchtiger Webserver bei jedem Mac vorhanden ist.

Ein paar Dinge sind aber zumindest im Client-System standardmäßg deaktiviert oder müssen nachgerüstet werden – hier überlege ich jedes Mal, wenn ich einen Mac neu einrichte, auf's Neue, wie das nochmals genau war...also fasse ich doch einfach mal alles für mich und euch zusammen.

PHP

Wieso auch immer ist PHP standardmäßig deaktiviert. Vielleicht ein Sicherheits"feature"? Viel ist allerdings nicht nötig, um PHP nutzen zu können:

Man öffne mit Hilfe des Terminals die apache-Konfigurationsdatei (ich bevorzuge den Texteditor "pico"):

sudo pico /etc/apache2/httpd.conf

(Achtung: Vor MacOS X 10.5 fand man die Konfiguration unter /etc/httpd/httpd.conf)

Mit Hilfe von ctrl-V drei bis vier Bildschirme runterscrollen, bis man zur Zeile 

#LoadModule php5_module        libexec/apache2/libphp5.so

respektive bei neueren Installationen

#LoadModule php7_module libexec/apache2/libphp7.so

gelangt.

# enfernen (damit war die Zeile auskommentiert), mit ctrl-O speichern und mit ctrl-X Texteditor verlassen.

Nach einem Neustart des Apache-Dienstes (Systemeinstellungen > Freigabe > Webfreigabe einmal kurz deaktivieren und dann wieder aktivieren oder bei neueren Systemen, wo es diese Systemeinstellung leider nicht mehr gibt via Kommandozeile sudo apachectl restart) werden PHP-Skripte nun endlich interpretiert.

.htaccess-Dateien interpretieren lassen

Die Rewrite-Engine ist in der httpd.conf standardmäßig im Gegensatz zu PHP5 zwar aktiv, nutzen kann man sie allerdings nicht wirklich, da die .htaccess-Dateien nicht interpretiert werden.

Auch dies lässt sich in der httpd.conf ändern:

sudo pico /etc/apache2/httpd.conf

Mit ctrl-V zum folgenden Abschnitt scrollen:

Hierunter sollte in einer Zeile AllowOverride None stehen. Aus None sollte All werden.

Apache unter Systemeinstellungen > Freigabe > Webfreigabe neu starten.

MySQL

Ich setze (noch) auf den gratis Community-Server von mysql. Man wähle hier den passenden Download aus (als DMG-Archiv). Nach dem Klick auf "Download" wird man zur Registrierung bei mySQL.com aufgefordert. Es gibt aber einen kleinen aber feinen "No thanks, just start my download!"-Link unten auf der Seite, den man fast übersehen könnte ;-)

Übrigens steht für MacOS X 10.6 seltsamerweise nur noch eine Version 5.1 zum Download bereit.
Schaut man allerdings mal im Archiv nach, findet man dort auch noch neuere mySQL-Server-Versionen für MacOS X 10.6

Die heruntergeladene Image-Datei bietet

  • Den mySQL-Server an sich
  • Das mySQL-Startup-Item (welches dafür sorgt, dass der Server automatisch nach Neustart gestartet wird)
  • die mySQL-PrefPane (um den Dienst über die Systemeinstellungen zu starten und zu stoppen)

Obwohl nur das Erste essentiell ist, empfehle ich, alle drei zu installieren.

Gut. Nun ist mySQL installiert, aber ich will mit Perl oder PHP auf die Datenbank zugreifen...da fehlt noch der nötige mySQL-Benutzer, denn als root will ich von dort aus nicht auf die Datenbank zugreifen.

Wieder ab in's Terminal und von von dort aus in mySQL einloggen:

/usr/local/mysql/bin/mysql --user=root mysql

(Der Installationsort /usr/local hat sich bei mir als Standardinstallationsort herauskristallisiert)

Darauf meldet sich der mySQL-Server, den man mit dem Befehl exit wieder verlassen kann. Alle anderen SQL-Befehle sollte man mit einem Semikolon (;) abschließen.

Ich richte normalerweise drei Benutzer ein:

  • Einen für mich selbst
  • Einen für Apache, also für die PHP-Skripte
  • Einen PMA-User für phpMyAdmin

GRANT ALL PRIVILEGES ON *.* TO 'apfelz'@'localhost'  IDENTIFIED BY 'mein_passwort' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'apfelz'@'%'  IDENTIFIED BY 'mein_passwort' WITH GRANT OPTION;
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON *.* TO 'apache'@'localhost'  IDENTIFIED BY 'apache_passwort' WITH GRANT OPTION;
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON pma.* TO 'pma'@'localhost'  IDENTIFIED BY 'pma_passwort' WITH GRANT OPTION;
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON *.* TO 'perl'@'localhost'  IDENTIFIED BY 'perl_passwort' WITH GRANT OPTION;

Bei mySQL 8 (oder auch vorher schon?) kann man einen neuen User nicht mehr alleine mit dem GRANT-Befehl anlegen:

CREATE USER 'apfelz'@'localhost'  IDENTIFIED BY 'mein_passwort';
GRANT ALL PRIVILEGES ON *.* TO 'apfelz'@'localhost' WITH GRANT OPTION;
CREATE USER 'apfelz'@'%' IDENTIFIED BY 'mein_passwort';
GRANT ALL PRIVILEGES ON *.* TO 'apfelz'@'%' WITH GRANT OPTION;
CREATE USER 'apache'@'localhost' IDENTIFIED BY 'apache_passwort';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON *.* TO 'apache'@'localhost' WITH GRANT OPTION;
CREATE USER 'pma'@'localhost' IDENTIFIED BY 'pma_passwort';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON pma.* TO 'pma'@'localhost'  IDENTIFIED BY 'pma_passwort' WITH GRANT OPTION;
CREATE USER 'perl'@'localhost' IDENTIFIED BY 'perl_passwort';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON *.* TO 'perl'@'localhost'  IDENTIFIED BY 'sql_passwort' WITH GRANT OPTION;

Hiermit hätte ich einmal den Benutzer apfelz für mich selbst, der alles machen darf,  sowohl vom lokalen Server selbst aus zugreifen darf, wie auch von jedem anderen Rechner im Netzwerk (deshalb zwei Grant-Befehle. Einmal für localhost und einmal für fremde Rechner: %)

Dann wäre der Benutzer apache, der von PHP aus auf die Datenbank zugreift – natürlich nur von localhost, dem Server selbst. Dasselbe für den User perl

Und zu guter Letzt noch der pma-User für phpMyAdmin (zu dem komme ich noch), der nur auf die pma-Datenbank zugreifen soll und wie 'apache' nur vom localhost aus agiert.

Kleine Randnotiz: Ich hatte bei einer Neuinstallation Stunden damit verbracht, phpMyAdmin zum Laufen zu bekommen; konnte mich allerdings nie erfolgreich bei phpMyAdmin anmelden, weil "die Anmeldung des controlusers scheiterte". Letztendlich fand' ich heraus, dass bei er Initalisierung von mySQL die "Legacy Password Encryption" gewählt sein muss, da phpMyAdmin (oder PHP oder Apache?) zumindest zum aktuellen Zeitpunkt mit dem stärkeren Passwortschutz nicht klar kommt.
 

MySQL: Eine andere Datenbank übernehmen

Oft will man als Ausgangsbasis eine Datenbank von einem anderen Server übernehmen. Keine große Sache, aber wenn man es nicht oft verwendet, vergisst man die genaue Syntax der Befehle gerne mal, deshalb hier auf einen Blick:

Vom Quell-Rechner Datenbank exportieren:

/usr/local/mysql/bin/mysqldump --opt datenbankname > backup-datei.sql
/usr/local/mysql/bin/mysqldump --opt datenbankname -u apfelz -p > backup-datei.sql # Sollte man einen Benutzernamen und Passwort mitgeben wollen
/usr/local/mysql/bin/mysqldump --all-databases > all_databases.sql # wenn's gleich alle Datenbanken sein sollen

Auf dem Zielrechner Datenbank anlegen (!) und importieren:

/usr/local/mysql/bin/mysql --user=root mysql

CREATE DATABASE IF NOT EXISTS datenbankname;
exit

/usr/local/mysql/bin/mysql datenbankname < backup-datei.sql
/usr/local/mysql/bin/mysql datenbankname -u apfelz -p < backup-datei.sql # bzw. die Variante mit Benutzer- und Passwortübergabe

Hat man die Rechte, auf einen fremden Rechner im Netzwerk zuzugreifen, geht der Dump natürlich auch in einem Rutsch:

/usr/local/mysql/bin/mysqldump --opt db_name | /usr/local/mysql/bin/mysql --host=remote_host -C db_name

MySQL: phpMyAdmin

Meine Lieblingsart, per GUI auf mySQL zuzugreifen. phpMyAdmin ist eine Webapplikation, die via Browser auf jedem Rechner im lokalen Netzwerk (oder die richtige Freigabe vorausgesetzt auch auf jedem beliebigen Rechner außerhalb des Netzwerkes) nutzen lässt, ohne irgendwelche Client-Programme installieren zu müssen.

Herunterladen, entpacken und in's Verzeichnis /Library/WebServer/Documents (oder ein passendes Unterverzeichnis) legen.

Fehlt nur noch:
Konfigurations-Datei config.inc.php anpassen (falls nicht existent, die config.sample.inc.php duplizieren und umbenennen).

Der Inhalt ist bei mir zum Beispiel so oder so ähnlich:

$i = 1;

$cfg['Servers'][$i]['verbose']    = 'macServer';
$cfg['Servers'][$i]['host']       = 'localhost';
$cfg['Servers'][$i]['port']       = '';
$cfg['Servers'][$i]['socket']     = '/tmp/mysql.sock';
$cfg['Servers'][$i]['auth_type']  = 'cookie';
$cfg['Servers'][$i]['user']       = '';
$cfg['Servers'][$i]['password']   = '';
$cfg['Servers'][$i]['AllowRoot']  = false;
$cfg['Servers'][$i]['hide_db']    = 'information_schema|mysql|performance_schema|phpmyadmin|sys';
$cfg['Servers'][$i]['pmadb']           = 'phpmyadmin';
$cfg['Servers'][$i]['controluser']     = 'pma';
$cfg['Servers'][$i]['controlpass']     = 'pma_passwort';
$cfg['Servers'][$i]['relation']        = 'pma_relation';
$cfg['Servers'][$i]['table_info']      = 'pma_table_info';
$cfg['Servers'][$i]['table_coords']    = 'pma_table_coords';
$cfg['Servers'][$i]['pdf_pages']       = 'pma_pdf_pages';
$cfg['Servers'][$i]['column_info']     = 'pma_column_info';
$cfg['Servers'][$i]['bookmarktable']   = 'pma_bookmark';
$cfg['Servers'][$i]['history']         = 'pma_history';
$cfg['Servers'][$i]['designer_coords'] = 'pma_designer_coords';
$cfg['Servers'][$i]['tracking']        = 'pma_tracking';
$cfg['Servers'][$i]['recent']          = 'pma_recent';
$cfg['Servers'][$i]['userconfig']      = 'pma_userconfig';

$cfg['blowfish_secret'] = 'diesistmeinganzsicheresblowfishgeheimnis';
$cfg['DefaultLang'] = 'de';
$cfg['ServerDefault'] = 1;
$cfg['UploadDir'] = '';
$cfg['SaveDir'] = '';

Wenn man etwas mehr Zeit mitbringt, kann man auch einen neuen, leeren Ordner config im phpMyAdmin-Rootsverzeichnis erstellen und den Konfigurations-Assistenten über die Adresse /setup starten.

Webmin: Serverdienste von einem Web-Interface aus verwalten

Ich nutze Webmin gerne, um einige Serverdienste zu verwalten, bei denen ich entweder in einer Konfigurationsdatei rumpfuschen müsste, oder wo ein Klick mehrere Befehle ablöst. 

Aufgaben der Wahl sind: Mailboxen für Postfix anlegen, CPAN-Module für Perl installieren, Server von fern via Browser  neustarten.

Zur Installation gibt es eigentlich nicht viel zu sagen, da sie von selbst abläuft. Nur kurz:

Herunterladen, entpacken, in ein passendes Verzeichnis verschieben (z.B. /Library/WebServer/; Muss nicht im Documents-Verzeichnis liegen, da WebMin unter einem alternativen Port läuft) und Setup starten (setup.sh im Webmin-Verzeichnis).

Obwohl ein Setup ausgeführt wird, welches Webmin an die eigenen Bedürfnisse anpasst, installiert sich Webmin nirgendwo hin. Webmin ist in dem Verzeichnis, welches man zuvor entpackt hatte und kann nach dem Ausführen des Setups nicht mehr verschoben werden, da es sonst nicht mehr funktioniert!
Deshalb sollte man es wie erwähnt vorher an die richtige Stelle schieben und nicht erst im Download-Ordner belassen, setup.sh ausführen und dann eventuell verschieben oder löschen ("Ich hab's ja jetzt installiert").

Auch ist über Webmin interessant zu wissen: Es läuft auf einem speziellen Port (standardmäßig 10000). Schiebt man es in seinen Webserver-Ordner /Library/WebServer/Documents, wird es nachher trotzdem nicht via http://127.0.0.1/webmin aufrufbar sein, sondern via http://127.0.0.1:10000

Deshalb verschiebe ich webmin auch nicht in /Library/WebServer/Documents, sondern in /Library/WebServer/, eine Ebene höher. So ist für mich alles an seinem Platz :-)

 

Jetzt fehlt noch irgendwie der Zugriff auf die mySQL-Datenbank von Perl aus...

Da müssen noch zwei CPAN-Module installiert werden. Sowas mache ich eigentlich gerne vom Webmin aus, allerdings scheitert man in diesem Fall bei Webmin. Also...dann halt via Kommandozeile.

DBI- und DBD::mysql-Module via CPAN herunterladen, DBI-Modul installieren:

perl -MCPAN -e 'shell'
cpan> get DBI
cpan> get Devel::CheckLib
cpan> get DBD::mysql
cpan> exit

sudo perl -MCPAN -e 'install DBI'
sudo perl -MCPAN -e 'install Devel::CheckLib'

Und nun wird's kniffelig: DBD::mysql lässt sich nur installieren, wenn man ihm mySQL-Accountdaten mitteilt, mit Hilfe derer er seine Funktionalität testen kann. Außerdem waren bei mir meist noch zwei kleine Kniffe notwendig, um die Installation unter MacOS X durchzuführen.

Die beiden folgenden Kniffe empfehle ich aber nur durchzuführen, sollte die Installation ansonsten fehlschlagen (Fehlermeldung beim Schritt "make test").

Kniff eins: Pfad zu mysql in Environment-Variable PATH setzen, damit DBD::mysql mysql findet:

PATH=$PATH:/usr/local/mysql/bin

Kniff zwo: DBD::mysql erwartet eine Bibliothek, die es nicht findet. Hierfür müssen wir noch eine Verknüpfung anlegen, die von dort, wo DBD::mysql sie erwartet dorthin führt, wo sie tatsächlich liegt:

cd /usr/local/lib
sudo ln -s /usr/local/mysql/lib/*.dylib .

Dann kann's mit der eigentlichen Installation losgehen:

cd ~/.cpan/build/DBD-mysql-4.013-cB623q/
(<-- Das durch "get DBD::mysql" heruntergeladene Verzeichnis. Name wird je nach aktueller Version abweichen, doch wird es sicherlich unter ~/.cpan/build/ zu finden sein)

perl Makefile.PL --testuser='apfelz' --testpassword='apfelz_passwort'
 (<-- Hier Benutzernamen und Passwort eingeben, welche man beim Anlegen des mySQL-Benutzers spezifiziert hatte)

make
make test

Sollten Fehler auftreten, Kniff 1 ausprobieren, dann nochmals perl Makefile.PL, make, make test.

Sollten immer noch Fehler auftreten, Kniff 2 und nochmals perl Makefile.PL, make, make test...dann sollte es aber hoffentlich klappen!

Zu guter Letzt

sudo make install

Jetzt sollte alles funktionieren! ;-)