05 — Apache

Zuletzt geändert: 28. Oktober 2020
Geschätzte Lesezeit: 3 min

integrierten Apache entfernen

Den in OS‑X inte­gri­erten Apache herun­ter­fahren, alle automa­tisch laden­den Skripte entfernen. 

sudo apachectl stop sudo launchctl unload -w /System/Library/LaunchDaemons/ org.apache.httpd.plist 2>/dev/null

Apache installieren

brew install httpd

Doc­u­men­t­Root ist stan­dard­mäs­sig /usr/local/var/www.

/usr/local/etc/httpd/httpd.conf /usr/local/etc/httpd/extra/httpd-ssl.conf

apr ist keg-only, das bedeutet dass es nicht mit /usr/local durch einen Sym­link verknüpft ist, da Apples CLT-Paket apr enthält. Wenn apr zuerst in PATH ste­hen soll: 

echo 'export PATH="/usr/local/opt/apr/bin:$PATH"' >> ~/.bash_profile

Die Server Logs

codium /usr/local/var/log/httpd/error_log codium /usr/local/var/log/httpd/access_log

Error Log beim Starten ausgeben

tail -f /usr/local/var/log/httpd/error_log

Was ist tail?

Server Befehle

Apache sofort starten, und Ser­vice ein­richt­en um ihn automa­tisch nach dem Login zu starten: 

brew services start httpd

Apache manuell starten 

apachectl start

Serv­er restart (-k immediatly) 

sudo apachectl -k restart

Apache stoppen 

sudo apachectl stop

Konfiguration

Port

Prüfen ob Port 80 eingestellt ist? Die Kon­fig­u­ra­tios­datei kann bequem über das Ter­mi­nal in VSCodi­um aufgerufen wer­den. Suche nach Listen und erset­zte ggfs. Port 8080 durch 80. 

codium /usr/local/etc/httpd/httpd.conf

Apache User und Gruppen

Find­en User www-data und erset­ze durch User mein_username

Suche nach Group www-data und erset­ze es durch Group staff

Der Apache läuft dann unter deinem User, was Rechte Prob­leme ver­hin­dert. AllowOver­ride ALL erlaubt das alles Anweisun­gen in .htac­cess aus­ge­führt werden. 

Listen 80 DocumentRoot /Volumes/mein_volume/develop/Apache2/Sites AllowOverride All LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so User mein_username Group staff ServerName localhost

Module

LoadModule deflate_module lib/httpd/modules/mod_deflate.so

Virtuelle Hosts einrichten

codium /usr/local/etc/httpd/httpd.conf

LoadModule vhost_alias_module lib/httpd/modules/mod_vhost_alias.so Include /usr/local/etc/httpd/extra/httpd-vhosts.conf

Edit codium /usr/local/etc/httpd/extra/httpd-vhosts.conf

DocumentRoot "/Volumes/mein_volume/develop/Apache2/Sites" ServerName localhost DocumentRoot "/Volumes/mein_volume/develop/Apache2/mein-projekt" ServerName mein-projekt.local.web

Der Serv­er sollte dann unter der Adresse http://mein-projekt.local.web erre­ich­bar sein. 

Setup SSL

codium /usr/local/etc/httpd/httpd.conf

Ent­ferne # von 

LoadModule socache_shmcb_module lib/httpd/modules/mod_socache_shmcb.so LoadModule ssl_module lib/httpd/modules/mod_ssl.so Include /usr/local/etc/httpd/extra/httpd-ssl.conf

bear­beite die httpd-ssl.conf

codium /usr/local/etc/httpd/extra/httpd-ssl.conf

ändereListen 8443 zu Listen 443

finde <VirtualHost _default_:8443>

und ersetze… 

<VirtualHost _default_:443>

kom­men­tiere das aus.….. 

# General setup for the virtual host # DocumentRoot "/usr/local/var/www" # ServerName www.example.com:443

um geeignete SSL-basierte virtuelle Hosts hinzuzufügen 

codium /usr/local/etc/httpd/extra/httpd-vhosts.conf
DocumentRoot "/Users/mein_username/Sites" ServerName localhost SSLEngine on SSLCertificateFile "/usr/local/etc/httpd/server.crt" SSLCertificateKeyFile "/usr/local/etc/httpd/server.key"

Zertifikat

Damit SSL funk­tion­iert, benötige ich ein Zertifikat. 

tail -f /usr/local/var/log/httpd/error_log , um während des Serverneustarts um zu sehen ob Fehler auftreten. 

Ich muss jet­zt das selb­st­sig­niertes Zer­ti­fikat erstellen, auf das ich bere­its in der Vir­tu­al­Host-Def­i­n­i­tion ver­wiesen habe. 

Die fol­gen­den Befehle fra­gen nach Infor­ma­tio­nen zum Zer­ti­fikat. Hier sollte ich sin­nvolle Werte ein­tra­gen. Der ’ Com­mon Name’ sollte mit dem ServerName in der httpd-vhosts.conf Datei übereinstimmen. 

TODO: Das kann ich doch jet­zt mit mein­er eige­nen CA — siehe unten — ele­gan­ter lösen?

cd /usr/local/etc/httpd openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout server.key -out server.crt
  • Gener­iert einen neuen 2048 Bit lan­gen RSA-Schlüs­sel und legt ihn in der Datei server.key ab.
  • Es wird ein selb­st sig­niertes Zer­ti­fikat erstellt und in der Datei serv gespeichert.
  • Das Zer­ti­fikat ist 365 Tage — also 1 Jahr — gültig. 
  • req
  • -x509
  • -nodes — den pri­vat­en Schlüs­sel in ein­er PKCS#12-Datei nicht verschlüsselt.
  • -days 365
  • -newkey
  • rsa:2048
  • -key­out server.key
  • -out serv

