Phoscon mit nginx Reverse Proxy für Port 443

Aus IT-Wiki

Übersicht

Installation und Konfiguration von nginx als Reverse Proxy, der nur Port 443 verwendet, ohne den bestehenden Port 80 Dienst zu stören.

Hier wird als Beispiel die IP Adresse 192.168.1.100 und der Hostname raspberrypi verwendet. Diese Angaben müssen selbstverständlich an die tatsächliche IP Adresse und den Hostnamen angepasst werden.

Installationsschritte

1. Port 443 für WebSocket bei deconz Dienst ändern

sudo nano /lib/systemd/system/deconz.service

Bei dieser Zeile den ws-port auf 8443 ändern:

ExecStart=/usr/bin/deCONZ -platform minimal --http-port=80 --ws-port=8443

2. nginx installieren und sofort stoppen

# System aktualisieren und nginx installieren
sudo apt update
sudo apt install nginx -y

# nginx sofort stoppen und Auto-Start deaktivieren
sudo systemctl stop nginx
sudo systemctl disable nginx

3. Standard-Konfiguration entfernen

# Default-Site deaktivieren (verwendet Port 80)
sudo rm /etc/nginx/sites-enabled/default

4. SSL-Zertifikat erstellen

# Privaten Schlüssel generieren
sudo openssl genrsa -out /etc/ssl/private/nginx-selfsigned.key 2048

# Zertifikat erstellen (10 Jahre gültig)
sudo openssl req -new -x509 -days 3650 \
  -key /etc/ssl/private/nginx-selfsigned.key \
  -out /etc/ssl/certs/nginx-selfsigned.crt \
  -subj "/C=DE/ST=Home/L=Internal/O=HomeLab/CN=raspberrypi.local" \
  -addext "subjectAltName=IP:192.168.1.100,DNS:raspberrypi.local,DNS:localhost"

5. nginx Reverse Proxy Konfiguration erstellen

Datei: /etc/nginx/sites-available/reverse-proxy

server {
    listen 443 ssl;
    server_name raspberrypi.local 192.168.1.100 localhost;
    
    # SSL-Zertifikate
    ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
    ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
    
    # Moderne SSL-Einstellungen
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers on;
    
    # Reverse Proxy zur Anwendung auf Port 80
    location / {
        proxy_pass http://localhost:80;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # Timeout-Einstellungen
        proxy_connect_timeout 30s;
        proxy_read_timeout 60s;
        proxy_send_timeout 60s;
    }
}

6. Konfiguration aktivieren

# Konfiguration aktivieren
sudo ln -s /etc/nginx/sites-available/reverse-proxy /etc/nginx/sites-enabled/

# Syntaxprüfung durchführen
sudo nginx -t

Erwartete Ausgabe:

nginx: configuration file /etc/nginx/nginx.conf test is successful

7. Firewall konfigurieren (wenn vorhanden)

# Nur HTTPS (Port 443) freigeben
sudo ufw allow 443

# Port 80 NICHT freigeben (bleibt für bestehenden Dienst)
# sudo ufw allow 80  # AUSKOMMENTIERT lassen

8. nginx starten

# nginx starten
sudo systemctl start nginx

# Automatischen Start aktivieren
sudo systemctl enable nginx

# Status prüfen
sudo systemctl status nginx

Verifikation

Dienst-Status prüfen

# nginx Status
sudo systemctl status nginx

# Ports prüfen
sudo netstat -tulpn | grep nginx

Erwartetes Ergebnis:

  • nginx läuft (active (running))
  • Hört nur auf Port 443 (0.0.0.0:443)
  • Port 80 bleibt frei für bestehenden Dienst

HTTPS-Verbindung testen

# Lokal testen (selbstsigniertes Zertifikat ignorieren)
curl -k https://localhost

# Mit IP testen
curl -k https://192.168.1.100

Browser-Test

https://raspberrypi.local
https://192.168.1.100

Hinweis: Browser-Warnung wegen selbstsigniertem Zertifikat ist normal → "Erweitert" → "Trotzdem weiter"

Troubleshooting

Konfigurationsprobleme

# Detaillierte Fehler anzeigen
sudo nginx -t

# Logs prüfen
sudo tail -f /var/log/nginx/error.log

Port-Konflikte

# Prüfen was auf Port 443 läuft
sudo lsof -i :443

# Alle nginx Prozesse anzeigen
ps aux | grep nginx

Zertifikat prüfen

# Zertifikat-Informationen anzeigen
sudo openssl x509 -in /etc/ssl/certs/nginx-selfsigned.crt -text -noout

Service-Management Befehle

Befehl Beschreibung
sudo systemctl start nginx nginx starten
sudo systemctl stop nginx nginx stoppen
sudo systemctl restart nginx nginx neustarten
sudo systemctl reload nginx Konfiguration neu laden
sudo systemctl status nginx Status anzeigen
sudo nginx -t Konfiguration testen

Wichtige Dateien

Pfad Beschreibung
/etc/nginx/sites-available/reverse-proxy Reverse Proxy Konfiguration
/etc/nginx/sites-enabled/reverse-proxy Aktivierte Konfiguration
/etc/ssl/certs/nginx-selfsigned.crt SSL Zertifikat
/etc/ssl/private/nginx-selfsigned.key SSL Privater Schlüssel
/var/log/nginx/error.log Fehlerlogs
/var/log/nginx/access.log Zugriffslogs

Erfolgskriterien

  • nginx läuft ohne Fehler (systemctl status nginx)
  • Port 443 ist belegt (netstat -tulpn | grep :443)
  • Port 80 bleibt für bestehenden Dienst verfügbar
  • HTTPS-Verbindung funktioniert (curl -k https://localhost)
  • Reverse Proxy leitet korrekt weiter
  • Keine Konflikte mit bestehenden Diensten