Behebung von Nginx 'Connection Refused'-Fehlern: Ein praktischer Leitfaden zur Fehlerbehebung

Beheben Sie Nginx-Verbindungsfehler durch Überprüfung des Dienststatus, der Listening-Ports, der Firewall, der Konfiguration und der Upstreams.

Behebung von Nginx 'Connection Refused'-Fehlern: Ein praktischer Leitfaden zur Fehlerbehebung

Ein 'Connection Refused'-Fehler beim Zugriff auf einen Dienst, der hinter Nginx läuft, ist eine häufige, aber frustrierende Erfahrung. Im Gegensatz zu einem 'Timeout'-Fehler, der auf Netzwerkverzögerungen oder Paketverluste hindeutet, ist ein 'Connection Refused'-Fehler eindeutig: Das Betriebssystem hat den Verbindungsversuch sofort abgelehnt, weil keine Anwendung aktiv auf dem angegebenen Port und der IP-Adresse lauscht.

Diese sofortige Ablehnung führt das Problem auf einige kritische Bereiche zurück: Der Dienst ist ausgefallen, die Firewall blockiert den Datenverkehr lokal oder die Konfiguration leitet den Datenverkehr zu einem nicht vorhandenen Port. Dieser Leitfaden bietet einen systematischen, vierphasigen Ansatz zur Diagnose und Behebung von 'Connection Refused'-Fehlern, damit Sie die Dienstkonnektivität schnell wiederherstellen können.

Phase 1: Überprüfung des Nginx-Serverstatus (Der primäre Listener)

Die grundlegendste Ursache für eine Verbindungsablehnung ist, dass der Nginx-Dienst selbst nicht läuft oder falsch konfiguriert ist.

1. Überprüfen des Nginx-Dienststatus

Verwenden Sie den Dienstmanager Ihres Systems (normalerweise systemd), um zu bestätigen, dass Nginx aktiv ist und läuft. Ein Fehler hier ist die direkte Ursache für die Ablehnung auf dem primären Listening-Port (normalerweise 80 oder 443).

sudo systemctl status nginx

Erwartete Ausgabe (Erfolg): Suchen Sie nach Active: active (running).

Umsetzbare Lösung: Wenn der Status inactive oder failed anzeigt, versuchen Sie, den Dienst zu starten und überprüfen Sie die Logs auf Fehlerdetails.

sudo systemctl start nginx
sudo journalctl -xe | grep nginx

2. Bestätigen aktiver Listening-Ports

Verwenden Sie das Tool ss (Socket-Statistiken) oder netstat, um zu überprüfen, ob Nginx tatsächlich an die erwartete IP-Adresse und den Port bindet (z. B. 0.0.0.0:80 oder 127.0.0.1:8080).

# Verwendung von ss (bevorzugt auf modernen Linux-Distributionen)
sudo ss -tuln | grep 80

# Verwendung von netstat
sudo netstat -tuln | grep 80

Wenn Sie den erwarteten Port (z. B. :80 oder :443) nicht unter einem mit Nginx verbundenen Prozess (PID) aufgeführt sehen, bedeutet dies, dass Nginx nicht binden konnte, wahrscheinlich aufgrund eines Konfigurationsfehlers oder eines anderen Dienstes, der diesen Port bereits belegt.

Tipp: Wenn ein anderer Dienst den Port belegt, müssen Sie entweder diesen Dienst stoppen oder die Nginx-Konfiguration ändern, um auf einem anderen, verfügbaren Port zu lauschen.

Phase 2: Firewall- und Netzwerkkonfiguration

Wenn Nginx läuft und lokal lauscht, kann die Verbindungsablehnung außerhalb des Dienstes erfolgen, typischerweise aufgrund von Firewall-Regeln, die eingehenden Datenverkehr blockieren.

1. Überprüfen lokaler Server-Firewalls

Stellen Sie sicher, dass die Ports, auf denen Nginx lauscht (z. B. 80, 443), explizit durch die Host-Firewall (UFW, firewalld oder iptables) erlaubt sind.

UFW-Beispiel (Ubuntu/Debian)

sudo ufw status verbose
# Wenn geschlossen, die Ports erlauben:
sudo ufw allow 'Nginx Full'
# Oder spezifisch:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

Firewalld-Beispiel (CentOS/RHEL)

sudo firewall-cmd --list-all
# Wenn geschlossen, die Dienste hinzufügen:
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

2. Überprüfen der Sicherheitsgruppen des Cloud-Anbieters

Wenn Ihr Server in einer Cloud-Umgebung gehostet wird (AWS EC2, Azure VM, GCP Compute Engine), kann die Verbindungsablehnung von der Sicherheitsebene des virtuellen Netzwerks ausgehen.

  • AWS-Sicherheitsgruppen (SG): Überprüfen Sie die zugehörige SG und stellen Sie sicher, dass eingehende Regeln Datenverkehr auf den Ports 80 und 443 von den Quell-IP-Adressen (normalerweise 0.0.0.0/0 für öffentlichen Zugriff) erlauben.
  • Azure-Netzwerksicherheitsgruppen (NSG): Überprüfen Sie die eingehenden Portregeln.

Phase 3: Validierung der Nginx-Konfiguration

Falsche Konfigurationsanweisungen können dazu führen, dass Nginx versucht, auf einem nicht verfügbaren Port oder einer nicht verfügbaren IP zu lauschen, was zu einem Startfehler und anschließender Verbindungsablehnung führt.