Fol­gende Ein­träge wer­den abgefragt: 

Country Name (2 letter code) []:DE State or Province Name (full name) []:NRW Locality Name (eg, city) []: Bergisch Gladbach Organization Name (eg, company) []:Carsten Nichte Organizational Unit Name (eg, section) []: Common Name (eg, fully qualified host name) []:localhost Email Address []: meine-mail@adresse.de

Syn­tax-Check der Apache Kon­fig­u­ra­tion — sollte keine Fehler bringen: 

sudo apachectl configtest

Serv­er neu durchstarten: 

sudo apachectl -k restart

Im Brows­er https://localhost aufrufen und sehen was passiert. 

Mod expires Fehlermeldung

Ungültiger Befehl ‘Expire­sAc­tive’, möglicher­weise falsch geschrieben oder durch ein Mod­ul definiert, das nicht in der Serverkon­fig­u­ra­tion enthal­ten ist, siehe: http://xyz

Wenn diese Mel­dung auf dein­er Apache-Instal­la­tion in Verbindung mit ein­er 500 Inter­nal Serv­er Error-Mel­dung auf­taucht, bedeutet das, dass du den Befehl ExpiresActive in ein­er .htaccess-Datei oder in der Datei apache2.conf (oder httpd.conf) ver­wen­det hast, ohne das Expires-Mod­ul mit einzubeziehen.

LoadModule expires_module lib/httpd/modules/mod_expires.so

DocumentRoot ändern

Suche in den drei fol­gen­den Dateien nach DocumentRoot und in einem Fall nach Directory und passe den Pfad an. 

codium /usr/local/etc/httpd/httpd.conf codium /usr/local/etc/httpd/extra/httpd-ssl.conf codium /usr/local/etc/httpd/extra/httpd-vhosts.conf

Danach den Serv­er neu durchstarten 

sudo apachectl -k restart

Das sollte für eine Domain und ein Pro­jekt pri­ma funktionieren. 


Mehrere Domains einrichten

Ich will aber jet­zt mehrere Pro­jek­te ver­wal­ten, und jedes soll seine eigene Domain bekommen. 

Sites/ | projekt-1/ | | public/ | | logs/ | | httpd-vhost.conf | | projekt-2/ | | public/ | | logs/ | | httpd-vhost.conf

Statt alles Kon­fig­u­ra­tio­nen in die zen­trale Kon­fig­u­ra­tions­datei ein zu tra­gen, bekommt jedes Pro­jekt seine eigene httpd-vhost.conf Datei. Wir müssen dem Serv­er dann nur sagen wo diese liegen. Das vere­in­fach die Ver­wal­tung bei ein­er großen Anzahl Projekte: 

codium /usr/local/etc/httpd/extra/httpd-vhosts.conf

IncludeOptional /Users/mein_username/Sites/*/httpd-vhost.conf

Im Pro­jekt 1 kommt in die httpd-vhost.conf :

<VirtualHost *:80> DocumentRoot "/Users/mein_username/Sites/projekt-1/public" ServerName projekt-1.local.web ErrorLog "/Users/mein_username/Sites/projekt-1/logs/error_log" CustomLog "/Users/mein_username/Sites/projekt-1/logs/access_log" common </VirtualHost>

Im Pro­jekt 2 kommt in die httpd-vhost.conf entsprechend: 

<VirtualHost *:80> DocumentRoot "/Users/mein_username/Sites/projekt-2/public" ServerName projekt-2.local.web ErrorLog "/Users/mein_username/Sites/projekt-2/logs/error_log" CustomLog "/Users/mein_username/Sites/projekt-2/logs/access_log" common </VirtualHost>

Nicht vergessen die Host Datei anzupassen: 

sudo codium /etc/hosts

127.0.0.1 projekt-1.local.web 127.0.0.1 projekt-2.local.web

Ich möchte natür­lich für alle Virtuellen Hosts SSL ver­wen­den. Die näch­ste Frage lautet also: Wie kann ich mehrere SSL-Zer­ti­fikate in Apache mit ein­er IP-Adresse verwenden? 

codium /usr/local/etc/httpd/extra/httpd-ssl.conf

<VirtualHost *:443> DocumentRoot "/Users/mein_username/Sites/projekt-1/public" ServerName projekt-1.local.web SSLEngine on SSLCertificateFile "/usr/local/etc/httpd/server.crt" SSLCertificateKeyFile "/usr/local/etc/httpd/server.key" SSLCertificateChainFile "/usr/local/etc/httpd/DigiCertCA.crt" </VirtualHost> <VirtualHost *:443> DocumentRoot "/Users/mein_username/Sites/projekt-2/public" ServerName projekt-2.local.web SSLEngine on SSLCertificateFile "/usr/local/etc/httpd/server.crt" SSLCertificateKeyFile "/usr/local/etc/httpd/server.key" SSLCertificateChainFile "/usr/local/etc/httpd/DigiCertCA.crt" </VirtualHost>
  • SSLCertificateFile
  • SSLCertificateKeyFile
  • SSLCertificateChainFile
  • zeigen auf die Spe­icherorte der Zertifikatsdateien

Um an die Zer­ti­fikate zu kom­men richte ich mir eine eigene CA mit OpenSSL wie fol­gt ein: 

War der Artikel hilfreich?
Nich so 0 0 von 0 fanden den Artikel hilfreich.
Ansichten: 45
Vorheriger Artikel: 04 — openLDAP
Nächster Artikel: 05 — Lokale Zertifizierungsstelle für SSL-Zertifikate mit OpenSSL