Nginx Reverse Proxy mit SSL
Mehrere Webdienste über einen Nginx Reverse Proxy mit automatischen Let's Encrypt SSL-Zertifikaten absichern – komplett in Docker.
Voraussetzungen
- Linux Server (Ubuntu 22.04/24.04 empfohlen)
- Domain mit DNS A-Record auf die Server-IP
- Root- oder sudo-Zugang (Docker wird in Schritt 1 installiert)
- Ports 80 und 443 aus dem Internet erreichbar (in der Firewall freigeben)
Schritt 1: Docker installieren
# Docker installieren (offizielle Methode) curl -fsSL https://get.docker.com | sh sudo usermod -aG docker $USER # Aus- und wieder einloggen, damit die Gruppenänderung greift # Docker Compose Plugin prüfen docker compose version
Schritt 2: Projektstruktur anlegen
mkdir -p ~/reverse-proxy/{nginx/conf.d,certbot/{conf,www}}
cd ~/reverse-proxySchritt 3: Docker Compose erstellen
# docker-compose.yml
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./certbot/conf:/etc/letsencrypt
- ./certbot/www:/var/www/certbot
restart: unless-stopped
certbot:
image: certbot/certbot
volumes:
- ./certbot/conf:/etc/letsencrypt
- ./certbot/www:/var/www/certbot
entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h; done'"Schritt 4: Reine HTTP-Konfiguration für die ACME-Challenge
Nginx startet nicht, wenn eine Konfiguration auf Zertifikatsdateien verweist, die noch nicht existieren. Starte deshalb zunächst nur mit Port 80 – das reicht, damit Let's Encrypt deine Domain prüfen kann:
# nginx/conf.d/default.conf
server {
listen 80;
server_name deine-domain.de;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 200 'ok';
}
}# Nginx starten (vorerst nur Port 80) docker compose up -d nginx # Prüfen: sollte "ok" liefern curl http://deine-domain.de
Schritt 5: SSL-Zertifikat anfordern
# Zertifikat über das Webroot des laufenden Nginx ausstellen docker compose run --rm --entrypoint certbot certbot certonly \ --webroot -w /var/www/certbot \ -d deine-domain.de \ --email deine@email.de \ --agree-tos --no-eff-email # Prüfen: die Zertifikatsdateien existieren jetzt sudo ls certbot/conf/live/deine-domain.de/
--entrypoint certbot ist nötig, weil die Compose-Datei den Entrypoint des certbot-Service durch die Erneuerungsschleife ersetzt.
Schritt 6: HTTPS und Reverse Proxy aktivieren
Erst jetzt, da das Zertifikat existiert, ersetzt du die default.conf durch die vollständige Konfiguration. Ersetze dein-dienst:3000 durch Service-Namen und Port deiner Anwendung (der Container muss im selben Compose-Projekt bzw. Docker-Netzwerk laufen).
# nginx/conf.d/default.conf
server {
listen 80;
server_name deine-domain.de;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name deine-domain.de;
ssl_certificate /etc/letsencrypt/live/deine-domain.de/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/deine-domain.de/privkey.pem;
location / {
proxy_pass http://dein-dienst:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}# Konfiguration testen, dann Nginx neu laden docker compose exec nginx nginx -t docker compose exec nginx nginx -s reload # certbot-Container für die automatische Erneuerung starten docker compose up -d certbot
Der certbot-Container prüft alle 12 Stunden, ob das Zertifikat erneuert werden muss. Ein erneuertes Zertifikat verwendet Nginx erst nach einem Reload – führe den Reload-Befehl oben daher regelmäßig aus, z. B. wöchentlich per Cron.
Mehrere Projekte auf einem Server?
Unsere KVM Server bieten feste IPs und volle Root-Rechte – perfekt für Reverse-Proxy-Setups.
Server bestellen