Apache Webserver

Die Installation eines Apache Webservers auf einem macOS-System ist eine gute Möglichkeit, eine lokale Entwicklungsumgebung für Webprojekte einzurichten. Da macOS bereits mit einer vorinstallierten Version von Apache ausgeliefert wird, ist der Einrichtungsprozess unkompliziert und schnell. In dieser Anleitung habe ich einmal die Installation und Konfiguration eines vollständigen Webservers mit Apache, CGI, PHP, MariaDB, phpMyAdmin, vier virtuellen Domains und SSL mit Let's Encrypt beschrieben.

1. Systemvorbereitung

  • Aktualisieren Sie macOS auf die neueste Version.
  • Öffnen Sie das Terminal.

2. Apache Webserver aktivieren

macOS kommt mit einer vorinstallierten Version von Apache. Um es zu aktivieren:

   sudo apachectl start

Überprüfen Sie, ob Apache läuft, indem Sie http://localhost in Ihrem Browser öffnen.

3. PHP installieren und konfigurieren

Überprüfen Sie, ob PHP installiert ist:

   php -v

Wenn PHP nicht installiert oder veraltet ist, installieren Sie es über Homebrew:

  • Installieren Sie Homebrew:
    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  • Installieren Sie PHP:
    brew install php
  • Verlinken Sie PHP mit Apache:
    sudo nano /etc/apache2/httpd.conf

    Suchen Sie nach #LoadModule php_module libexec/apache2/libphp.so und entfernen Sie das #-Zeichen.

  • Starten Sie Apache neu:
    sudo apachectl restart

4. MariaDB installieren

Installieren Sie MariaDB über Homebrew:

   brew install mariadb
  • Starten Sie den MariaDB-Dienst:
    brew services start mariadb
  • Richten Sie das Root-Passwort ein:
    mysql_secure_installation

5. phpMyAdmin installieren

  • Installieren Sie phpMyAdmin über Homebrew:
    brew install phpmyadmin
  • Konfigurieren Sie Apache, um phpMyAdmin zu nutzen:
    sudo nano /etc/apache2/extra/httpd-vhosts.conf

    Fügen Sie einen Alias hinzu:

    Alias /phpmyadmin "/usr/local/share/phpmyadmin"
    <Directory "/usr/local/share/phpmyadmin">
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
  • Starten Sie Apache neu:
    sudo apachectl restart

6. CGI-Unterstützung aktivieren

Aktivieren Sie CGI in der Apache-Konfigurationsdatei:

  • Bearbeiten Sie die Apache-Konfigurationsdatei:
    sudo nano /etc/apache2/httpd.conf
  • Suchen Sie nach #LoadModule cgi_module libexec/apache2/mod_cgi.so und entfernen Sie das #-Zeichen.
  • Fügen Sie im Abschnitt Directory die ExecCGI-Option hinzu:
    <Directory "/Library/WebServer/CGI-Executables">
        Options +ExecCGI
        AddHandler cgi-script .cgi .pl .py
    </Directory>
  • Starten Sie Apache neu:
    sudo apachectl restart

7. Virtuelle Hosts einrichten

