← Zurück zum Blog

Nginx Proxy Manager: Reverse Proxy mit Web-GUI

4 Min. Lesezeit
NginxReverse ProxyDockerSSLNetzwerk

Nginx Proxy Manager: Reverse Proxy mit Web-GUI

Wer mehrere Dienste im Heimnetz oder auf einem Server betreibt, steht schnell vor dem Problem: Jeder Dienst läuft auf einem anderen Port. http://192.168.1.10:8080 für einen Dienst, :9000 für den nächsten – das ist schwer zu merken und nicht sauber erreichbar von außen.

Nginx Proxy Manager (NPM) löst das: Er leitet Anfragen anhand der Domain auf den richtigen Dienst weiter und stellt automatisch SSL-Zertifikate via Let's Encrypt aus.

Was ist ein Reverse Proxy?

Ein Reverse Proxy sitzt vor deinen Diensten und nimmt Anfragen entgegen. Der Client sieht nur den Proxy – welcher Dienst dahinter steckt, ist ihm egal.

Internet / lokales Netz
        │
        ▼
  Nginx Proxy Manager  ←── Port 80/443
        │
        ├── portainer.deinedomain.de  →  192.168.1.10:9443
        ├── pihole.deinedomain.de     →  192.168.1.10:80
        └── adguard.deinedomain.de    →  192.168.1.10:3000

Warum Nginx Proxy Manager?

  • Web-GUI statt manueller nginx-Konfiguration
  • Automatische SSL-Zertifikate via Let's Encrypt (auch Wildcard)
  • Access Lists – Dienste mit Passwort oder IP-Whitelist schützen
  • Einfache Weiterleitung mit wenigen Klicks
  • Basiert auf dem bewährten nginx

Voraussetzungen

  • Docker und Docker Compose installiert
  • Port 80 und 443 auf dem Host müssen frei sein
  • Für Let's Encrypt: eine öffentlich erreichbare Domain (oder lokale Zertifikate für interne Nutzung)

Installation mit Docker Compose

mkdir ~/npm && cd ~/npm
# docker-compose.yml
services:
  nginx-proxy-manager:
    image: jc21/nginx-proxy-manager:latest
    container_name: npm
    ports:
      - "80:80"
      - "443:443"
      - "81:81"    # Admin-Interface
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    restart: unless-stopped
docker compose up -d

Das Admin-Interface ist unter http://<IP>:81 erreichbar.

Standard-Zugangsdaten:

| Feld | Wert | |------|------| | E-Mail | admin@example.com | | Passwort | changeme |

Nach dem ersten Login werden E-Mail und Passwort geändert.

Ersten Proxy Host anlegen

  1. Im Dashboard auf Proxy Hosts → Add Proxy Host klicken
  2. Domain Names – die Domain/Subdomain eingeben, z.B. portainer.zuhause.local
  3. Forward Hostname / IP – IP des Zieldienstes, z.B. 192.168.1.10
  4. Forward Port – Port des Zieldienstes, z.B. 9443
  5. Schemehttps falls der Zieldienst HTTPS nutzt, sonst http
  6. Optionen:
    • Block Common Exploits – immer aktivieren
    • Websockets Support – bei Bedarf (z.B. für Portainer)
  7. Speichern

SSL-Zertifikat einrichten (Let's Encrypt)

Für öffentlich erreichbare Domains stellt NPM automatisch Let's Encrypt-Zertifikate aus:

  1. Beim Anlegen des Proxy Hosts den Reiter SSL öffnen
  2. Request a new SSL Certificate auswählen
  3. Force SSL und HTTP/2 Support aktivieren
  4. E-Mail-Adresse eingeben
  5. I Agree to the Let's Encrypt Terms of Service bestätigen
  6. Speichern

NPM kümmert sich automatisch um die Erneuerung der Zertifikate.

Wildcard-Zertifikat (DNS-Challenge)

Für interne Dienste (nicht öffentlich erreichbar) kann ein Wildcard-Zertifikat über DNS-Challenge ausgestellt werden. Dafür muss der DNS-Anbieter eine API unterstützen (Cloudflare, Namecheap etc.). Die Konfiguration erfolgt unter SSL Certificates → Add SSL Certificate → Let's Encrypt → DNS Challenge.

Access Lists – Dienste schützen

Nicht alle Dienste sollen öffentlich erreichbar sein. Unter Access Lists lassen sich Listen mit erlaubten IPs oder HTTP Basic Auth anlegen:

  1. Access Lists → Add Access List
  2. Name vergeben, z.B. "Nur lokales Netz"
  3. Unter Allow die erlaubten IP-Bereiche eintragen: 192.168.1.0/24
  4. Beim Proxy Host unter Access List die erstellte Liste auswählen

Tipps für den Homelab-Betrieb

Lokale Domains

Für lokale Dienste ohne öffentliche Domain kann man .local-Subdomains nutzen und diese in Pi-hole oder AdGuard Home mit lokalen DNS-Einträgen auflösen:

  • DNS-Eintrag in Pi-hole: portainer.home192.168.1.10
  • NPM Proxy Host: portainer.home192.168.1.10:9443

NPM im gleichen Netzwerk wie andere Container

Wenn NPM und Zieldienste im gleichen Docker-Netzwerk laufen, kann statt der IP der Container-Name verwendet werden:

services:
  nginx-proxy-manager:
    networks:
      - proxy

  portainer:
    networks:
      - proxy

networks:
  proxy:
    external: true

Im Proxy Host dann als Forward Hostname den Container-Namen eintragen: portainer.

Fazit

Nginx Proxy Manager macht Reverse-Proxy-Konfiguration zugänglich – auch ohne nginx-Kenntnisse. Mit wenigen Klicks sind Dienste sauber über Domains erreichbar und SSL ist kein manueller Aufwand mehr. Für jeden, der mehrere Dienste selbst hostet, ist NPM ein unverzichtbares Tool.

Kommentare