Was ist Caddy?
Caddy ist ein simpler, leichtgewichtiger Webserver der auch HTTP/2 unterstützt und wo die SSL-Verschlüsselung gleich integriert ist.
Des weiteren wird für jede darin konfigurierte Domain automatisch ein SSL-Zertifikat von „Let’s Encrypt“ bezogen.
Der Webserver ist in der Programmiersprache Go geschrieben und besteht am Ende aus nur einer statisch gelinkten Binärdatei, welche die (vorher ausgewählten) Module bereits integriert hat.
Homepage: https://caddyserver.com/
Github: https://github.com/mholt/caddy
Vorteile?
1.) Caddy verwaltet seine VHosts in einer zentralen Konfigurationsdatei und verwendet dabei eine sehr einfache und recht selbsterklärende Syntax. Um eine Webseite für seine Domain ausgeben zu lassen reichen schon 2 Zeilen in der Konfigurationsdatei (eine Zeile für das Documentroot und eine für PHP)
2.) SSL! Sobald Caddy gestartet wird bezieht er für die auszugebenden Domains SSL-Zertifikate von Let’s Encrypt und verlängert diese auch automatisch vor deren Ablauf.
3.) Als Standard ist bereits HTTP/2 implementiert
4.) Es gibt diverse Plugins, mit welchen man Caddy noch um einige Funktionen erweitern kann. Z.B. gibt es ein Restic -Plugin um seine Webdaten verschlüsselt zu sichern.
Installation
Auf der Homepage kann man sich Caddy für die gängigsten Plattformen herunterladen:
Als nächsten Schritt kann noch Plugins hinzufügen sofern man diese benötigt. Dabei zeigt ein Klick auf das „i“ neben dem Namen Informationen zu dem entsprechenden Plugin an:
Nachdem man nun noch die Lizenz ausgewählt hat (für den privaten Gebrauch ist die Verwendung von Caddy kostenfrei) werden die entsprechenden Links zum herunterladen angezeigt.
Direkt-Link: Beim Aufruf des Direkt-Links wird ein .tar.gz-Archiv heruntergeladen, welches man mittar -xzf caddy*.tar.gz caddy
entpackt und die entpackte Binärdatei verschiebt man nun in einen Ordner, aus dem heraus man sie leicht aufrufen kann:
mv ./caddy /usr/local/bin
Sofern man nicht als root eingeloggt ist sollte der Befehl mit einem sudo davor ausgeführt werden
ANMERKUNG: Man sollte natürlich darauf achten, dass der Ordner in welchen die Caddy-Binärdatei verschoben wird auch in der Systemweiten $PATH Variable eingetragen ist.
One-step installer script (bash): Hierbei führt man den dort angezeigten Befehl (mit sudo/root-Rechten) im Linux-Terminal aus und Caddy wird in die entsprechenden Pfade installiert.
Welche dieser Installationsmethoden man verwendet bleibt jedem selber überlassen.
Caddy verwenden
Standardmäßig nutzt Caddy den Ordner als DocumentRoot von dem aus das Programm aufgerufen wird (nicht wo die Binärdatei liegt) und läuft dann auf Port 2015.
Auf diese Weise kann man schon mal probeweise seine Seite(n) im Browser betrachten ohne vorher extra dafür einen entsprechenden VHost angelegt zu haben.
Wenn man mit Caddy nun aber seine Seite(n) regulär über Port 80 bzw. 443 erreichbar machen will kommt man um eine Konfigurationsdatei nicht herum.
Caddy sucht standardmäßig nach einer Konfigurationsdatei namens Caddyfile.
Hinweis: Bevor Caddy auf Port 80 bzw. 443 lauschen kann muss man die entsprechenden Berechtigungen erteilen, schließlich soll Caddy ja nicht als root-Prozess laufen müssen
Das erledigt der folgende Befehl: sudo setcap cap_net_bind_service=+ep $(which caddy)
Anmerkung: unter Debian kann es sein, dass vor noch apt install libcap2-bin
ausgeführt werden muss um das entsprechende Paket zu installieren.
Die weitere Vorgehensweise ist bei jedem Admin unterschiedlich und ich zeige hier auch nur einen möglichen Weg als Beispiel auf…
Ich erstelle für Caddy einen extra Benutzer mit sudo useradd -rmd /opt/caddy caddy
und verwende das Verzeichnis /opt/caddy für die SSL-Zertifiakte und Logdateien von Caddy.
/opt/caddy/store beinhaltet dann die SSL-Zertifikate
/opt/caddy/logs hier werden die Logdateien gespeichert
Um diese Verzeichnisse zu erstellen: sudo mkdir -p /opt/caddy/store /opt/caddy/logs
Damit Caddy mit diesen Verzeichnissen arbeiten kann muss es auch die entsprechenden Berechtigungen haben, dazu: sudo chown -R caddy: /opt/caddy
Die Konfigurationsdatei „Caddyfile“
Wie bereits erwähnt handelt es sich hierbei um DIE zentrale Konfigurationsdatei, in der alle VHosts mit deren Optionen eingerichtet werden.
Wenn ich PHP-FPM verwende, welches auf Port 9000 lauscht sieht meine Caddyfile (welche ich unter /opt/caddy/ angelegt habe) z.B. folgendermaßen aus:
meine.suppertolledomain.lol {
root /var/www
fastcgi / 127.0.0.1:9000 php
}
Das ist im Grunde auch schon alles.
Natürlich kann man noch weitere Optionen angeben… Hier mal ein Beispiel mit gzip-Komprimierung und Angabe entsprechender Acces- und Errorlogs:
meine.suppertolledomain.lol {
root /var/www
gzip
log /opt/caddy/logs/access.log
errors /opt/caddy/logs/error.log
fastcgi / 127.0.0.1:9000 php
}
Weitere Bespiele mit Erläuterungen finden sich auf der Homepage oder auch in den diversen Konfigurationsdatei-Beispielen auf Github
Dort finden sich auch passende Konfigurationsdateien für z.B. Nextcloud, Drupal, Jira, etc…
Caddy einfach starten und stoppen
Damit man Caddy einfach starten und stoppen kann legt man sich noch ein passendes Systemd -Startscript unter /etc/systemd/system/
an (Bsp.: /etc/systemd/system/caddy.service
):
[Unit]
Description=Caddy HTTP/2 web server
[Service]
User=caddy
Group=caddy
Environment=CADDYPATH=/opt/caddy/store
ExecStart=/usr/local/bin/caddy -agree=true -log=/opt/caddy/logs/caddy.log -conf=/opt/caddy/Caddyfile -root=/dev/null
ExecReload=/bin/kill -USR1 $MAINPID
LimitNOFILE=1048576
LimitNPROC=64
[Install]
WantedBy=multi-user.target
eine kleine Erläuterung der Flags:
-agree Akzeptiert das CA’s Subscriber Agreement der SSL-Zertifikate
-log Standort der Caddy-eigenen Logdateien, wo Fehler vom Programm selber geloggt werden
-conf Standort der Caddyfile
-root falls aus $GRÜNDEN mal vergessen wird ein DocumentRoot anzugeben verwendet Caddy ja das aktuelle Verzeichnis und damit nicht die falschen Dateien im Netz freigegeben werden gibt man zur Sicherheit noch diesen Parameter an der ins Nichts zeigt
Wenn Caddy nun mit sudo systemctl start caddy
gestartet wird, sollte die gewünschte Webseite mit bereits aktiven SSL-Zertifikaten verfügbar sein.
Will man Caddy ohne Startscript ausführen, kann man die entsprechenden Parameter auch direkt mitgeben:
[rasputin@dev /var/www] caddy -host meine-domain.de -conf /opt/caddy/Caddyfile
Test (Caddy vs. Nginx)
Verwendete Komponenten:
ab – Apache HTTP server benchmarking tool
nginx/1.12.1
Caddy/0.10.10
PHP 7.1.13 (FPM)
bei beiden Webservern ist HTTP/2.0 aktiviert
Die „Testseite“ ist eine recht einfache index, welche nur einen Login zeigt.
Das Programm ab wird mit folgenden Parametern aufgerufen: ab -n 5000 -c 1000 https://meine-domain.de
-n gibt die Anzahl der Requests an
-c ist die Anzahl der parallelen Requests
Nginx
Benchmarking meine-domain.de (be patient)
Completed 500 requests
Completed 1000 requests
Completed 1500 requests
Completed 2000 requests
Completed 2500 requests
Completed 3000 requests
Completed 3500 requests
Completed 4000 requests
Completed 4500 requests
Completed 5000 requests
Finished 5000 requests
Server Software: nginx
Server Hostname: meine-domain.de
Server Port: 443
SSL/TLS Protocol: TLSv1.2,ECDHE-RSA-AES256-GCM-SHA384,2048,256
Document Path: /index.php
Document Length: 594 bytes
Concurrency Level: 1000
Time taken for tests: 55.105 seconds
Complete requests: 5000
Failed requests: 167
(Connect: 0, Receive: 0, Length: 167, Exceptions: 0)
Non-2xx responses: 156
Total transferred: 4417548 bytes
HTML transferred: 2896698 bytes
Requests per second: 90.74 [#/sec] (mean)
Time per request: 11021.077 [ms] (mean)
Time per request: 11.021 [ms] (mean, across all concurrent requests)
Transfer rate: 78.29 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 683 1419.3 80 8172
Processing: 196 5736 9425.8 1570 53629
Waiting: 196 5712 9423.5 1531 53629
Total: 313 6420 9679.5 2002 55091
Percentage of the requests served within a certain time (ms)
50% 2002
66% 4046
75% 6642
80% 8808
90% 19417
95% 32224
98% 34059
99% 41851
100% 55091 (longest request)
Caddy
Benchmarking meine-domain.de (be patient)
Completed 500 requests
Completed 1000 requests
Completed 1500 requests
Completed 2000 requests
Completed 2500 requests
Completed 3000 requests
Completed 3500 requests
Completed 4000 requests
Completed 4500 requests
Completed 5000 requests
Finished 5000 requests
Server Software: Caddy
Server Hostname: meine-domain.de
Server Port: 443
SSL/TLS Protocol: TLSv1.2,ECDHE-RSA-AES256-GCM-SHA384,2048,256
Document Path: /index.php
Document Length: 594 bytes
Concurrency Level: 1000
Time taken for tests: 47.293 seconds
Complete requests: 5000
Failed requests: 546
(Connect: 0, Receive: 0, Length: 546, Exceptions: 0)
Non-2xx responses: 546
Total transferred: 3337344 bytes
HTML transferred: 2654412 bytes
Requests per second: 105.72 [#/sec] (mean)
Time per request: 9458.659 [ms] (mean)
Time per request: 9.459 [ms] (mean, across all concurrent requests)
Transfer rate: 68.91 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 51 997 1366.2 593 10480
Processing: 473 5022 6264.8 2483 33947
Waiting: 473 5020 6265.1 2479 33947
Total: 875 6019 6518.6 3433 42705
Percentage of the requests served within a certain time (ms)
50% 3433
66% 5349
75% 7648
80% 8960
90% 15165
95% 17164
98% 32532
99% 33352
100% 42705 (longest request)