🌐 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.
• 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
.122Stand: 24. Mai 2026
System-Daten
Dienste & Ports
| Port | Dienst | Inhalt | Schutz |
|---|---|---|---|
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 |
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
| Eintrag | Server-Name | Realm |
|---|---|---|
| Port 80 (default) | _ | "admin area" |
| Port 84 | rieslinginfrassc.net | "Riesling Infrastruktur" |
| Port 85 | geno50sc.net | "Geno50 Infrastruktur" |
| Port 86 | linux.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.
| Zeit | Skript | Aktualisiert |
|---|---|---|
| 05:30 | websites1-upd-cronjob.sh | Abos · Doki |
| 05:45 | websites2-upd-cronjob.sh | NetData · UptimeKuma · Bookstack |
| 06:00 | websites3-upd-cronjob.sh | Linux mit System · Nextcloud · Riesling Infra |
| 06:30 | websites4-upd-cronjob.sh | Geno50 Zeiten · Risikomanagement · Infra-Diagramm |
websites1 ist -rwx------ (nur root).
Beim Editieren niemals chmod ändern!
Nginx-Config prüfen & neu laden
nginx -t
Erwartet: syntax is ok + test is successful
systemctl reload nginx
systemctl status nginx --no-pager
/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
-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.
mkdir -p /var/www/html/neue-website
echo "<h1>Test</h1>" > /var/www/html/neue-website/index.html
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;
}
}
nginx -t && systemctl reload nginx
ufw allow 87/tcp 2>/dev/null # falls UFW läuft
Logs prüfen
| Befehl | Zweck |
|---|---|
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
nano /websitesscript/websites1-upd-cronjob.sh
Im
urls=()-Array eine neue Zeile mit der Update-URL einfügen.
URLs in "doppelten Anführungszeichen".
bash /websitesscript/websites1-upd-cronjob.sh
echo "Exit-Code: $?"
Erwartet: Exit-Code 0 (Erfolg)
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
/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?
/etc/nginx/— Server-Config/var/www/html/— Website-Inhalte/websitesscript/— DNS-Update-Skripte ⚠️ enthalten Tokens!/etc/crontab+ Crontab-Liste
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
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
nginx -t
# Zeigt genau die fehlerhafte Zeile und Datei
| Fehler | Lö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 |
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-doku.html— DNS-Updates, ipv64, NPM, allgemeine Webserver-Aspektestunden-doku.html,treckertreff-doku.html,abos-doku.html,doki-doku.html— Apps auf.122
Webserver-Nginx Admin-Doku · Stand 24.05.2026
192.168.178.132 · Ubuntu 24.04 LTS · nginx 1.24
🌐 Doku-Hosting + DNS-Update-Trigger