← Zurück zu allen Tutorials

Nginx Reverse Proxy mit SSL

Mehrere Webdienste über einen Nginx Reverse Proxy mit automatischen Let's Encrypt SSL-Zertifikaten absichern – komplett in Docker.

Voraussetzungen

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-proxy

Schritt 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.

Tipp: Mit einem Reverse Proxy kannst du beliebig viele Dienste auf einem Server betreiben – jeder mit eigenem SSL-Zertifikat. Ideal für KVM Server, auf denen du volle Kontrolle über Ports und Netzwerk hast.

Mehrere Projekte auf einem Server?

Unsere KVM Server bieten feste IPs und volle Root-Rechte – perfekt für Reverse-Proxy-Setups.

Server bestellen