Zum Hauptinhalt springen

Caddyserver

Caddyserver ist ein in GO programmierter, mächtiger Open-Source-Webserver mit automatischem HTTPS-Support. Wir sind uns sicher, dass Caddyserver in den kommenden Jahren mehr und mehr an Beliebtheit gewinnen und Verbreitung finden wird.

Einmal installiert kümmert sich Caddy automatisch um die Aktualisierung des kostenlosen SSL-Zertifikats. Sie müssen dafür überhaupt nichts extra konfigurieren.

Open2C ist problemlos mit Caddyserver auf entsprechenden Servern mit optimiertem PHP-Setup lauffähig.

Vorraussetzung

Caddy hat erstklassigen Support für die Integration eines PHP-FPM-Setups mit der php_fastcgi Direktive.

In der folgenden Beispielkonfiguration gehen wir wie folgt vor:

  • (A) wir machen den Zugriff auf bestimmte Dateien oder Verzeichnisse unmöglich, in dem wir ein "Nicht gefunden" zurückliefern (Sicherungen, Konfigurationsdateien, Editor-Backupfiles, temporäre Ordner). In einem Apache-Setup würde dies über .htaccess-Anweisungen erledigt
  • (A2) zeigt eine Möglichkeit, PHP-Requests auf bestimmte Verzeichnisse aus Sicherheitsgründen nicht an PHP-FPM weiterzureichen. Dazu wird eine Regel definiert (ein Matcher)
  • (B) PHP lauscht auf dem Beispiel-Server auf Port 9000 und nimmt nur Anfragen vom Server selbst (127.0.0.1) entgegen, sofern ein Match vorliegt (siehe A2)
  • (C) wichtig: wir setzen die Umgebungsvariable URLREWRITE auf YES: Open2C aktiviert dann das Feature der sprechenden Pfade bzw. Slugs
  • (D) Unterstützung für das Open2C-Hash-Cache-Feature: Statische Dateien erhalten einen dynamischen Dateinamen, der solange gleich bleibt, bis sich die Datei ändert. Ermöglicht ein beliebig langes Caching und damit geringer Datenübertragung und höhere Performance
  • die anderen Direktiven wie file_server, encode oder header dienen der Auslieferung statischer Dateien, der Datenkomprimierung oder der Sicherheit
  • (E) aus Performance-Gründen ist es immer sinnvoll, den Expires-Header für bestimmte Dateien zu setzen. Hier ein Beispiel, wie das mit Caddy gemacht werden kann

Beispielkonfiguration


(hashcache) {
# (D) Do rewrites for the Open2C Hash-Cache-Feature!
# works with Caddy 2.5.2+
map {path} {uncached} {uncachedbool} {
~(?i)(/backend/static|/backend/mat|/images|/imageshows|/mat|/plugins|/static|/themes)(/.*)\.([a-z0-9]{8,40})\.([a-zA-Z0-9]+)$ "${1}${2}.${4}" "yep"
default "nope"
}
@uncached_map expression `{uncachedbool} == "yep"`
rewrite @uncached_map {uncached}
}

# (E)
(expiresOpen2C) {
@matchExpiresOneMonth {
file
path *.css *.js *.woff *.woff2 *.ttf *.otf
}
header @matchExpiresOneMonth Cache-Control max-age=2592000
@matchExpiresTenDays {
file
path *.png *.gif *.jpg *.jpeg *.svg *.ico
}
header @matchExpiresTenDays Cache-Control max-age=864000
}

www.example.com {
root * /var/www/html

# (A)
@disallowed {
path *.sql
path *~
path *.tgz
path *.tar.gz
path *.sav
path *.ini
path *.git
path /config/*
path /continuity/*
path /inc/*
path /storage/*
path /lib/schema/*
path /lib/templates/*
path /files/*
path /tmp/*
}
respond @disallowed "Not found" 404

# (A2)
@allowedOpen2C {
not path /tmp/*
not path /storage/*
not path /images/*
not path /imageshows/*
not path /config/*
not path /continuity/*
}

encode zstd gzip

# php_fastcgi
#
# Various options available, see
# https://caddyserver.com/docs/caddyfile/directives/php_fastcgi
#
# (B)
php_fastcgi @allowedOpen2C 127.0.0.1:9000 {
# important hint for Open2C and the Slugs feature!
# (C)
env URLREWRITE YES
}

route {
import hashcache
import expiresOpen2C
}

file_server {
hide README.md LICENSE .htpasswd .htaccess
}

# Set headers related to security, for example:
header {
# disable clients from sniffing the media type
X-Content-Type-Options nosniff

# clickjacking protection
X-Frame-Options sameorigin
Content-Security-Policy "frame-ancestors 'self';"

# send the full URL to requests to the same origin
Referrer-Policy same-origin
}
}