Wie man Caddy Web Server mit PHP auf Fedora 34 / CentOS 8 installiert und konfiguriert
Caddy ist ein Open-Source Webserver, der in der Sprache Go geschrieben wurde. Er bietet HTTP/3 Unterstützung, TLS v1.3, automatische SSL Konfiguration mit Let’s Encrypt, Reverse Proxy und unterstützt mehrere Plugins, um seine Funktionalität zu erweitern. Es hat den Vorteil, dass die gesamte Konfiguration aus einer einzigen Datei bedient wird, egal wie viele Seiten du hosten musst.
Dieses Tutorial wird die Installation und Konfiguration von Caddy und PHP auf Fedora 34 und CentOS 8 basierten Servern behandeln. Wir werden behandeln, wie man einzelne und mehrere Seiten hostet und wie man Reverse Proxy zusammen mit einigen anderen Sicherheitsfeatures verwendet.
Voraussetzungen
- Fedora 34 oder CentOS 8 basierte Server
- Ein non-root Benutzer mit sudo Rechten
- Ein Domainname, der auf die IP-Adresse des Servers zeigt
- SELinux ist deaktiviert.
$ sudo setenforce 0
- Stelle sicher, dass alles auf dem neuesten Stand ist.
$ sudo dnf update
Schritt 1 – Firewall konfigurieren
Der erste Schritt ist die Konfiguration der Firewall, um HTTP und HTTPS Ports zu öffnen. Fedora und CentOS kommen mit der vorinstallierten Firewalld Firewall.
Prüfe, ob die Firewall läuft.
$ sudo firewall-cmd --state
Du solltest die folgende Ausgabe erhalten.
running
Überprüfe die aktuell erlaubten Dienste/Ports.
$ sudo firewall-cmd --permanent --list-services
Es sollte die folgende Ausgabe angezeigt werden.
dhcpv6-client mdns ssh
Erlaube HTTP und HTTPS Ports.
$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https
Überprüfe erneut den Status der Firewall.
$ sudo firewall-cmd --permanent --list-services
Du solltest eine ähnliche Ausgabe sehen.
dhcpv6-client http https mdns ssh
Lade die Firewall neu.
$ sudo systemctl reload firewalld
Schritt 2 – Caddy installieren
Der erste Schritt ist die Installation des Servers. Die Installationsschritte sind sowohl für Fedora 34 als auch für CentOS 8 die gleichen.
$ sudo dnf install 'dnf-command(copr)'
$ sudo dnf copr enable @caddy/caddy
$ sudo dnf install caddy
Du kannst die Installation mit folgendem Kommando verifizieren.
$ caddy version
v2.4.3 h1:Y1FaV2N4WO3rBqxSYA8UZsZTQdN+PwcoOcAiZTM8C0I=
Schritt 3 – Caddy Konfigurationsgrundlagen
Caddy verwendet JSON als primäres Format zum Speichern oder Schreiben der Konfiguration. Es ist die flexibelste Art, die Konfiguration zu schreiben und unterstützt alle Caddy-Features. Aber wenn du nicht weißt, wie man JSON-Dateien schreibt, bietet Caddy einen einfacheren Weg in Form von Caddyfile.
Das Fedora / CentOS Paket beinhaltet ein Caddyfile unter /etc/caddy/Caddyfile
. Es sollte wie das folgende aussehen (ignoriere die Kommentare)
:80 {
root * /usr/share/caddy
file_server
}
Aktiviere und starte den Caddy Daemon.
$ sudo systemctl enable --now caddy
Du kannst die URL http://youripaddress
öffnen, um das zu überprüfen. Dusolltest die folgende Willkommensseite sehen.
Caddy bietet viele Funktionen und Konfigurationen, daher werden wir uns nur mit den wichtigsten beschäftigen, um unsere Website zu bedienen. Die Standardkonfiguration dient über HTTP, was als :80
angegeben wird. Die root
Direktive weist Caddy an, die zu bedienenden Dateien im /usr/share/caddy
Verzeichnis zu suchen.
Die file_server
Direktive weist Caddy an, als Dateiserver zu agieren, was bedeutet, dass es nur statische Dateien über die Standardadresse ausliefert.
Konfigurieren von Caddy für eine einfache HTML Website
Lass uns eine einfache Caddy-Konfigurationsdatei erstellen, um eine statische Website zu bedienen.
Erstelle ein Verzeichnis, um deine Website zu hosten und deine Log-Dateien zu speichern.
$ sudo mkdir -p /var/www/example.com/html
$ sudo mkdir /var/log/caddy
Setze den Eigentümer des Verzeichnisses auf Caddy.
$ sudo chown caddy:caddy /var/www/example.com/html -R
$ sudo chown caddy:caddy /var/log/caddy
Erstelle eine HTML-Datei zum Testen und öffne sie zum Bearbeiten.
$ sudo nano /var/www/example.com/html/index.html
Füge den folgenden Code ein.
<!DOCTYPE html>
<html>
<head>
<title>Hello from Caddy!</title>
</head>
<body>
<h1>Hello, from Caddy!</h1>
</body>
</html>
Drücke Strg + X, um den Editor zu schließen und drücke Y, wenn du zum Speichern der Datei aufgefordert wirst.
Öffne die Caddydatei zur Bearbeitung.
$ sudo nano /etc/caddy/Caddyfile
Ersetze den bestehenden Code durch den folgenden.
example.com {
root * /var/www/example.com/html
file_server
encode gzip
log {
output file /var/log/caddy/example.access.log
}
@static {
file
path *.ico *.css *.js *.gif *.jpg *.jpeg *.png *.svg *.woff *.pdf *.webp
}
header @static Cache-Control max-age=5184000
tls name@example.com
}
Drücke Strg + X, um den Editor zu schließen und drücke Y, wenn du zum Speichern der Datei aufgefordert wirst.
Lass uns durch alle Direktiven in der Datei gehen. Die Direktive encode gzip
weist Caddy an, die Dateien mittels Gzip-Kompression zu komprimieren.
Die Direktive log
gibt das Zugriffslog für die Site in der Datei /var/log/caddy/example.access.log
aus. Standardmäßig rotiert Caddy die Log-Dateien, wenn sie 100 MB erreichen. Die rotierten Dateien werden nach 90 Tagen gelöscht oder wenn es mehr als 10 rotierte Logs gibt. Du kannst die Standard-Parameter auf folgende Weise ändern.
log {
output file /var/log/caddy/example.access.log {
roll_size 10MB
roll_keep 5
roll_keep_for 240h
}
}
Im obigen Code sind die rotierten Logdateien auf 10 MB begrenzt und werden nach 10 Tagen (240 Stunden) oder wenn es mehr als 5 rotierte Logs gibt, gelöscht.
Caddy wird das SSL-Zertifikat automatisch generieren und installieren, ohne dass wir eingreifen müssen. Die tls
Direktive erlaubt es uns, zusätzliche Optionen zur Konfiguration von HTTPS bereitzustellen, wie z.B. die E-Mail-Adresse, die für den Erhalt von Let’s Encrypt Berichten verwendet wird.
Die header
Direktive aktiviert Cache-control für alle statischen Dateien (Bilder/Javascript/CSS-Dateien). Du kannst weitere Dateierweiterungen hinzufügen oder den Code kopieren, um unterschiedliche Dauer für verschiedene Dateiformate zu setzen. Du wirst den Wert static
in etwas anderes ändern müssen, da dies eine benannte Referenz ist.
Sobald du fertig bist, kannst du deine Konfiguration mit dem folgenden Befehl überprüfen.
$ caddy validate --adapter caddyfile --config /etc/caddy/Caddyfile
Wir müssen die Option --adapter caddyfile
verwenden, da der Befehl standardmäßig nur JSON-Konfigurationen validiert.
Wenn du die folgende Warnung erhältst, kannst du sie einfach mit einem einzigen Befehl beheben.
WARN input is not formatted with 'caddy fmt' {"adapter": "caddyfile", "file": "/etc/caddy/Caddyfile", "line": 2}
Führe den folgenden Befehl aus, um den Fehler zu beheben.
$ caddy fmt --overwrite /etc/caddy/Caddyfile
Der obige Befehl formatiert und überschreibt das Caddyfile.
Starte Caddy neu, um die Konfiguration zu aktivieren. Du wirst den Server jedes Mal neu starten müssen, wenn du eine Änderung an der Konfiguration vornimmst.
$ sudo systemctl restart caddy
Öffne in deinem Browser und du solltest die folgende Seite sehen, was bedeutet, dass die Konfiguration funktioniert.
Mehrere Sites in Caddy konfigurieren
Du kannst mehrere Sites in einer einzigen Caddy-Datei konfigurieren. Um das zu tun, erstelle separate Blöcke für jede Site auf die folgende Weise.
example1.com {
root * /var/www/example1.com/html
...
}
example2.com {
root * /var/www/example2.com/html
...
}
Diese Methode ist gut für ein paar Sites, aber eine einzelne kann ziemlich groß und schwierig zu pflegen werden, wenn du mehrere Sites hostest.
Erstelle das Verzeichnis `/etc/caddy/caddyconf.
$ sudo mkdir /etc/caddy/caddyconf
Nun kannst du die Konfigurationsdateien aus dem Verzeichnis in dein /etc/caddty/caddyfile
importieren, das ganz oben steht.
import caddyconf/*.conf
Der letzte Schritt ist die Erstellung individueller Konfigurationsdateien für jede Site.
PHP-Sites konfigurieren
Bis jetzt haben wir nur darüber gesprochen, wie man statische Seiten mit Caddy bedient. Du kannst Caddy aber genauso einfach nutzen, um dynamische PHP-Sites zu bedienen. Um die PHP-Unterstützung zu aktivieren, füge den folgenden Code in deinen Site-Block ein.
example1.com {
root * /var/www/example1.com/html
...
php_fastcgi unix//run/php-fpm/www.sock
}
Du musst außerdem PHP installieren.
$ sudo dnf install php-fpm php-cli php-gd
Es kann jedes zusätzliche PHP-Modul installiert werden, das du benötigst. Du wirst auch die Datei /etc/php-fpm.d/www.conf
konfigurieren müssen. Öffne die Datei zur Bearbeitung.
$ sudo nano /etc/php-fpm.d/www.conf
Wir müssen den Unix-Benutzer/die Gruppe der PHP-Prozesse auf caddy setzen. Finde die Zeilen user=apache
und group=apache
in der Datei und ändere sie auf nginx.
...
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
; will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
user = caddy
; RPM: Keep a group allowed to write in log dir.
group = caddy
...
Finde die Zeile listen.acl_users = apache,nginx
und ändere ihren Wert in den folgenden.
...
listen.acl_users = apache,nginx,caddy
...
Speichere die Datei, indem du Strg + X drückst und Y eingibst, wenn du dazu aufgefordert wirst.
Starte den PHP-fpm Prozess.
$ sudo systemctl start php-fpm
Um dein PHP-Setup zu testen, erstelle eine Datei test.php
im Ordner html
.
$ sudo nano /var/www/example.com/html/test.php
Füge den folgenden Inhalt hinzu und speichere die Datei, indem du Strg + X drückst und Y eingibst, wenn du dazu aufgefordert wirst.
<?php phpinfo();
Starte http://example.com/test.php
in deinem Webbrowser und du solltest das Folgende sehen.
Reverse Proxy konfigurieren
Caddy kann auch als Reverse Proxy Server verwendet werden. Um ihn einzurichten, verwende den folgenden Code.
example1.com {
...
reverse_proxy localhost:8000 {
header_up Host {http.reverse_proxy.header.X-Forwarded-Host}
}
}
Schritt 4 – Caddy Globale Optionen
Das Caddyfile erlaubt es dir, einige Optionen zu setzen, die global gelten, d.h. sie gelten für alle deine Seiten. Es ist von Vorteil, globale Optionen zu definieren, damit du sie nicht in jedem Serverblock neu deklarieren musst.
Du solltest die globalen Optionen ganz oben in deinem Caddyfile einfügen. Es gibt eine Menge Optionen, die du global setzen kannst. Wir werden nur einige wichtige Optionen durchgehen. Für den Rest solltest du in der Dokumentation von Caddy nachlesen.
Hier sind einige Standardoptionen, die du in deinem Caddyfile verwenden kannst.
{
#TLS Options
email name@example.com
servers :443 {
protocol {
experimental_http3
}
max_header_size 5mb
}
servers :80 {
protocol {
allow_h2c
}
max_header_size 5mb
}
}
Im obigen Code email
wird die E-Mail-ID angegeben, die für die Registrierung des SSL-Zertifikats bei der Let’s Encrypt Authority verwendet wird. OCSP Stapling verbessert die Leistung von HTTPS-Seiten, indem es den Browsern automatisch Zertifikatswiderrufsinformationen zur Verfügung stellt. Die max_header_size
Option spezifiziert die Größe der zu parsenden HTTP Request Header des Clients.
Wir haben auch das HTTP/3 Protokoll für HTTPS Seiten und HTTP/2 Unterstützung für HTTP Seiten aktiviert. Dies sind experimentelle Features und werden wahrscheinlich irgendwann wieder entfernt, also sei vorsichtig, bevor du sie aktivierst.
Schritt 5 – Verbesserung der Sicherheit
Aktivieren der HTTP-Authentifizierung
Du kannst die einfache HTTP-Authentifizierung für bestimmte Verzeichnisse aktivieren. Zuerst musst du dafür Authentifizierungsdaten erstellen.
Caddy akzeptiert in der Konfiguration nur gehashte Passwörter. Du musst also zuerst ein gehashtes Passwort erstellen. Führe den folgenden Befehl aus, um das zu tun.
$ caddy hash-password
Enter password:
Confirm password:
JDJhJDEwJEVCNmdaNEg2Ti5iejRMYkF3MFZhZ3VtV3E1SzBWZEZ5Q3VWc0tzOEJwZE9TaFlZdEVkZDhX
Sobald du das Passwort fertig hast, gibst du den folgenden Code in dein Caddyfile ein.
basicauth /secret/* {
John JDJhJDEwJEVCNmdaNEg2Ti5iejRMYkF3MFZhZ3VtV3E1SzBWZEZ5Q3VWc0tzOEJwZE9TaFlZdEVkZDhX
}
Der obige Befehl wird das Verzeichnis /secret
mit den soeben erstellten Anmeldedaten schützen.
Härtung der Site-Sicherheit und Aktivierung von HSTS
Es gibt weitere Sicherheitskonfigurationen, die du hinzufügen kannst, um deine Seiten zu schützen. Dafür werden wir eine weitere Datei /etc/caddy/caddy_security.conf
erstellen.
$ sudo nano /etc/caddy/caddy_security.conf
Füge den folgenden Code hinzu.
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
X-Xss-Protection "1; mode=block"
X-Content-Type-Options "nosniff"
X-Frame-Options "DENY"
Permissions-Policy "interest-cohort=()"
Content-Security-Policy "upgrade-insecure-requests"
Referrer-Policy "strict-origin-when-cross-origin"
Cache-Control "public, max-age=15, must-revalidate"
Feature-Policy "accelerometer 'none'; ambient-light-sensor 'none'; autoplay 'self'; camera 'none'; encrypted-media 'none'; fullscreen 'self'; geolocation 'none'; gyroscope 'none'; magnetometer 'none'; microphone 'none'; midi 'none'; payment 'none'; picture-in-picture *; speaker 'none'; sync-xhr 'none'; usb 'none'; vr 'none'"
}
Der obige Code aktiviert/implementiert das Folgende.
- Aktiviert die HSTS-Unterstützung für die Site und alle ihre Subdomains.
- Ermöglicht XSS-Filterung.
- Verhindert Content/MIME Sniffing.
- Er verhindert, dass deine Seite innerhalb eines IFRAMEs geladen wird.
- Verhindert, dass deine Site in FLOC-Tracking-Tests aufgenommen wird.
- Fügt eine Inhaltssicherheitsrichtlinie hinzu, wie User Agents unsichere URLs behandeln.
- Implementiert eine Referrer-Policy, so dass bei Cross-Origin-Anfragen nur der Referrer gesendet wird, wenn das Protokoll dies vorsieht.
- Feature Policy bietet einen Mechanismus zum Aktivieren und Deaktivieren bestimmter Browserfunktionen.
Als Nächstes importierst du die Datei in einen der gewünschten Siteblöcke.
example.com {
...
import /etc/caddy/caddy_security.conf
}
Starte den Server neu, um die Änderung zu implementieren.
Fazit
Dies schließt das Tutorial zur Installation und Konfiguration des Caddy Webservers auf Fedora 34 / CentOS 8 basierten Servern ab. Wenn du noch Fragen hast, schreibe sie in die Kommentare unten.