Richten Sie vier virtuelle Hosts für Ihre Domains ein:

  • Erstellen Sie die Verzeichnisse:
    sudo mkdir -p /usr/local/var/www/domain1 /usr/local/var/www/domain2 /usr/local/var/www/domain3 /usr/local/var/www/domain4
  • Bearbeiten Sie die Konfigurationsdatei:
    sudo nano /etc/apache2/extra/httpd-vhosts.conf
  • Fügen Sie die Konfigurationen für die vier Domains hinzu:
    <VirtualHost *:80>
        ServerAdmin webmaster@domain1.com
        DocumentRoot "/usr/local/var/www/domain1"
        ServerName domain1.com
        ServerAlias www.domain1.com
        ErrorLog "/private/var/log/apache2/domain1.com-error_log"
        CustomLog "/private/var/log/apache2/domain1.com-access_log" common
    </VirtualHost>
    <VirtualHost *:80>
        ServerAdmin webmaster@domain2.com
        DocumentRoot "/usr/local/var/www/domain2"
        ServerName domain2.com
        ServerAlias www.domain2.com
        ErrorLog "/private/var/log/apache2/domain2.com-error_log"
        CustomLog "/private/var/log/apache2/domain2.com-access_log" common
    </VirtualHost>
    <VirtualHost *:80>
        ServerAdmin webmaster@domain3.com
        DocumentRoot "/usr/local/var/www/domain3"
        ServerName domain3.com
        ServerAlias www.domain3.com
        ErrorLog "/private/var/log/apache2/domain3.com-error_log"
        CustomLog "/private/var/log/apache2/domain3.com-access_log" common
    </VirtualHost>
    <VirtualHost *:80>
        ServerAdmin webmaster@domain4.com
        DocumentRoot "/usr/local/var/www/domain4"
        ServerName domain4.com
        ServerAlias www.domain4.com
        ErrorLog "/private/var/log/apache2/domain4.com-error_log"
        CustomLog "/private/var/log/apache2/domain4.com-access_log" common
    </VirtualHost>
  • Aktivieren Sie die Datei httpd-vhosts.conf:
    sudo nano /etc/apache2/httpd.conf

    Entfernen Sie das # vor der Zeile:

    #Include /etc/apache2/extra/httpd-vhosts.conf
  • Fügen Sie die Domains zur /etc/hosts Datei hinzu:
    sudo nano /etc/hosts

    Fügen Sie die folgenden Zeilen hinzu:

    127.0.0.1 domain1.com
    127.0.0.1 domain2.com
    127.0.0.1 domain3.com
    127.0.0.1 domain4.com
  • Starten Sie Apache neu:
    sudo apachectl restart

8. SSL mit Let's Encrypt einrichten

  • Installieren Sie Certbot für Let's Encrypt:
    brew install certbot
  • Generieren Sie SSL-Zertifikate:
    sudo certbot certonly --apache -d domain1.com -d www.domain1.com -d domain2.com -d www.domain2.com -d domain3.com -d www.domain3.com -d domain4.com -d www.domain4.com
  • Konfigurieren Sie die Apache-Konfigurationsdateien für SSL:
    <VirtualHost *:443>
        ServerAdmin webmaster@domain1.com
        DocumentRoot "/usr/local/var/www/domain1"
        ServerName domain1.com
        ServerAlias www.domain1.com
        SSLEngine on
        SSLCertificateFile /etc/letsencrypt/live/domain1.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/domain1.com/privkey.pem
        Include /etc/letsencrypt/options-ssl-apache.conf
    </VirtualHost>
    <VirtualHost *:443>
        ServerAdmin webmaster@domain2.com
        DocumentRoot "/usr/local/var/www/domain2"
        ServerName domain2.com
        ServerAlias www.domain2.com
        SSLEngine on
        SSLCertificateFile /etc/letsencrypt/live/domain2.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/domain2.com/privkey.pem
        Include /etc/letsencrypt/options-ssl-apache.conf
    </VirtualHost>
    <VirtualHost *:443>
        ServerAdmin webmaster@domain3.com
        DocumentRoot "/usr/local/var/www/domain3"
        ServerName domain3.com
        ServerAlias www.domain3.com
        SSLEngine on
        SSLCertificateFile /etc/letsencrypt/live/domain3.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/domain3.com/privkey.pem
        Include /etc/letsencrypt/options-ssl-apache.conf
    </VirtualHost>
    <VirtualHost *:443>
        ServerAdmin webmaster@domain4.com
        DocumentRoot "/usr/local/var/www/domain4"
        ServerName domain4.com
        ServerAlias www.domain4.com
        SSLEngine on
        SSLCertificateFile /etc/letsencrypt/live/domain4.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/domain4.com/privkey.pem
        Include /etc/letsencrypt/options-ssl-apache.conf
    </VirtualHost>
  • Starten Sie Apache neu:
    sudo apachectl restart

9. Automatische Erneuerung der SSL-Zertifikate

