Mit Caddy gelingt es auch unerfahrenen Anwendern, einen Webserver vernünftig und sicher aufzusetzen. Dabei reduziert er das üblicherweise komplexe Setup von HTTPS auf ein Minimum.
In erster Linie dient ein Webserver dazu, Webseiten und deren Inhalte bereitzustellen und auszuliefern. Er erhält die Anfrage beispielsweise dann, wenn Sie mit Ihrem Webbrowser eine Webseite via HTTP oder HTTPS ansurfen. Der Browser sendet eine Anfrage als HTTP-Request zum Webserver; der nimmt sie entgegen, bereitet die angeforderten Inhalte auf beziehungsweise rendert sie und stellt anschließend den Webbrowser bereit.
Die Statistik der am meisten eingesetzten Webserver führen der Apache HTTP Server, Microsofts Internet Information Services (IIS) sowie Nginx an. Bei den ersten beiden handelt es sich um Veteranen aus den 1990ern, die über vorbereitete Konfigurationen oder Zusatzmodule immer wieder an die sich ändernden, komplexen Bedürfnisse der IT-Infrastruktur angepasst wurden. Die umfangreichen Bücher und Tutorials zu Apache und IIS sprechen Bände über deren Komplexität. Nginx erblickte im Jahr 2004 das Licht der Welt, gilt als modern, leichtgewichtig und flexibel und verrichtet seinen Dienst ebenso zuverlässig und flink wie die Konkurrenten.
Die vielfachen Angriffe auf Webserver und deren Dienste bringen Systemadministratoren immer stärker in Bedrängnis und verunsichern die Nutzer. Um das Vertrauen zu erhalten, gehen mehr und mehr Admins dazu über, ihre Webseiten SSL/TSL-verschlüsselt via HTTPS auszuliefern. Das erfordert üblicherweise mehrere Schritte zum Beantragen, Installieren, Pflegen und regelmäßigen Erneuern der dafür genutzten Zertifikate. Sie gelten nur zeitlich begrenzt, je nach Certification Authority und Budget zwischen 3 Monaten und 10 Jahren.
Die Initiative Let’s Encrypt [1] setzt sich zum Ziel, den ganzen Prozess zu vereinfachen, und verbucht damit bereits beachtliche Erfolge (siehe Kasten “Einfach verschlüsselt”). Zum derzeitigen Stand stellte das Projekt bereits für 63 Millionen Domains Zertifikate aus.
Einfach verschlüsselt
Das Projekt Let’s Encrypt ist die erste große Initiative der gemeinnützigen Organisation Internet Security Research Group (ISRG). Sie setzt sich zum Ziel, verschlüsselte WWW-Verbindungen zum Standard zu erheben – quasi HTTPS für jedermann. Let’s Encrypt setzt bei der Verschlüsselung auf das Ausstellen sogenannter Domainvalidierungszertifikate. Um zu prüfen, ob die Person, die eine Zertifizierungsanfrage stellt, auch tatsächlich Inhaber der Domain ist, erstellt und versendet Let’s Encrypt einen Token zu der anfragenden Domain. Danach erfolgt eine Web- oder DNS-Abfrage, bei der sich die Domain durch einen von diesem Token abgeleiteten Schlüssel verifiziert. Das stellt sicher, dass die Inhalte auch tatsächlich vom Betreiber der Webseite stammen. Für die eigene Vertrauenswürdigkeit setzt Let’s Encrypt außerdem auf größtmögliche Transparenz. Dafür nutzt das Projekt freie Software und offene Standards in Kombination mit der regelmäßigen Veröffentlichung von Transparenzberichten.
Caddy
An dieser Stelle kommt der Webserver Caddy [2] ins Spiel, der sowohl HTTP/2 (siehe Kasten “Von HTTP 1.1 zu HTTP/2”) als auch eine Anbindung an Let’s Encrypt von Haus aus mitbringt. Seit seiner Veröffentlichung 2015 gilt er als erster Allzweck-Webserver, der für diese Kombination dem Webmaster nur eine minimale Vorbereitung abfordert. Für Apache [3], Nginx [4] und IIS [5] gibt es zwar zu diesem Zweck ebenfalls Module und Lösungen, doch die befinden sich entweder noch in der Entwicklung oder ihr Setup gestaltet sich deutlich komplexer.
Von HTTP 1.1 zu HTTP/2
Nach langer Diskussion der Entwicklergruppen der unterschiedlichen Webbrowser steht seit Februar 2015 die Version 2.0 des Hypertext Transfer Protocols [10] zur Verfügung. Im RFC 7540 [11] beschrieben, löst HTTP/2 nach und nach das aus dem Jahr 1997 stammende HTTP 1.1 ab. Auswertungen des WWW-Datenverkehrs ergaben Ende 2017 bereits einen Anteil von 20 Prozent für HTTP/2. HTTP/2 bringt etliche Neuerungen [12] mit sich, darunter eine Datenkompression der HTTP-Header sowie das parallele Ausführen von Requests über eine einzige TCP-Verbindung (“Pipelining”). Generell zielt das Protokoll darauf ab, die zur Verfügung stehende Rechenleistung besser auszunutzen und die Zeit für die Übermittlung der Anfrage zu minimieren.
Das in der Programmiersprache Go entwickelte Caddy steht für den privaten Einsatz als kostenfreie Community-Version bereit. Möchten Sie den Webserver kommerziell nutzen, freuen sich die Entwickler über eine einmalige Zahlung von 25 US-Dollar. Das Projekt steht unter der Apache-2.0-Lizenz.
Die folgende, auf Debian 9 angepasste Beschreibung basiert auf dem Blogbeitrag von Supriyo Biswas [6]. Darüber hinaus wurden die Entwicklungen seit seiner Veröffentlichung des Beitrags sowie die stärkere Verwendung von Markdown berücksichtigt.
Installation
Für Caddy stehen derzeit noch keine spezifischen Pakete für die einzelnen Linux-Distributionen bereit. Im Download-Bereich der Projektseite befindet sich jedoch ein Konfigurator, mit dessen Hilfe Sie nicht nur das für Ihr System passende Binary auswählen, sondern auch die Plugins, die Sie integrieren möchten (Abbildung 1). Abschließend generiert die Software das nach Ihren Wünschen zusammengestellte Paket. Caddy gibt es daneben unter anderem auch für Windows, viele BSD-Varianten und Mac OS.

