Caddy Webserver - Installation, Konfiguration und erster Test

Datum

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 mit tar -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)

Autor
Kategorien Linux, Software

PRTG Map