Um die automatische Erneuerung der Let's Encrypt SSL-Zertifikate auf unserem macOS-Rechner einzurichten, wird ein Cronjob verwendet, der regelmäßig Certbot ausführt. Hier ist eine detaillierte Anleitung:

9.1. Certbot installieren

Wenn Certbot noch nicht installiert ist, können Sie es über Homebrew installieren:

   brew install certbot

9.2. Testen der manuellen Erneuerung

Bevor wir die automatische Erneuerung einrichten, sollten wir sicherstellen, dass die manuelle Erneuerung funktioniert:

   sudo certbot renew --dry-run

Wenn dieser Befehl erfolgreich ist, können Sie mit der automatischen Erneuerung fortfahren.

9.3. Cronjob für die automatische Erneuerung einrichten

Cron ist ein Dienst, der auf UNIX-basierten Systemen verwendet wird, um periodisch Skripte auszuführen. Um einen Cronjob für die automatische Erneuerung der Zertifikate einzurichten, gehen wir wie folgt vor:

  • Öffnen Sie den Crontab-Editor im Terminal:
    crontab -e
  • Fügen Sie den folgenden Eintrag hinzu, um Certbot zweimal täglich auszuführen:
    0 */12 * * * /usr/local/bin/certbot renew --quiet --no-self-upgrade >> /var/log/letsencrypt/letsencrypt-renew.log 2>&1

    Erklärung der Cronjob-Syntax:

    • 0 */12 * * *: Führt den Befehl alle 12 Stunden aus.
    • /usr/local/bin/certbot renew: Der Befehl, der die Erneuerung der Zertifikate ausführt.
    • --quiet: Unterdrückt die normale Ausgabe, so dass nur Fehler protokolliert werden.
    • --no-self-upgrade: Verhindert, dass Certbot sich selbst aktualisiert, um unerwartete Änderungen zu vermeiden.
    • >> /var/log/letsencrypt/letsencrypt-renew.log 2>&1: Protokolliert die Ausgabe in eine Logdatei, um bei Bedarf spätere Überprüfungen zu ermöglichen.

9.4. Apache automatisch neu starten

Certbot erneuert die Zertifikate, aber Apache muss neu gestartet werden, damit die Änderungen wirksam werden. Sie können dies im selben Cronjob hinzufügen:

   0 */12 * * * /usr/local/bin/certbot renew --quiet --no-self-upgrade && sudo apachectl graceful >> /var/log/letsencrypt/letsencrypt-renew.log 2>&1

Erklärung:

  • && sudo apachectl graceful: Startet Apache nach erfolgreicher Erneuerung der Zertifikate neu, ohne bestehende Verbindungen zu unterbrechen.

9.5. Logdateien prüfen

Die Logdateien befinden sich unter /var/log/letsencrypt/letsencrypt-renew.log. Es ist eine gute Idee, diese regelmäßig zu überprüfen, um sicherzustellen, dass die Erneuerung erfolgreich verläuft.

9.6. Berechtigungen sicherstellen

Da der Cronjob mit Benutzerrechten ausgeführt wird, müssen Sie sicherstellen, dass Certbot und Apache vom selben Benutzer oder einer Gruppe mit den notwendigen Berechtigungen ausgeführt werden.

9.7. Testen des Setups

Um sicherzustellen, dass alles korrekt funktioniert, können Sie einen manuellen Testlauf des Cronjobs simulieren:

   sudo /usr/local/bin/certbot renew --quiet --no-self-upgrade && sudo apachectl graceful

Wenn nun der Befehl erfolgreich ist, sollte alles korrekt eingerichtet sein.

Mit diesen Schritten wird die automatische Erneuerung der Let's Encrypt SSL-Zertifikate auf unserem macOS-Rechner sichergestellt. Die Zertifikate werden alle 12 Stunden überprüft und bei Bedarf erneuert, wobei Apache automatisch neu gestartet wird, um die neuen Zertifikate zu verwenden.


Nun können wir unseren MacOS Webserver für die lokale Entwicklung nutzen. Diese Anleitung sollte ideal sein für Entwickler, die eine flexible und leistungsfähige Umgebung auf ihrem macOS-Rechner einrichten möchten.