Abbildung 1: Bereits auf der Projektseite legen Sie fest, welche Erweiterungen die Software enthalten soll.
Möchten Sie Caddy lieber über die Kommandozeile einrichten, etwa für den Einsatz auf einem Headless-System, beziehen Sie dazu als Erstes als Root ein Shell-Skript von der Caddy-Projektwebseite (Listing 1, Zeile 1), geben diesem Ausführungsrechte (Zeile 2) und laden über den Aufruf des Skripts das gewünschte Software-Image herunter (Zeile 3). Zusätzliche Plugins geben Sie im Aufruf als durch Kommas separierte Parameter an (Zeile 4). Die Tabelle “Caddy-Plugins” zeigt eine kleine Auswahl der verfügbaren Erweiterungen.
Listing 1
# wget https://getcaddy.com -O getcaddy # chmod +x getcaddy # ./getcaddy personal # ./getcaddy personal http.ipfilter,http.cache
|
Name des Plugins |
Bedeutung |
|---|---|
|
dyndns |
Dynamisches DNS, etwa via Cloudflare |
|
http.cache |
Caching für HTTP |
|
http.cgi |
Erweiterung um CGI-Skripte |
|
http.expires |
Setzen eines Verfallsdatums |
|
http.git |
Veröffentlichung/Aktualisierung via Git-Kommandos |
|
http.ipfilter |
Zugriff ausgewählter IP-Adressen blockieren |
|
http.webdav |
Erweiterung um WebDAV |
Grundlegendes Setup
Zum Funktionstest legen Sie im aktuellen Verzeichnis der Einfachheit halber eine index.html an, die lediglich aus dem HTML-Header sowie dem Body mit der Überschrift “Hallo Welt” besteht. Danach starten Sie Caddy über das Kommando ./caddy im selben Verzeichnis. Zum Aufruf der Seite im Webbrowser verwenden Sie entweder die IP-Adresse des Hosts oder localhost beziehungsweise 127.0.0.1 und ergänzen die Angabe um die Portnummer 2015, auf der Caddy ohne weitere Einstellungen auf HTTP-Anfragen lauscht (Abbildung 2).
Um den Webserver abzusichern und ihn als Systemdienst einzurichten, legen Sie zunächst einen eigenen Benutzer für Caddy an, dem Sie über den Schalter -rmd das Heimatverzeichnis /opt/caddy/ zuordnen (Listing 2, erste Zeile). Darin befinden sich später auch die Konfigurationsdateien und die realen Inhalte der Webseite.
Listing 2
# useradd -rmd /opt/caddy caddy
# mkdir /opt/caddy/{store,logs,web}
# chown -R caddy: /opt/caddy
Hier legen Sie die drei Unterverzeichnisse store, logs und web an (Listing 2, zweite Zeile). Ersteres enthält unter anderem die SSL-Zertifikate, das zweite die Logfiles des Webservers und das dritte die tatsächliche Webseite. Damit Caddy auch darauf zugreifen darf, übereignen Sie die drei Verzeichnisse dem zuvor angelegten Benutzer caddy (Listing 2, letzte Zeile).
Anschließend kopieren Sie die zuvor angelegte Datei index.html nach /opt/caddy/web/. Caddy benötigt nun noch etwas Hilfe in Form einer Konfigurationsdatei, um die Inhalte zu finden. Den Namen der Konfigurationsdatei wählen Sie frei – im Rahmen dieses Artikels heißt sie /opt/caddy/caddy.config. Darin tragen Sie den Inhalt aus Listing 3 ein; es enthält die Konfiguration für eine einzige Website auf dem lokalen Rechner.
Listing 3
http:// {
root /opt/caddy/web/default
log /opt/caddy/logs/default.log
gzip
}
Zeile 1 kennzeichnet die Bereitstellung via HTTP über Port 80, Zeile 2 das Wurzelverzeichnis der Website und Zeile 3 die zugehörigen Logfiles. In Zeile 4 bindet das Modul Gzip ein, das dafür sorgt, dass Caddy HTML- und Textdateien komprimiert ausliefert. Bei der Leistungsfähigkeit heutiger Systeme verursacht das Komprimieren nur eine minimale Verzögerung, was die damit gesparte Übertragungszeit mehr als ausgleicht.
Möchten Sie mehrere Webdienste auf dem System bereitstellen, legen Sie für jeden davon einen eigenen Block an. In Listing 4 beschreibt der dritte davon einen Webserver, der seine Daten über Port 8080 ausliefert. Dazu genügt die Angabe :8080 hinter dem Domainnamen.
Listing 4
http:// {
root /opt/caddy/web/default
log /opt/caddy/logs/default.log
gzip
}
http://out-of-space.example.net {
root /opt/caddy/web/out-of-space
log /opt/caddy/logs/out-of-space.log
gzip
}
http://on-the-road.example.net:8080 {
root /opt/caddy/web/on-the-road
log /opt/caddy/logs/on-the-road.log
gzip
}
Nun gilt es, Caddy als regulären Dienst einzurichten. Dazu legen Sie bei Systemen mit Systemd einen separaten Eintrag in der Datei /etc/systemd/system/caddy.service an (Listing 5). Im Abschnitt Unit benennen Sie den Dienst und vergeben eine Beschreibung. Der Service-Teil definiert den Benutzer und die Gruppe, die Umgebungsvariablen, die Startparameter, den Umgang bei Neustart des Prozesses sowie die Begrenzungen für die Anzahl der geöffneten Dateien und parallelen Prozesse. Der Abschnitt Install schließlich legt fest, für welches Target beziehungsweise Runlevel der Dienst dann verfügbar ist.
Listing 5
[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/caddy.config -root=/dev/null ExecReload=/bin/kill -USR1 $MAINPID LimitNOFILE=1048576 LimitNPROC=64 [Install] WantedBy=multi-user.target
Über die beiden ersten Kommandos aus Listing 6 starten Sie den zuvor eingerichteten Dienst und prüfen, ob er richtig läuft (Abbildung 3). Danach surfen Sie die Webseite an und prüfen deren Erreichbarkeit. Diesmal lauscht Caddy nicht mehr auf Port 2015, sondern wie für HTTP üblich auf Port 80.
Listing 6
# systemctl enable caddy.service # systemctl status caddy.service # systemctl restart caddy.service

Abbildung 3: Die Statusanzeige von Systemd verrät, dass Caddy wie gewünscht seinen Dienst verrichtet.
Ändern Sie zu einem späteren Zeitpunkt die Konfiguration, gilt es, den Dienst wie in der letzten Zeile von Listing 6 gezeigt neu zu starten, damit er die Änderungen übernimmt. Die grundlegende Einrichtung ist damit abgeschlossen.
Umschalten auf HTTPS
Wie erwähnt glänzt Caddy mit der Integration von Let’s Encrypt zum Etablieren gesicherter HTTPS-Verbindungen. Dazu müssen Sie über eine Domain verfügen. Im zweiten Block aus Listing 4 schreiben Sie in der ersten Zeile http zu https um. Die Zeile 5 kommt noch zum Block hinzu (Listing 7). Über die darin angegebene E-Mail-Adresse informiert Let’s Encrypt Sie über Änderungen im Zertifikat für HTTPS, insbesondere bevor es abläuft und erneuert werden muss.
Listing 7
https://out-of-space.example.net {
root /opt/caddy/web/out-of-space
log /opt/caddy/logs/out-of-space.log
gzip
tls admin@out-of-space.example.net
}
Eine explizite Angabe für HTTP benötigen Sie nicht. Sämtliche Anfragen für dieses Protokoll biegt Caddy automatisch nach HTTPS auf den Port 443 um. Starten Sie nun Caddy neu, verbindet er sich automatisch mit Let’s Encrypt und richtet das passende Zertifikat ein.
Inhalt als Markdown
Viele Webmaster und Webdesigner pflegen beim Erstellen der Webseiten eigene Vorlieben. Mithilfe der Beschreibungssprachen Markdown [7] oder Asciidoc [8] fallen weitere Hürden beim Erstellen der Inhalte weg. Caddy interpretiert Markdown nativ (Abbildung 4). Dessen Einsatz erfordert zwei Dinge: zum einen die Datei der Webseite im Markdown-Format, zum anderen eine zusätzliche Direktive in der Konfiguration von Caddy.

