Zum Inhalt springen

Nginx Reverse‑Proxy Stack - TLS, Caching, Statistik und AVIF/WebP on the fly

Aus LHlab Wiki
NGINX Logo

Hier findet ihr einen kompletten nginx Reverse Proxy Stack, basierend auf docker compose. Er bringt imgproxy (Bilderproxy), certbot für letsencrypt (SSL/TLS Zertifikate)und goaccess (Web-Statistik) und eine gute Basiskonfiguration für alle Dienste mit.

Features

TLS-Automatisierung (Let’s Encrypt / Certbot)

  • Webroot HTTP‑01-Challenge über einen dedizierten Speicherort /.well-known/acme-challenge/.
  • Einmaliges Ausstellungs-Skript aus einer domains.list-Datei (ein Zertifikat pro Zeile).
  • Sichere Verlängerungen (kein Stoppen von Nginx erforderlich) und Dry-Run-Unterstützung.
  • Bereit für OCSP-Stapling (vorbehaltlich der Verfügbarkeit der OCSP-URL des CA-Zertifikats).

Hardened Reverse-Proxy

  • HTTP/2, SNI und strenge Sicherheitsheader (HSTS, X‑Content‑Type‑Options usw.).
  • Klare Trennung über includes/ für Sicherheitsheader, Caching, Certbot und Upstream-Maps.
  • ENV-gesteuerte Backend-Zuordnung, sodass TEST/PROD-Wechsel minimal sind.

Intelligente Bildbereitstellung mit imgproxy

  • Inhaltsaushandlung: AVIF → WebP → PNG/JPEG-Fallback basierend auf „Accept“.
  • Langlebiger, unveränderlicher Cache mit variantenbewussten Cache-Schlüsseln.
  • Failover: Wenn imgproxy nicht verfügbar ist, greift Nginx auf die Original-Miniaturansichten zurück.
  • SVG-Passthrough (keine versehentliche Rasterkonvertierung).

Echtzeit-Analysen mit GoAccess

  • Verwendet ein einziges virtuelles Host-bewusstes Zugriffsprotokoll (Analysen pro virtuellem Host).
  • Echtzeit-HTML-Dashboard über WebSockets, die unter `/ws` proxied werden.
  • Basic Auth auf dem Statistik-vHost; WS-Endpunkt mit einem Origin-Gate auf die Whitelist gesetzt.
  • Benutzerdefinierte Bot-Liste und Referrer-Filter, um „Unique Visitors” korrekt zu halten.
  • Persistente Datenbank, damit historische Statistiken auch nach einem Neustart des Containers erhalten bleiben.

Protokollierung inkl. Rotation

  • Vereinheitlichte access_all.log
  • logrotate sidecar mit copytruncate für Rotation ohne Ausfallzeiten.
  • Größen-/zeitbasierte Aufbewahrung mit Komprimierung.

Schnellstart

Um den Stack zu nutzen, klont euch am besten das gesamte GitHub Repository.

cd /opt
git clone https://github.com/alaub81/nginxproxy.git
cd nginxproxy

Dann einfach alle example Konfigurationen kopieren und nach euren Wünschen anpassen:

# Environment
cp .env.example .env

# Nginx vhosts & includes
cp -r data/nginx/conf.d/global.conf.example data/nginx/conf.d/global.conf
cp -r data/nginx/conf.d/stats.example.com.conf.example data/nginx/conf.d/<stats.example.com.conf>
cp -r data/nginx/conf.d/www.example.com.conf.example data/nginx/conf.d/<www.example.com.conf>
cp -r data/nginx/conf.d/includes/certbot.conf.example data/nginx/conf.d/includes/certbot.conf
cp -r data/nginx/conf.d/includes/security-headers.conf.example data/nginx/conf.d/includes/security-headers.conf
cp -r data/nginx/conf.d/includes/site-defaults.conf.example data/nginx/conf.d/includes/site-defaults.conf
cp -r data/nginx/conf.d/includes/ssl.conf.example data/nginx/conf.d/includes/ssl.conf