1. Überprüfen der listen-Anweisungen

Überprüfen Sie Ihre primäre Konfigurationsdatei (oft /etc/nginx/nginx.conf) und alle relevanten Server-Blöcke (normalerweise in /etc/nginx/conf.d/ oder /etc/nginx/sites-enabled/). Stellen Sie sicher, dass die listen-Anweisungen korrekt sind.

Beispiel eines korrekt konfigurierten Listen-Blocks:

server {
    listen 80;
    listen [::]:80;
    server_name example.com;
    # ... andere Anweisungen
}

Wenn Nginx so konfiguriert ist, dass es nur auf 127.0.0.1 (localhost) lauscht, Sie aber versuchen, mit der öffentlichen IP darauf zuzugreifen, wird die Verbindung abgelehnt.

2. Ausführen der Konfigurationssyntaxprüfung

Bevor Sie Nginx neu starten, validieren Sie immer die Konfigurationssyntax. Ein Parsing-Fehler verhindert den Start des Dienstes und führt zur Ablehnung.

sudo nginx -t

Wenn der Test fehlschlägt, beheben Sie den identifizierten Fehler, führen Sie den Test erneut aus und laden Sie Nginx dann neu oder starten Sie es neu.

sudo systemctl reload nginx

Phase 4: Fehlerbehebung bei Reverse-Proxy (Upstream)-Problemen

Wenn Nginx erfolgreich auf den Ports 80/443 läuft, aber der Zugriff auf einen bestimmten Pfad (/api/) zu 'Connection Refused' führt, liegt das Problem zwischen Nginx und dem Backend-Dienst (dem Upstream).

In diesem Szenario hat Nginx die anfängliche Verbindung akzeptiert, aber als es versuchte, die Anfrage zu proxen, wurde die Verbindung zum Backend abgelehnt. Die Fehlerlogs werden dies bestätigen.

1. Überprüfen der Nginx-Fehlerlogs

Überprüfen Sie die Nginx-Fehlerlogs (normalerweise /var/log/nginx/error.log) unmittelbar nach dem fehlgeschlagenen Verbindungsversuch. Suchen Sie nach Nachrichten, die sich auf die proxy_pass-Anweisung beziehen und speziell Verbindungsfehler erwähnen.

tail -f /var/log/nginx/error.log

Sie könnten einen Eintrag wie diesen sehen:

[error] connect() failed (111: Connection refused) while connecting to upstream

2. Überprüfen des Backend-Dienststatus

Dies ist die häufigste Lösung in Proxy-Szenarien: Die Backend-Anwendung (z. B. Node.js, Python Gunicorn, Apache) ist ausgefallen oder lauscht nicht dort, wo Nginx sie erwartet.

Umsetzbare Schritte:

a. Backend-Dienststatus überprüfen: Bestätigen Sie, dass die Backend-Anwendung läuft.

b. Backend-Listening-Port überprüfen: Verwenden Sie ss -tuln auf dem Server, der das Backend hostet, um zu bestätigen, dass die Anwendung auf der IP/Port lauscht, die in der proxy_pass-Anweisung von Nginx angegeben ist.

3. Testen der Backend-Konnektivität direkt

Testen Sie die Verbindung vom Nginx-Server zum Backend mit curl oder telnet, um das Problem von Nginx zu isolieren.

Angenommen, Ihr proxy_pass ist auf http://127.0.0.1:8080 gesetzt:

# Testen der Verbindung vom Nginx-Server zum Backend-Port
curl -v http://127.0.0.1:8080

# Oder mit telnet
telnet 127.0.0.1 8080
  • Wenn curl oder telnet fehlschlägt: Das Backend ist definitiv das Problem (es lauscht nicht oder seine interne Firewall blockiert den Zugriff auf 127.0.0.1).
  • Wenn curl oder telnet erfolgreich ist: Das Problem könnte ein subtiler Fehler in Ihrer proxy_pass-Anweisung sein (z. B. fehlendes Semikolon, falsche Hostnamenauflösung oder ein Protokollkonflikt – HTTP vs. HTTPS).

Häufiger proxy_pass-Fehler

Stellen Sie sicher, dass die IP-Adresse in Ihrem proxy_pass mit der übereinstimmt, an die das Backend tatsächlich gebunden ist. Wenn das Backend an eine bestimmte IP bindet (z. B. 192.168.1.10:8080), Nginx aber localhost:8080 verwendet, schlägt die Verbindung fehl, wenn die Bindung restriktiv ist.

Abschließende Überprüfungen der wichtigsten Schritte zur Fehlerbehebung

  1. Systemprüfung: Läuft Nginx (systemctl status nginx)?
  2. Portprüfung: Lauscht Nginx auf der richtigen IP/Port (ss -tuln)?
  3. Firewallprüfung: Ist der eingehende Port auf der Host-Firewall geöffnet (UFW, iptables)?
  4. Konfigurationsprüfung: Besteht nginx -t den Test und sind die listen-Anweisungen korrekt?
  5. Proxy-Prüfung (falls zutreffend): Läuft der Upstream-Dienst und lauscht auf der exakten IP/Port, die in proxy_pass definiert ist? Testen Sie die Konnektivität direkt mit curl.

Arbeiten Sie die Prüfungen in der Reihenfolge durch: Listener, Port, Firewall, Konfiguration, dann Upstream. Dieser Pfad hält Sie auf den genauen Ort fokussiert, an dem die Verbindung abgelehnt wird.