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 Willkommen Seite

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.

Caddy FrontPage

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.

Caddy PHP Test Seite

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.

  1. Aktiviert die HSTS-Unterstützung für die Site und alle ihre Subdomains.
  2. Ermöglicht XSS-Filterung.
  3. Verhindert Content/MIME Sniffing.
  4. Er verhindert, dass deine Seite innerhalb eines IFRAMEs geladen wird.
  5. Verhindert, dass deine Site in FLOC-Tracking-Tests aufgenommen wird.
  6. Fügt eine Inhaltssicherheitsrichtlinie hinzu, wie User Agents unsichere URLs behandeln.
  7. Implementiert eine Referrer-Policy, so dass bei Cross-Origin-Anfragen nur der Referrer gesendet wird, wenn das Protokoll dies vorsieht.
  8. 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.

Das könnte dich auch interessieren …