# Certbot webroot & config (persisted)
mkdir -p data/letsencrypt/{conf,webroot,lib,logs}

# GoAccess config & dashboards
cp data/goaccess/goaccess.conf.example data/goaccess/conf/goaccess.conf
cp data/goaccess/browsers.list.example data/goaccess/conf/browsers.list

# Logrotate sidecar config
cp data/logrotate/nginx-acccess.example data/logrotate/conf/nginx-access

wenn alles soweit konfiguriert ist, startet den Stack:

docker compose up -d

Hinweis: Solltet ihr schon einen SSL vHost konfiguriert haben und noch keine Zertifikate haben, müsst ihr zuerst die Zertifikate erstellen.

SSL Zertifikat erstellen

Wenn der Stack läuft und ihr in eurem Standard vHost die certbot.conf inkludiert habt, dann konfiguriert einfach die Datei issue-from-list.sh

...

# === Konfig ===
# Email for registration with Let’s Encrypt
EMAIL="<yourname@domain.tld>"
# Webroot path for validation (must match the Nginx setup)
WEBROOT="/data/letsencrypt"
# Let’s Encrypt Staging true/false
STAGING=true
# Dry run true/false
DRYRUN=true
# If you are working in Docker, set:
# CERTBOT_BIN='docker compose run --rm certbot certbot'
CERTBOT_BIN="docker compose exec -T certbot certbot"
# Optional: Nginx reload after successful run (leave blank to skip)
# uncomment the following line to enable reload
#RELOAD="docker compose exec nginx nginx -t && docker compose exec nginx nginx -s reload"

...

für einen ersten Testlauf, lasst STAGING=true und DRYRUN=true - danach beides auf false Legt nun eine Datei Namens domains.list an, in der ihr all eure Domains die ihr via SSL Verfügbar machen wollt eintragt. Hier wird für jede Zeile ein eigenes Zertifikat erstellt. Ihr könnt die Domains im Zertifikat mit Leerzeichen trennen.

example.com www.example.com
stats.example.com
example.org www.example.org blog.example.org

Dann startet ihr den Ausstellungs- Vorgang einfach so:

chmod +x issue-from-list.sh
./issue-from-list.sh domains.list

danach einfach den nginx Neustarten, solltet ihr es nicht im Script vorher aktiviert haben.

RELOAD="docker compose exec nginx nginx -t && docker compose exec nginx nginx -s reload"

GoAccess

GoAccess bietet eine schnell einzurichtende Webserver Statistik. Der Stack hier bringt bereits mit den beiden Konfigurationsdateien (browsers.list und goaccess.conf) eine gute Alltagstaugliche Konfiguration mit. Ihr solltet dann einen vHost einrichten um GoAccess nach draußen zu publizieren. Nehmt dafür die stats.example.com.conf und passt hier eure Domain an. Generiert auch dafür wieder ein Zertifikat. Ihr erreicht eure Statistik dann über den neu angelegten vHost.

Eine Super Dokumentation zu GoAccess könnt ihr hier finden:

Basic Auth Passwort Datei anlegen

Dafür werden wir das Apache-HTTP-Docker-Image verwenden und die .htpasswd-Datei mit diesem Container generieren, da der nginx Container kein htpasswd-Binärdatei installiert hat.

# Zum ersten Mal, um die .htpasswd-Datei zu erstellen
docker run --rm -it \
  -v $(pwd)/data/nginx/conf.d/:/work \
  httpd:2-alpine \
  htpasswd -c /work/.htpasswd <username>

# ohne -c, um Benutzer anzuhängen
docker run --rm -it \
  -v $(pwd)/data/nginx/conf.d/:/work \
  httpd:2-alpine \
  htpasswd /work/.htpasswd <username>

# nicht interaktiv, fügen Sie -c hinzu, wenn Sie eine neue Datei erstellen möchten
docker run --rm \
  -v $(pwd)/data/nginx/conf.d/:/work \
  httpd:2-alpine \
  htpasswd -b /work/.htpasswd <username> <password>

Weiteres...

Alle weiteren Infos findet ihr im Repository: