🌐 Webserver-Nginx (.132)

Diese Doku beschreibt den nginx-Webserver auf VM 192.168.178.132, der interne Doku-Websites ausliefert und die DNS-Updates für ipv64.net per Cron triggert.

ℹ️ Rolle der VM:
• Hostet interne Dokumentations-Websites (Infrastruktur Riesling, Geno50, Linux-Cheatsheet)
• Triggert tägliche DNS-Updates damit die rusti.ipv64.net-Subdomains auf die aktuelle Heim-IP zeigen
• Standalone Ubuntu-LXC, kein direkter Bezug zu den Apps auf .122
Stand: 24. Mai 2026

System-Daten

OS
Ubuntu 24.04 LTS
RAM
2 GB
Disk
25 GB (3% benutzt)
CPU
4 Kerne
IP
192.168.178.132
Hostname
Webserver-nginx

Dienste & Ports

PortDienstInhaltSchutz
22 SSH Admin-Zugang Key/PW
80 nginx default /var/www/html/ Standardseite nur /admin per Passwort
84 nginx Riesling Infrastruktur komplett mit Passwort
85 nginx Geno50 Infrastruktur komplett mit Passwort
86 nginx Linux-Zusammenfassung komplett mit Passwort
💡 Sicherheit: Alle Doku-Sites (84/85/86) sind seit dem Fix vom 24.05.2026 komplett mit HTTP-Basic-Auth gesichert. Vorher gab es einen Bypass: ein location-Block mit Tippfehler schützte nur die falsche URL.

Websites

Verzeichnis-Struktur

/var/www/html/
├── admin/                       # passwortgeschützer Admin-Bereich (Port 80)
├── infrastruktur-riesling/      # → Port 84
├── infrastruktur-geno50/        # → Port 85
├── linux-zusammenfassung/       # → Port 86
├── index.nginx-debian.html      # Default-Welcome
└── index.nginx-debian-alt.html  # Backup-Variante

Server-Konfig im Detail

Alle Sites sind in einer einzigen Datei konfiguriert:

/etc/nginx/sites-enabled/default
EintragServer-NameRealm
Port 80 (default)_"admin area"
Port 84rieslinginfrassc.net"Riesling Infrastruktur"
Port 85geno50sc.net"Geno50 Infrastruktur"
Port 86linux.rusti.ipv64.net"Linux Doku"

DNS-Updates (ipv64.net)

Vier Cron-Skripte rufen täglich morgens DNS-Update-URLs von ipv64.net auf, damit die rusti-Subdomains auf die aktuelle Heim-IP zeigen.

ZeitSkriptAktualisiert
05:30websites1-upd-cronjob.shAbos · Doki
05:45websites2-upd-cronjob.shNetData · UptimeKuma · Bookstack
06:00websites3-upd-cronjob.shLinux mit System · Nextcloud · Riesling Infra
06:30websites4-upd-cronjob.shGeno50 Zeiten · Risikomanagement · Infra-Diagramm
⚠️ Sicherheit: Die Update-URLs enthalten ipv64-Tokens. Skripte haben darum bewusst restriktive Permissions: websites1 ist -rwx------ (nur root).
Beim Editieren niemals chmod ändern!

Nginx-Config prüfen & neu laden

1 Syntax prüfen (ohne Reload!)
nginx -t
Erwartet: syntax is ok + test is successful
2 Reload (Apply ohne Downtime)
systemctl reload nginx
3 Status checken
systemctl status nginx --no-pager
⚠️ Wichtig: Backup-Dateien NIE in /etc/nginx/sites-enabled/ ablegen! nginx liest alle Dateien dort — Backup mit listen 80 default_server löst "a duplicate default server"-Fehler aus. Backups in /root/ oder /etc/nginx/backups/ ablegen.

Passwort ändern

Die HTTP-Basic-Auth-Passwörter liegen verschlüsselt in:

/etc/nginx/.htpasswd

Neuen Benutzer anlegen

# htpasswd installiert? Falls nein:
apt install apache2-utils

# Neuen User anlegen (Passwort wird interaktiv abgefragt)
htpasswd /etc/nginx/.htpasswd admin

# Weiteren User hinzufügen (kein -c!)
htpasswd /etc/nginx/.htpasswd zweiter-user
🚨 Niemals -c bei bestehender Datei! Das -c-Flag legt die Datei neu an und löscht alle bestehenden Benutzer.

User löschen

htpasswd -D /etc/nginx/.htpasswd alter-user

Neue Website auf eigenem Port

Beispiel: Website auf Port 87 hinzufügen.

1 Verzeichnis anlegen
mkdir -p /var/www/html/neue-website
echo "<h1>Test</h1>" > /var/www/html/neue-website/index.html
2 Server-Block in default einfügen
# Vor der schließenden Klammer der letzten Server-Sektion einfügen:
server {
    listen 87;
    listen [::]:87;
    server_name beispiel.intern;
    root /var/www/html/neue-website;
    index index.html;

    auth_basic "Beispiel-Site";
    auth_basic_user_file /etc/nginx/.htpasswd;

    location / {
        try_files $uri $uri/ =404;
    }
}
3 Test & Reload
nginx -t && systemctl reload nginx
4 Firewall (falls aktiv)
ufw allow 87/tcp 2>/dev/null  # falls UFW läuft

Logs prüfen

BefehlZweck
tail -f /var/log/nginx/access.log Live alle Zugriffe
tail -f /var/log/nginx/error.log Live alle Fehler
journalctl -u nginx --since "1 hour ago" Systemd-Logs von nginx
journalctl -u cron --since today Cron-Aktivitäten

DNS-Updates — Wie funktioniert's