Abbildung 4: Der Texteditor zeigt den Quelltext der Datei index.md in Markdown, dahinter sehen Sie das Browserfenster mit dem daraus gerenderten Text.
Listing 8 enthält in den Zeilen 5 bis 7 den Eintrag markdown, gefolgt von einem / und einem Block in geschweiften Klammern. Caddy interpretiert die Markdown-Erlaubnis für die gesamte Webseite. In Zeile 6 legen Sie fest, welche Namenserweiterungen Caddy akzeptiert, im Beispiel Markdown (.md) und Plaintext (.txt). Zusätzlich verarbeitet Caddy Angaben zu CSS und Javascript sowie individuelle Vorlagen [9].
Listing 8
http:// {
root /opt/caddy/web/default
log /opt/caddy/logs/default.log
gzip
markdown / {
ext .md .txt
}
}
TIPP
Liegt Ihnen eine sichere Verbindung auch für weitere Seiten am Herzen, die Sie im Alltag ansurfen, ist HTTPS Everywhere einen Blick wert: Die von der Electronic Frontier Foundation (EFF) und dem Tor-Projekt entwickelte freie Software schaltet automatisch von einer unsicheren HTTP-Übertragung zu einer verschlüsselten HTTPS-Übertragung um, auch wenn Sie HTTP angesurft haben. Ein grünes Schloss in der Adresszeile signalisiert den Wechsel zur sicheren Übertragung. Allerdings implementieren viele Webseiten auch Inhalte von Drittanbietern, die eventuell kein HTTPS nutzen. HTTPS Everywhere steht für Mozilla Firefox [13] und Google Chrome [14] zur Installation bereit.
Fazit
In unseren Tests lief Caddy sehr flink und zuverlässig. Es war noch nie so einfach, einen sicheren Webserver einzurichten. Das große Plus besteht in der Möglichkeit, Webseiten gleich verschlüsselt im Netz auszuliefern. Dank der modularen Konfiguration präsentiert sich Caddy äußerst flexibel. Daher gibt es von uns fünf von fünf Sternchen für den Webserver.
Die Autoren
Frank Hofmann arbeitet unterwegs, bevorzugt von Berlin, Genf und Kapstadt aus, als Entwickler, Trainer und Autor. Er ist Koautor des Debian-Paketmanagement-Buchs (https://www.dpmb.org/). Mandy Neumeyer lebt seit neun Jahren in Südafrika, arbeitet im Tourismus und baut zurzeit ein zusätzliches Einkommen als digitaler Nomade auf.
Infos
-
Let’s Encrypt: https://letsencrypt.org
-
Caddy: https://caddyserver.com
-
Let’s-Encrypt-Support für Apache: https://github.com/icing/mod_md
-
SSL mit Let’s Encrypt für Nginx: https://www.stewright.me/2017/01/add-ssl-nginx-site-free-lets-encrypt/
-
Let’s Encrypt für IIS: https://weblog.west-wind.com/posts/2016/Feb/22/Using-Lets-Encrypt-with-IIS-on-Windows
-
“How to Host a Website with the Caddy Web Server on Linux”: https://www.booleanworld.com/host-website-caddy-web-server-linux/
-
Asciidoc: Karsten Günther, “Aus einer Quelle”, LU 01/2015, S. 14, https://www.linux-community.de/33893
-
Markdown in Caddy: https://caddyserver.com/docs/markdown
-
RFC 7540: https://tools.ietf.org/html/rfc7540
-
Webseiten optimieren (Teil 3): Frank Hofmann, Gerold Rupprecht, “Expressversand” , LU 01/2016, S. 88, https://www.linux-community.de/35395
-
HTTPS Everywhere (Firefox): https://addons.mozilla.org/de/android/addon/https-everywhere/
-
HTTPS Everywhere (Google Chrome): https://chrome.google.com/webstore/detail/https-everywhere/gcbommkclmclpchllfjekcdonpmejbdp






