Einrichten eines Reverse Proxy‘s unter Docker
- Was ist ein reverse Proxy
- Installation des NGINX Proxy Manager + MariaDB
- Überblick über das User Interface
- Tipps und Tricks
Was ist ein reverse Proxy
Der Proxy stellt einen Vermittler zwischen einer Quelle und einem Ziel da. Dabei kann dieser Vermittler zur Verschleierung der eigenen Identität dienen. Auch wurden Proxys in der Vergangenheit als Cache genutzt, um den Website Aufruf bei mehrfacher Anfrage schneller laden zu können. Heute ist dies durch die schnellere Internetverbindung nicht mehr sehr verbreitet.
Ein reverse Proxy dagegen ist ein häufig im Hintergrund eingesetzter Service. Durch einen reverse Proxy werden mehrere Probleme gelöst. Zum einen muss nicht für jeden Dienst eine eigene IP Adresse existieren und zum anderen können für mehrere Services der gleiche Port genutzt werden (zum Beispiel 443 für mehrere https Websites). Bei der richtigen Adressierung der Services ist der DNS-Name wichtig. Während blog.noweck.info auf die gleiche IP Adresse wie automated.noweck.info verreißt (195.30.84.244), erhält man unterschiedliche Websites. Dies regelt ein reverse Proxy. Auch wird oft ein reverse Proxy eingesetzt, um viele Anfragen auf mehrere Services zu verteilen. Dadurch kann einer Überlastung eines Dienstes vorgebeugt werden. Zudem kann ein reverse Proxy auch SSL/TLS Zertifikate verwalten und so den Datenverkehr für alle dahinter befindlichen Dienste verschlüsseln. Mehr zu SSL/TLS in meinem dazugehörigen Blogeintrag.
Dieses Abbild zeigt einen reverse Proxy (proxy.de) „vor“ einem internen Netzwerk in dem sich drei verschiedene Dienste befinden.
Mit dem folgenden Befehl nslookup unter Linux, macOS und Windows kannst du dir die IP-Adresse einer Domain anzeigen lassen.
friedjof@raspberry:~$ nslookup> blog.noweck.info
Server: 127.0.0.53
Address: 127.0.0.53#53Non-authoritative answer:
Name: blog.noweck.info
Address: 195.30.84.244> automated.noweck.info
Server: 127.0.0.53
Address: 127.0.0.53#53Non-authoritative answer:
Name: automated.noweck.info
Address: 195.30.84.244
Man erkennt also, dass beide Subdomains (blog.noweck.info&automated.noweck.info) auf die selbe IPv4-Adresse (195.30.84.244) verweisen.
Mehr zu nslookup hier auf Wikipedia: https://de.wikipedia.org/wiki/Nslookup
Installation
Als reverse Proxy verwende ich ganz gerne den NGINX Proxy Manager. Dieser braucht zusätzlich eine Datenbank. In meinem Fall habe ich eine MariaDB gewählt. Allerdings würde eine MySQL Datenbank ebenfalls funktionieren.
Da es zu solchen Zwecken üblich ist ein Linux als Betriebssystem für den Server so wählen, werde ich diesen Weg einschlagen. Natürlich kann zu diesem Zweck auch zum Beispiel ein Raspberry Pi 3/4 genutzt werden.
Auch verwende ich Docker. Also das heißt, dass wir den NGINX Proxy Manager und die MariaDB nicht direkt installieren, sondern in einen Container packen. So lässt sich dieses Architektur einmal einfacher verwalten/skalieren oder auch auf andere Server übertragen.
Eine gute Installationsanleitung findet sich auf dem Homepage von Docker: https://docs.docker.com/engine/install/ubuntu/
Auch brauchen wir Docker Compose, welches nicht standardmäßig mit installiert ist.
https://docs.docker.com/compose/install/
Mit Hilfe von Docker Compose brauch man keine Commands im Terminal, sondern kann eine YAML Konfigurationsdatei nutzen. Dies ist sehr nützlich, da man so einfacherer die Konfiguration von Containern überarbeiten kann und diese auch einfach mit anderen teilen kann. Dies werden wir im folgenden angehen.
Nachdem Docker und Docker Compose installiert ist, erstellen wir ein neues Verzeichnis
mkdir docker
In diesem Verzeichnis legen wir eine Datei mit dem Namen docker-compose.yaml an.
nano docker/docker-compose.yaml
Die folgende Konfiguration beschreibt den NGINX Proxy Manager und die MariaDB und kann einfach in die Datei eingefügt werden (natürlich Passwörter ändern).
version: '3'services:
app:
image: 'jc21/nginx-proxy-manager:latest'
ports:
- '80:80'
- '81:81'
- '443:443'
environment:
DB_MYSQL_HOST: "db"
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: "npm"
DB_MYSQL_PASSWORD: "passwort_des_db_users"
DB_MYSQL_NAME: "npm"
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
db:
image: 'jc21/mariadb-aria:latest'
environment:
MYSQL_ROOT_PASSWORD: 'root_passwort_der_db'
MYSQL_DATABASE: 'npm'
MYSQL_USER: 'npm'
MYSQL_PASSWORD: 'passwort_des_db_users'
volumes:
- ./db:/var/lib/mysql
Durch den folgenden Befehl werden die beiden beschriebenen Dienste in zwei fertige Container umgewandelt:
docker-compose up -d
Wahrscheinlich werden jetzt noch die Images der Conteiner vom Docker Hub geladen. Dies kann etwas Zeit in Anspruch nehmen. Im Anschluss daran werden die Container aber automatisch erstellt.
Es könnte sein, dass eine Fehlermeldung auftaucht. Dies könnte daran liegen, dass die Ports 443, 80 oder 81 bereits belegt sind. Wenn möglich kannst du dies Anwendungen hinter diesen Ports stoppen. Es könnte gut sein, dass zum Beispiel ein Apache Webserver noch im Hintergrund den Port 80 oder 443 benutzt. Diesen könntest du auch später hinter den NGINX Proxy Managers hängen.
Doch dem Befehl ls -l ist zu sehen, dass nun auch drei neue Verzeichnisse erstellt wurden.
- In ./data werden die Konfigurationen des NGINX Proxy Managers gespeichert
- In ./letsencrypt werden ggf. SSL/TLS Zertifikate abgelegt
- In ./db sind die Daten der Datenbank zu finden.
Über den Port 81 und der lokalen IP-Adresse gelangst du nun auf die Weboberfläche:
Das standart Login lautet:
Email: admin@example.com
Password: changeme
Eine Übersicht über die Weboberfläche stelle ich in einem weiteren Beitrag vor.
Falls Fragen, Probleme oder Anmerkungen aufkommen, schreibe mir doch eine E-Mail an blog<ät>noweck.info