Vorwort
Wir mögen nginx als Webserver. Dieser Vorliebe ist es geschuldet, dass wir irgendwann auf unseren VPS‘ (Virtual Private Server), auf denen wir mehrere Anwendungen laufen lassen, auch den Nginx Proxy Manager (NPM) in Betrieb genommen haben. Aus unserer Sicht ist er besonders gut geeignet für diejenigen, die sich nicht lange mit der Konfiguration von Webservern aufhalten und trotzdem sicher diverse Webservices nutzen und/ oder anbieten wollen.

Was macht so ein Proxy überhaupt?
Wer mehr als einen Webservice unter einer öffentlichen IP-Adresse verfügbar machen möchte, kommt um eine vernünftige Konfiguration des Webservers nicht herum. Und weil das ziemlich kompliziert und unübersichtlich werden kann, nutzen wir mittlerweile den Nginx Proxy Manager sehr gerne. Er sitzt quasi zwischen Nutzenden und der einzelnen Anwendung und weist die Anfragen den jeweiligen internen Diensten zu.
Ein Beispiel: ein Server hat die öffentliche IP-Adresse 12.347.567.89 und auf dem Server laufen eine Webseite für einen Shop (an Port 85) und eine für ein Photoprojekt (an Port 90). Die öffentliche IP-Adresse ist sozusagen Straße und Hausnummer und die Ports entsprechen dann den Wohnungen im Gebäude. NPM wäre hier eine Art Concierge.
Kommt nun jemand ins Haus und fragt nach dem Shop, weist der Portier den Weg zu Wohnung 85. Ruft also jemand die Webseite shop.meine.domain wird NPM die Anfrage an den Dienst unter Port 85 weiterleiten und eine Anfrage an photo.meine.domain an den Dienst unter Port 90.
Weitere Features
NPM übernimmt aber nicht nur das Proxying. Der Dienst kann sich auch um Fragen der Sicherheit kümmern. Zum Beispiel nutzt es SSL-Zertifikate von Let’s Encrypt, um die Kommunikation mit den Diensten abzusichern und zu verschlüsseln oder Webseiten bspw. mit Zugangsdaten zu versehen. Und all diese Funktionalitäten „übersetzt“ NPM in eine moderne, grafische Benutzeroberfläche.
Installation
Wir nehmen hier NPM als Docker-Container unter Linux Debian 12 in Betrieb. In diesem Beitrag haben wir uns bereits mit Docker beschäftigt und wie es installiert wird. Darauf bauen wir hier auf.
Wir haben uns so organisiert, dass wir unsere Dienste im Verzeichnis /opt anlegen und uns so strukturieren. Also mit dem Server via SSH verbinden (ssh root@server-ip -p22) und dann das Verzeichnis erstellen und hineinwechseln:
mkdir /opt/nginx-proxy-manager
cd /opt/nginx-proxy-manager
Nun erstellen wir die Steuerungsdatei docker-compose.yml
nano docker-compose.yml
… und kopieren den folgenden Code in die leere Datei. In diesem Beispiel definieren wir gleich ein Netzwerk (shared_proxy) mit. Das wird später bei uns benötigt, weil wir wollen, dass verschiedene Dienste sich sehen und untereinander miteinander kommunizieren können sollen.
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: always
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- /opt/nginx-proxy-manager/data:/data
- /opt/nginx-proxy-manager/letsencrypt:/etc/letsencrypt
networks:
- shared_proxy
networks:
shared_proxy:
external: true
Setzen wir nun den folgenden Befehl ab, wird der Proxy Manager installiert und gestartet:
docker compose up -d
Unter der Adresse http://SERVER-IP:81 wird der Dienst jetzt verfügbar.

Die Erstanmeldung gelingt mit admin@example.com und als Passwort changeme.
Sicherheit
In der Firewall des Hosters öffnen wir die Ports 80 und 443 (TCP). Mit diesen arbeitet NPM nach und von extern.
Es wäre technisch möglich, sich diesen Dienst öffentlich verfügbar zu machen (s. Bild). Empfehlen mögen wir das nicht einfach so. Würde dieser Dienst in falsche Hände fallen, könnte Verkehr umgeleitet, mitgelesen, neue Zugänge geöffnet oder Datenabflüsse ermöglicht werden uvm..
Wenn aber doch öffentlich betrieben, dann den Account ordentlich absichern. Ab v2.13.6 (01/2026) ist im NPM der Login mit einem 2. Faktor (2FA) möglich, deren Einrichtung und Nutzung wir als verpflichtend ansehen.
Es sollte aber noch einen Schritt weiter gegangen werden, weil Docker die Firewall (z.B. UFW) umgeht und die eigenen Regeln direkt in die darunterliegende iptables schreibt. Port 81 bleibt damit trotz blockierender Firewall-Regel von außen erreichbar – unverschlüsselt und ohne 2FA.
Daher sollte dann in der ersten Session NPM als eigener Proxy Host eingerichtet werden. Dazu Hosts -> Proxy Hosts -> Add Proxy Host anklicken:

Im jetzt offenen Modal die beiden Reiter Details und SSL entsprechend dieser Übersicht befüllen:
| Feld | Wert |
|---|---|
| Domain Names | npm.meine-domain.com |
| Scheme | http |
| Forward Hostname / IP | localhost |
| Forward Port | 81 |
| Block Common Exploits | ✅ aktivieren |
| Websockets Support | ✅ aktivieren |
| Feld | Wert |
|---|---|
| SSL Certificate | Request a new SSL Certificate |
| Force SSL | ✅ aktivieren |
| HTTP/2 Support | ✅ aktivieren |
| HSTS Enabled | ✅ aktivieren |
| HSTS Sub-domains | ✅ aktivieren |
Mit Save speichern. NPM beantragt jetzt automatisch ein kostenloses SSL-Zertifikat über Let’s Encrypt für unseren Host.

Diese Verbindung gilt es nun zu testen. Domain https://npm.meine-domain.com aufrufen. Wenn das – wie erwartet – funktioniert, geht es an die Anpassung der /opt/nginx-proxy-manager/docker-compose.yml. Die Zeile zu Port 81 wird jetzt lokal gebunden:
- '127.0.0.1:81:81'
Mit dieser Anpassung lauscht Port 81 ausschließlich lokal. Das Adminpanel ist dann nur noch über die hinterlegte Domain erreichbar – mit SSL, 2FA und optional einer Access List, die den Zugang auf bestimmte IP-Adressen beschränkt. NPM schützt sich damit selbst. Nach der Änderung NPM neu starten:
cd /opt/nginx-proxy-manager
docker compose restart
Installations-Skript
Wir stellen auch ein Installations-Skript via Github zur Verfügung. Mit nur eine Zeile Code interaktiv zur eigenen NPM-Instanz:
bash <(curl -fsSL https://raw.githubusercontent.com/nephilim75/scripts/main/nginx-proxy-manager/install/install-npm.sh)
Haftungsausschluss & Risikohinweis
Alle Anleitungen auf diesem Blog werden mit großer Sorgfalt erstellt. Das Nachmachen erfolgt jedoch immer auf eigene Gefahr. pc-fee.com übernimmt keine Garantie für die Richtigkeit und Vollständigkeit oder Haftung für entstandene Schäden. Backups vor geplanten Änderungen sind Pflicht.

