Caddy ist ein Open-Source-Webserver, der in der Go-Sprache geschrieben ist. Es bietet HTTP/3-Unterstützung, TLS v1.3, automatische SSL-Konfiguration mit Let's Encrypt, Reverse-Proxy und unterstützt mehrere Plugins zur Erweiterung seiner Funktionalität. Es hat den Vorteil, dass seine gesamte Konfiguration von einer einzigen Datei bereitgestellt wird, egal wie viele Sites Sie hosten müssen.
Dieses Tutorial behandelt die Installation und Konfiguration von Caddy und PHP auf Fedora 34- und CentOS 8-basierten Servern. Wir werden behandeln, wie einzelne und mehrere Sites gehostet werden und wie Reverse-Proxy zusammen mit einigen anderen Sicherheitsfunktionen verwendet wird.
Voraussetzungen
-
Fedora 34- oder CentOS 8-basierter Server
-
Ein Nicht-Root-Benutzer mit sudo-Berechtigungen
-
Ein Domänenname, der auf die IP-Adresse des Servers verweist
-
SELinux ist deaktiviert.
$ sudo setenforce 0
-
Stellen Sie sicher, dass alles aktualisiert ist.
$ sudo dnf update
Schritt 1 – Firewall konfigurieren
Der erste Schritt besteht darin, die Firewall so zu konfigurieren, dass HTTP- und HTTPS-Ports geöffnet werden. Fedora und CentOS werden mit der vorinstallierten Firewall Firewalld geliefert.
Überprüfen Sie, ob die Firewall ausgeführt wird.
$ sudo firewall-cmd --state
Sie sollten die folgende Ausgabe erhalten.
running
Überprüfen Sie die aktuell erlaubten Dienste/Ports.
$ sudo firewall-cmd --permanent --list-services
Es sollte die folgende Ausgabe zeigen.
dhcpv6-client mdns ssh
HTTP- und HTTPS-Ports zulassen.
$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https
Überprüfen Sie den Status der Firewall erneut.
$ sudo firewall-cmd --permanent --list-services
Sie sollten eine ähnliche Ausgabe sehen.
dhcpv6-client http https mdns ssh
Laden Sie die Firewall neu.
$ sudo systemctl reload firewalld
Schritt 2 – Caddy installieren
Der erste Schritt besteht darin, den Server zu installieren. Die Installationsschritte bleiben für Fedora 34 und CentOS 8 gleich.
$ sudo dnf install 'dnf-command(copr)'
$ sudo dnf copr enable @caddy/caddy
$ sudo dnf install caddy
Sie können die Installation mit dem folgenden Befehl überprüfen.
$ caddy version
v2.4.3 h1:Y1FaV2N4WO3rBqxSYA8UZsZTQdN+PwcoOcAiZTM8C0I=
Schritt 3 – Grundlagen der Caddy-Konfiguration
Caddy verwendet JSON als primäres Format zum Speichern oder Schreiben von Konfigurationen. Es ist die flexibelste Art, die Konfiguration zu schreiben und unterstützt alle Caddy-Funktionen. Aber wenn Sie nicht wissen, wie man JSON-Dateien schreibt, bietet Caddy einen einfacheren Weg in Form von Caddyfile.
Das Fedora / CentOS-Paket enthält eine Caddyfile unter /etc/caddy/Caddyfile
. Es sollte wie folgt aussehen (die Kommentare ignorieren)
:80 {
root * /usr/share/caddy
file_server
}
Aktivieren und starten Sie den Caddy-Daemon.
$ sudo systemctl enable --now caddy
Sie können die URL http://youripaddress
öffnen überprüfen. Sie sollten die folgende Willkommensseite sehen.
Caddy bietet viele Funktionen und Konfigurationen, daher werden wir uns nur mit den wichtigen befassen, um unsere Website zu bedienen. Die Standardkonfiguration dient über HTTP, das als :80
angegeben ist . Die root
-Direktive weist Caddy an, nach den Dateien zu suchen, die in /usr/share/caddy
bereitgestellt werden sollen Verzeichnis.
Der file_server
Direktive weist Caddy an, als Dateiserver zu fungieren, was bedeutet, dass er nur statische Dateien über die Standardadresse bereitstellt.
Konfigurieren von Caddy für eine einfache HTML-Website
Lassen Sie uns eine grundlegende Caddy-Konfigurationsdatei erstellen, um eine statische Website bereitzustellen.
Erstellen Sie ein Verzeichnis, um Ihre Website zu hosten und Ihre Protokolldateien zu speichern.
$ sudo mkdir -p /var/www/example.com/html
$ sudo mkdir /var/log/caddy
Legen Sie den Besitz des Verzeichnisses auf Caddy fest.
$ sudo chown caddy:caddy /var/www/example.com/html -R
$ sudo chown caddy:caddy /var/log/caddy
Erstellen Sie eine HTML-Datei zum Testen und öffnen Sie sie zur Bearbeitung.
$ sudo nano /var/www/example.com/html/index.html
Fügen Sie den folgenden Code hinzu.
<!DOCTYPE html>
<html>
<head>
<title>Hello from Caddy!</title>
</head>
<body>
<h1>Hello, from Caddy!</h1>
</body>
</html>
Drücken Sie Strg + X um den Editor zu schließen und drücken Sie Y wenn Sie aufgefordert werden, die Datei zu speichern.
Öffnen Sie die Caddy-Datei zum Bearbeiten.
$ sudo nano /etc/caddy/Caddyfile
Ersetzen Sie den vorhandenen 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 [email protected]
}
Drücken Sie Strg + X um den Editor zu schließen und drücken Sie Y wenn Sie aufgefordert werden, die Datei zu speichern.
Lassen Sie uns alle Anweisungen in der Datei durchgehen. Das encode gzip
-Direktive weist Caddy an, die Dateien mit der Gzip-Komprimierung zu komprimieren.
Das log
Direktive gibt das Zugriffsprotokoll für die Site in /var/log/caddy/example.access.log
aus Datei. Standardmäßig rotiert Caddy Protokolldateien, wenn sie 100 MB erreichen. Die rotierten Dateien werden nach 90 Tagen gelöscht oder wenn mehr als 10 rotierte Protokolle vorhanden sind. Sie können die Standardparameter wie folgt ändern.
log {
output file /var/log/caddy/example.access.log {
roll_size 10MB
roll_keep 5
roll_keep_for 240h
}
}
Im obigen Code sind rotierte Protokolldateien auf 10 MB begrenzt und werden nach 10 Tagen (240 Stunden) gelöscht oder wenn mehr als 5 rotierte Protokolle vorhanden sind.
Caddy generiert und installiert das SSL-Zertifikat automatisch ohne Eingriff. Die tls
-Direktive ermöglicht es uns, zusätzliche Optionen zum Konfigurieren von HTTPS bereitzustellen, wie z. B. die E-Mail-Adresse, die zum Abrufen von Let's Encrypt-Berichten verwendet wird.
Der header
Die Direktive aktiviert die Cache-Steuerung für alle statischen Dateien (Bilder/Javascript/CSS-Dateien). Sie können weitere Dateierweiterungen hinzufügen oder den Code kopieren, um unterschiedliche Dauer für verschiedene Dateiformate festzulegen. Sie müssen den Wert static
ändern zu etwas anderem, da dies eine benannte Referenz ist.
Sobald Sie fertig sind, können Sie Ihre Konfiguration mit dem folgenden Befehl validieren.
$ caddy validate --adapter caddyfile --config /etc/caddy/Caddyfile
Wir müssen die --adapter caddyfile
verwenden Option, da der Befehl standardmäßig nur JSON-Konfigurationen validiert.
Wenn Sie die folgende Warnung erhalten, können Sie sie einfach mit einem einzigen Befehl beheben.
WARN input is not formatted with 'caddy fmt' {"adapter": "caddyfile", "file": "/etc/caddy/Caddyfile", "line": 2}
Führen Sie den folgenden Befehl aus, um den Fehler zu beheben.
$ caddy fmt --overwrite /etc/caddy/Caddyfile
Der obige Befehl formatiert und überschreibt die Caddydatei.
Starten Sie Caddy neu, um die Konfiguration zu aktivieren. Sie müssen den Server jedes Mal neu starten, wenn Sie eine Änderung an der Konfiguration vornehmen.
$ sudo systemctl restart caddy
Öffnen Sie in Ihrem Browser und Sie sollten die folgende Seite sehen, was bedeutet, dass die Konfiguration funktioniert.
Konfigurieren mehrerer Sites in Caddy
Sie können mehrere Sites in einer einzigen Caddy-Datei konfigurieren. Erstellen Sie dazu auf folgende Weise separate Blöcke für jede Site.
example1.com {
root * /var/www/example1.com/html
...
}
example2.com {
root * /var/www/example2.com/html
...
}
Diese Methode ist für ein paar Sites in Ordnung, aber eine einzelne kann ziemlich groß und schwierig zu warten sein, wenn Sie mehrere Sites hosten.
Erstellen Sie das Verzeichnis `/etc/caddy/caddyconf.
$ sudo mkdir /etc/caddy/caddyconf
Jetzt können Sie die Konfigurationsdateien aus dem Verzeichnis in Ihr /etc/caddty/caddyfile
importieren oben in der Datei.
import caddyconf/*.conf
Der letzte Schritt besteht darin, individuelle Konfigurationsdateien für jede Site zu erstellen.
Konfigurieren von PHP-Sites
Bisher haben wir nur über das Bereitstellen statischer Websites mit Caddy gesprochen. Genauso einfach können Sie mit Caddy auch dynamische PHP-Sites bedienen. Um die PHP-Unterstützung zu aktivieren, fügen Sie den folgenden Code in Ihren Website-Block ein.
example1.com {
root * /var/www/example1.com/html
...
php_fastcgi unix//run/php-fpm/www.sock
}
Außerdem müssen Sie PHP installieren.
$ sudo dnf install php-fpm php-cli php-gd
Sie können jedes zusätzliche PHP-Modul installieren, das Sie benötigen. Sie müssen auch die Datei /etc/php-fpm.d/www.conf
konfigurieren . Öffnen Sie die Datei zum Bearbeiten.
$ sudo nano /etc/php-fpm.d/www.conf
Wir müssen den Unix-Benutzer/die Gruppe von PHP-Prozessen auf caddy setzen . Suchen Sie user=apache
und group=apache
Zeilen in der Datei und ändern Sie sie in 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
...
Suchen Sie die Zeile listen.acl_users = apache,nginx
und ändern Sie seinen Wert wie folgt.
...
listen.acl_users = apache,nginx,caddy
...
Speichern Sie die Datei, indem Sie Strg + X drücken und geben Sie Y ein wenn Sie dazu aufgefordert werden.
Starten Sie den PHP-fpm-Prozess.
$ sudo systemctl start php-fpm
Um Ihr PHP-Setup zu testen, erstellen Sie eine Datei test.php
im html
Ordner.
$ sudo nano /var/www/example.com/html/test.php
Fügen Sie den folgenden Inhalt hinzu und speichern Sie die Datei, indem Sie Strg + X drücken und geben Sie Y ein wenn Sie dazu aufgefordert werden.
<?php phpinfo();
Starten Sie http://example.com/test.php
in Ihrem Webbrowser, und Sie sollten Folgendes sehen.
Reverse-Proxy konfigurieren
Caddy kann auch als Reverse-Proxy-Server verwendet werden. Verwenden Sie zum Einrichten den folgenden Code.
example1.com {
...
reverse_proxy localhost:8000 {
header_up Host {http.reverse_proxy.header.X-Forwarded-Host}
}
}
Schritt 4 – Globale Caddy-Optionen
Die Caddy-Datei ermöglicht es Ihnen, einige Optionen einzustellen, die global anwendbar sind, d. h. sie gelten für alle Ihre Sites. Es ist vorteilhaft, globale Optionen zu definieren, damit Sie sie nicht in jedem Serverblock neu deklarieren müssen.
Sie sollten die globalen Optionen ganz oben in Ihrer Caddy-Datei angeben. Es gibt viele Optionen, die Sie global einstellen können. Wir werden nur einige wichtige durchgehen. Den Rest entnehmen Sie bitte der Dokumentation von Caddy.
Hier sind einige Standardoptionen, die Sie in Ihrem Caddyfile verwenden können.
{
#TLS Options
email [email protected]
servers :443 {
protocol {
experimental_http3
}
max_header_size 5mb
}
servers :80 {
protocol {
allow_h2c
}
max_header_size 5mb
}
}
Im obigen Code email
gibt die E-Mail-ID an, die zum Registrieren des SSL-Zertifikats bei der Let's Encrypt-Autorität verwendet wird. OCSP-Stapling verbessert die Leistung von HTTPS-Sites, indem den Browsern automatisch Informationen zum Widerruf von Zertifikaten bereitgestellt werden. Die max_header_size
Die Option gibt die Größe der zu parsenden HTTP-Anforderungsheader des Clients an.
Wir haben auch das HTTP/3-Protokoll für HTTPS-Sites und die HTTP/2-Unterstützung für HTTP-Sites aktiviert. Dies sind experimentelle Funktionen und werden wahrscheinlich irgendwann entfernt, seien Sie also vorsichtig, bevor Sie sie aktivieren.
Schritt 5 – Verbesserung der Sicherheit
HTTP-Authentifizierung aktivieren
Sie können für bestimmte Verzeichnisse eine einfache HTTP-Authentifizierung aktivieren. Zuerst müssen Sie Authentifizierungsdaten dafür erstellen.
Caddy akzeptiert nur gehashte Passwörter in der Konfiguration. Sie müssen also zuerst ein gehashtes Passwort erstellen. Führen Sie dazu den folgenden Befehl aus.
$ caddy hash-password
Enter password:
Confirm password:
JDJhJDEwJEVCNmdaNEg2Ti5iejRMYkF3MFZhZ3VtV3E1SzBWZEZ5Q3VWc0tzOEJwZE9TaFlZdEVkZDhX
Sobald Sie das Passwort bereit haben, geben Sie den folgenden Code in Ihre Caddy-Datei ein.
basicauth /secret/* {
John JDJhJDEwJEVCNmdaNEg2Ti5iejRMYkF3MFZhZ3VtV3E1SzBWZEZ5Q3VWc0tzOEJwZE9TaFlZdEVkZDhX
}
Der obige Befehl schützt den /secret
Verzeichnis mit den soeben erstellten Anmeldeinformationen.
Härten der Site-Sicherheit und Aktivieren von HSTS
Es gibt andere Sicherheitskonfigurationen, die Sie hinzufügen können, um Ihre Sites zu schützen. Dafür erstellen wir eine weitere Datei /etc/caddy/caddy_security.conf
.
$ sudo nano /etc/caddy/caddy_security.conf
Fügen Sie 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 Folgendes.
- Aktiviert die HSTS-Unterstützung für die Website und alle ihre Subdomains.
- Aktiviert XSS-Filterung.
- Verhindert Inhalts-/MIME-Sniffing.
- Es verhindert, dass Ihre Website in einem IFRAME geladen wird.
- Es verhindert, dass Ihre Website in FLOC-Tracking-Tests aufgenommen wird.
- Fügt eine Inhaltssicherheitsrichtlinie dazu hinzu, wie Benutzeragenten mit unsicheren URLs umgehen.
- Implementiert eine Referrer-Richtlinie, sodass nur der Referrer für Cross-Origin-Anfragen gesendet wird, wenn das Protokoll dasselbe sagt.
- Funktionsrichtlinie bietet einen Mechanismus zum Aktivieren und Deaktivieren bestimmter Browserfunktionen.
Importieren Sie als Nächstes die Datei in einen der gewünschten Site-Blöcke.
example.com {
...
import /etc/caddy/caddy_security.conf
}
Starten Sie den Server neu, um die Änderung zu implementieren.
Schlussfolgerung
Damit ist das Tutorial zur Installation und Konfiguration des Caddy-Webservers auf Fedora 34 / CentOS 8-basierten Servern abgeschlossen. Wenn Sie Fragen haben, posten Sie diese in den Kommentaren unten.