nginx

nginx ist ein reverse proxy und Webserver. Er eignet sich sehr gut dafür, eingehende Verbindungen im eigenen Netzwerk zu verteilen, so dass nach außen die internen Hostnamen und die benutzten Ports sichtbar sind.

Das Problem mit den Ports

Auf jedem Raspberry Pi kann ein Port einmal für einen Docker Container benutzt werden. Besonders die Ports 80 und 443 (HTTP und HTTPS) sind für die Web-Oberflächen der Container wichtig. Da diese dann umgemappt werden, z.B. 80 auf 8082, ist diese ein Angriffsvektor für die bösen Buben im Netz, da sie über den benutzten Port u.U. auf die verwendete Software schließen können und deren Sicherheitslücken ausnutzen.
Mit nginx stellst du über Proxy Hosts einen Service zu Verfügung, der zwischen deiner Anwendung und dem Internet steht.

Datenbank einrichten

Der nginx Proxy Manager speichert eine Datenbank, diese legen wir jetzt in mariadb an. Log dich mit dem maridb-client als root ein und führe die folgenden Kommandos aus. Für <passwort> setzt du dein eigenes sicheres Passwort ein.

create user npm identified by '<passwort>';
create database npm;
grant all privileges on npm.* to npm;
flush privileges;

Jetzt haben wir einen User und eine Datenbank mit den Zugriffsrechten für den User npm.

Installation in Docker

Der Installationsprozess entscheidet sich nur wenig von denen von Pi-Hole, mariadb oder gitea.Wie üblich benötigst du zwei Verzeichnisse außerhalb des Containers.

sudo mkdir /opt/nginx
sudo mkdir /opt/letsencrypt

Das erste ist das Hauptverzeichnis für nginx, im zweiten speichert Let’s Encrypt die SSL-Zertifikate

Das docker-compose.yml für den nginx kannst du mit docker-compose up -d wie üblich starten, du musst lediglich den Hostnamen deines Datenbankservers eintragen und das Passwort wie oben angeben.

version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    container_name: nginx
    restart: unless-stopped
    ports:
      - '84:80'
      - '81:81'
      - '443:443'
    environment:
      TZ: 'Europe/Berlin'
      DB_MYSQL_HOST: "database"
      DB_MYSQL_PORT: "3306"
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "<passwort>"
      DB_MYSQL_NAME: "npm"
    volumes:
      - /opt/nginx:/data
#      - /opt/nginx-etc:/etc
      - /opt/letsencrypt:/etc/letsencrypt

nginx benötigt drei Ports: 80 für HTTP, 81 für den Nginx Proxy Manager (die Admin GUI) und 443 für HTTPS Verbindungen.

nginx als reverse Proxy

Diagramm nginx als reverse Proxy
Diagramm nginx als reverse Proxy

Als die Grundlagen des Internets geschaffen wurden, geschah dies unter der Maßgabe, dass es pro Server ein TCP Port von einem Service belegt werden kann. Deshalb kannst du gitea und Grafana nur auf einem Raspberry Pi betreiben, wenn du bei einem der beiden den verwendeten Port 3001 extern auf Port 3001 umwandelst. Wenn du vom Internet auf dein Heimnetz zugreifen möchtest, ist eine schlechte Idee, diese Ports nach außen freizugeben. nginx löst dieses Problem, in dem er alle Zugriffe über den HTTPS Port 443 anhand der angegebenen Subdomain auf die Services verteilt.

Konfiguration

Nach Erzeugen des Containers loggst du dich über deinen Browser in die Admin Oberfläche ein "http://<hostname>:81„. Als Usernamen benutzt du admin@example.com und als Passwort „changeme„. Der Aufforderung zu Passwortänderung solltest du als erstes nachkommen. Du solltest auch einen neuen User mit Admistratorenrechten anlegen, da vorgegebenen Logindaten überall im Netz bekannt sind.

Login Maske
Login Maske
Dialog Benutzer anlegen
Dialog Benutzer anlegen

Proxy-Host anlegen

Wir konfigurieren hier mal den Proxy-Host für gitea.gitea läuft. Im Nginx Proxy Manager klickst in der Menüleiste auf Hosts und dann auf Proxy Hosts. Danach klickst du auf „Add Proxy Host“ und du kommst in diesen Dialog:

Dialog "Add Proxy Host"
Dialog „Add Proxy Host“

Hier trägst du folgende Werte ein: „Domain Names“ ist die Domain, unter der dein Server von außen erreichbar ist, z.B. „rasgpithekgit.srv64.de“ für den gitea Server, auf dem die Codeschnipsel aller Blog-Posts liegen. „Scheme“ lässt du auf HTTP, wir lassen nginx im nächsten Schritt ein SSL-Zertifikat für den Service erzeugen. Bei „Forward Hostname/IP“ kommt der Name oder die IP des Raspis rein, der gitea bereitstellt. „Port“ ist dann 3000 für gitea, wenn es nicht umgemappt ist.

SSL-Zertifikat erzeugen

Dialog zur Erzeugung eines neuen SSL-Zertifikats
Dialog zur Erzeugung eines neuen SSL-Zertifikats

nginx kann für dich ein Let’s Encrypt SSL-Zertifikat für die verschlüsselte HTTPS Verbindung erzeugen und verwalten. Dafür ist es unbedingt notwendig, dass in deinem Access Point Port 80 für nginx freigegeben ist, da Let’s Encrypt darüber in der sogenannten Challenge die Gültigkeit des Domainnamens prüft(ich habe lange gebraucht, bis ich das begriffen habe). Alles, was du konfigurieren musst, ist in der Registerkarte „SSL“ bei Certificate „Request New“ auswählen (du kannst auch ein bereits bestehendes Zertifikat auswählen, das hab ich aber noch nicht ausprobiert). Ich aktiviere zusätzlich auch immer die Optionen „Force SSL“ und „HTTP/2 Support“. Die eMail Adresse benötigt Let’s Encrypt, um dir mitzuteilen, dass das Zertifikat verfällt. Dann bestätigst du noch, dass du mit den Nutzungsbedingungen einverstanden bist und klickst auf „Save“. Let’s Encrypt erzeugt dir nun innerhalb von nginx ein neues Zertifikat und du kannst deinen Server über HTTPS aufrufen

Zertifikat erfolgreich erzeugt
Zertifikat erfolgreich erzeugt

Weitere Einsatzmöglichkeiten von nginx

nginx kann nicht nur als reverse Proxy eingesetzt werden. Er dient auch als Webserver und Load Balancer. Das hier noch zu erklären, würde den Post definitiv zu lang machen.

Die docker-compose.yml Datei sowie auch alle anderen kannst du mit

git clone https://raspithekgit.srv64.de/raspithek/homeserver

von meinem GIT Server herunterladen. Der läuft genau so wie in diesem Post beschrieben auf meinem Raspberry Pi.

Schreibe einen Kommentar

Cookie Consent Banner von Real Cookie Banner