Jedes Skript enthält ein Array urls=() mit ipv64.net-Update-URLs. Jede URL hat ein geheimes Token und gehört zu einer bestimmten Subdomain.

urls=(
    "https://ipv64.net/update.php?key=XXXXX&domain=abos.rusti.ipv64.net"
    "https://ipv64.net/update.php?key=YYYYY&domain=doki.rusti.ipv64.net"
    # ...weitere
)

for url in "${urls[@]}"; do
    curl -sS "$url" >/dev/null
done

Curl ruft jeden URL auf. ipv64.net schaut auf die Source-IP der Anfrage (die externe Heim-IP) und aktualisiert den DNS-A-Record auf diese IP.

DNS-Skripte pflegen

1 Skript öffnen (immer als root!)
nano /websitesscript/websites1-upd-cronjob.sh
2 URL hinzufügen oder entfernen
Im urls=()-Array eine neue Zeile mit der Update-URL einfügen. URLs in "doppelten Anführungszeichen".
3 Testen — manuell ausführen
bash /websitesscript/websites1-upd-cronjob.sh
echo "Exit-Code: $?"
Erwartet: Exit-Code 0 (Erfolg)
4 Permissions prüfen
ls -l /websitesscript/
# websites1: -rwx------ (700) - nur root!
# Andere: -rwxr-xr-x (755)

DNS-Update live testen

Was zeigt der DNS gerade?

dig +short doki.rusti.ipv64.net
dig +short abos.rusti.ipv64.net
nslookup tbrt.rusti.ipv64.net

Was ist die aktuelle Heim-IP?

curl -s https://ipinfo.io/ip
# oder
curl -s https://api.ipify.org

Beide Werte müssen übereinstimmen. Falls nicht: DNS-Update läuft nicht oder Skripte sind kaputt.

Cronjob-Liste anzeigen

crontab -l
💡 Erfahrungen: Bei früheren Fixes hatte sich ein Tippfehler im Pfad eingeschlichen (/websitesscripts/ statt /websitesscript/). Beim Editieren der Crontab sehr genau hinschauen!

System-Updates

# Paketliste aktualisieren
apt update

# Was würde aktualisiert?
apt list --upgradable

# Updates einspielen
apt upgrade

# Bei Kernel-Updates: ggf. Reboot
# (LXC-Container nutzt Host-Kernel, also nur bei wenigen Updates nötig)
[ -f /var/run/reboot-required ] && echo "Reboot empfohlen"

Backup

Was sichern?

Schnelles Komplett-Backup

tar -czf /root/nginx-backup-$(date +%Y%m%d).tar.gz \
  /etc/nginx/ \
  /var/www/html/ \
  /websitesscript/ 2>/dev/null

crontab -l > /root/crontab-$(date +%Y%m%d).txt

ls -lh /root/*.tar.gz /root/crontab-*.txt
⚠️ Token-Schutz: Das Backup enthält die ipv64-Tokens. NICHT öffentlich teilen (z.B. nicht in Git pushen, nicht ungeschützt auf USB legen).

Diagnose

Schnell-Check: Läuft alles?

# Alle wichtigen Dienste auf einen Blick
systemctl is-active nginx cron ssh

# Offene Ports
ss -tlnp | grep LISTEN

# Disk-Nutzung
df -h /

# Memory
free -h

nginx-Status-Endpoint (admin-Bereich)

Der /admin-Pfad auf Port 80 ist passwortgeschützt und kann für interne Tools/Statusseiten genutzt werden.


nginx startet nicht

Symptom: Job for nginx.service failed

1 Was sagt nginx selbst?
nginx -t
# Zeigt genau die fehlerhafte Zeile und Datei
2 Typische Fehler
FehlerLösung
duplicate default server Backup-Datei in sites-enabled/ — wegnehmen!
unknown directive Tippfehler in Direktive — checken
address already in use Port von anderem Prozess belegt: ss -tlnp | grep :PORT
open() failed Pfad falsch oder Permissions — checken
3 Rollback aus Backup
cp /root/nginx-default.bak.before-authfix /etc/nginx/sites-enabled/default
nginx -t && systemctl reload nginx

DNS aktualisiert nicht

Symptom: Apps von außen nicht erreichbar nach IP-Wechsel

# 1. Aktuelle DNS-Auflösung
dig +short doki.rusti.ipv64.net

# 2. Aktuelle Heim-IP
curl -s https://ipinfo.io/ip

# 3. Wenn unterschiedlich: DNS-Update manuell auslösen
bash /websitesscript/websites1-upd-cronjob.sh
echo "Exit: $?"

# 4. Cronjob-Liste
crontab -l

# 5. Datum/Uhrzeit der VM korrekt?
date
timedatectl status

Passwort funktioniert nicht

Checks

# 1. Existiert die Datei?
ls -la /etc/nginx/.htpasswd

# 2. Welche User sind drin?
cut -d: -f1 /etc/nginx/.htpasswd

# 3. Im nginx-Log nach Auth-Fehlern suchen
grep "401\|password" /var/log/nginx/error.log | tail -10

# 4. nginx kann die Datei lesen?
sudo -u www-data cat /etc/nginx/.htpasswd && echo OK

Falls die Datei fehlt oder kaputt ist:

# Neuen User anlegen (mit -c überschreibt die Datei!)
htpasswd -c /etc/nginx/.htpasswd admin
# Weitere ohne -c:
htpasswd /etc/nginx/.htpasswd zweiter-user

Verwandte Dokus

Webserver-Nginx Admin-Doku · Stand 24.05.2026
192.168.178.132 · Ubuntu 24.04 LTS · nginx 1.24
🌐 Doku-Hosting + DNS-Update-Trigger