Wie man den Fehler 'nginx - nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)' behebt

Veröffentlicht 27. August 2024

Problem: NGINX-Fehler "Adresse bereits in Verwendung"

Beim Starten oder Neustarten von NGINX kann die Fehlermeldung "nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)" auftreten. Dieser Fehler tritt auf, wenn NGINX versucht, sich an Port 80 zu binden, dieser aber bereits von einem anderen Prozess verwendet wird. Dies verhindert den Start von NGINX und beeinträchtigt den Betrieb Ihres Webservers.

Lösungen für den Nginx Bind-Fehler

Beenden von konkurrierenden Diensten

Um den Nginx Bind-Fehler zu beheben, beenden Sie andere Webserver oder Dienste, die Port 80 nutzen. Prüfen Sie, ob Apache läuft:

sudo systemctl status apache2

Falls Apache aktiv ist, beenden Sie ihn:

sudo systemctl stop apache2

Um zu verhindern, dass Apache beim Systemstart startet:

sudo systemctl disable apache2

Verwenden Sie netstat, um andere Dienste zu identifizieren, die Port 80 nutzen:

sudo netstat -tuln | grep :80

Beenden Sie konkurrierende Dienste:

sudo systemctl stop dienstname

Ändern der Nginx-Port-Konfiguration

Wenn das Beenden von Diensten nicht hilft, ändern Sie den Port von Nginx. Bearbeiten Sie die Nginx-Konfigurationsdatei:

sudo nano /etc/nginx/nginx.conf

Suchen Sie die listen-Anweisung und ändern Sie sie auf einen alternativen Port, z.B. 8080:

server {
    listen 8080;
    # Weitere Einstellungen
}

Speichern Sie die Datei und starten Sie Nginx neu:

sudo systemctl restart nginx

Konfiguration von Nginx als Reverse Proxy

Richten Sie Nginx als Reverse Proxy ein, um mit anderen Webservern zusammenzuarbeiten. Bearbeiten Sie den Server-Block in Ihrer Nginx-Konfiguration:

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Diese Konfiguration leitet Anfragen an einen anderen Webserver weiter, der auf Port 8080 läuft. Passen Sie die proxy_pass-Anweisung an Ihre Einrichtung an. Starten Sie Nginx nach den Änderungen neu:

sudo systemctl restart nginx

Erweiterte Fehlersuche bei hartnäckigen Bind-Fehlern

Untersuchung von IPv6-bezogenen Problemen

Wenn nach den vorherigen Lösungen immer noch Bind-Fehler auftreten, können IPv6-bezogene Probleme die Ursache sein. Um IPv6 in der Nginx-Konfiguration zu deaktivieren, bearbeiten Sie die Nginx-Konfigurationsdatei:

sudo nano /etc/nginx/nginx.conf

Ändern Sie die listen-Anweisung, um IPv4 zu spezifizieren:

listen 80 ipv4only=on;

Bei Problemen mit Dual-Stack-Binding stellen Sie sicher, dass Ihr Server IPv6 unterstützt. Falls nicht, entfernen oder kommentieren Sie IPv6-Listen-Anweisungen aus:

# listen [::]:80;

Behebung von Berechtigungs- und Eigentumskonflikten

Berechtigungs- und Eigentumsprobleme können Bind-Fehler verursachen. Überprüfen Sie die Nginx-Dateiberechtigungen:

ls -l /etc/nginx/nginx.conf

Die Datei sollte root gehören und 644-Berechtigungen haben. Falls nicht, korrigieren Sie dies:

sudo chown root:root /etc/nginx/nginx.conf
sudo chmod 644 /etc/nginx/nginx.conf

Stellen Sie sicher, dass Nginx mit dem korrekten Benutzer und der korrekten Gruppe läuft. Bearbeiten Sie die Nginx-Konfigurationsdatei:

sudo nano /etc/nginx/nginx.conf

Überprüfen Sie die Benutzer-Anweisung:

user www-data;

Ändern Sie sie bei Bedarf auf den entsprechenden Benutzer. Starten Sie Nginx nach den Änderungen neu:

sudo systemctl restart nginx

Diese Schritte sollten helfen, hartnäckige Bind-Fehler im Zusammenhang mit IPv6 und Berechtigungen zu beheben.

Zusätzliche Überlegungen zur Nginx-Einrichtung

Konfiguration von SSL/TLS mit Certbot

Bei der Einrichtung von SSL/TLS mit Certbot für HTTPS können Probleme mit der Bindung an Port 443 auftreten. Zur Behebung:

  1. Prüfen Sie, ob Port 443 verwendet wird:

    sudo netstat -tuln | grep :443
  2. Wenn ein anderer Dienst Port 443 nutzt, beenden Sie ihn oder ändern Sie Nginx, um einen anderen Port zu verwenden.

  3. Installieren Sie Certbot:

    sudo apt-get update
    sudo apt-get install certbot python3-certbot-nginx
  4. Führen Sie Certbot aus, um SSL-Zertifikate zu erhalten und zu installieren:

    sudo certbot --nginx
  5. Folgen Sie den Anweisungen, um Ihre Domain auszuwählen und zu entscheiden, ob Sie HTTP-Verkehr auf HTTPS umleiten möchten.

  6. Certbot wird Ihre Nginx-Konfiguration anpassen, um die SSL-Zertifikate zu verwenden.

  7. Testen Sie Ihre HTTPS-Einrichtung, indem Sie Ihre Website mit https:// besuchen.

Verwendung von Nginx in Docker-Umgebungen

Bei der Verwendung von Nginx in Docker ist es wichtig, Portkonflikte zu verwalten und Ports korrekt freizugeben:

  1. Um Portkonflikte zu vermeiden, ordnen Sie Container-Ports anderen Host-Ports zu:

    docker run -p 8080:80 nginx

    Dies ordnet den Container-Port 80 dem Host-Port 8080 zu.

  2. Für mehrere Container verwenden Sie unterschiedliche Host-Ports:

    docker run -p 8081:80 nginx
    docker run -p 8082:80 another-nginx
  3. Legen Sie in Ihrem Dockerfile die benötigten Ports frei:

    EXPOSE 80
    EXPOSE 443
  4. Bei Verwendung von Docker Compose geben Sie Port-Zuordnungen in Ihrer docker-compose.yml an:

    services:
    nginx:
    image: nginx
    ports:
      - "8080:80"
      - "443:443"
  5. Für containerisierte Apps hinter Nginx nutzen Sie Docker's internes Netzwerk:

    services:
    nginx:
    image: nginx
    ports:
      - "80:80"
    app:
    image: your-app
    expose:
      - "3000"
  6. Richten Sie Nginx ein, um Anfragen an Ihre App weiterzuleiten, indem Sie den Servicenamen verwenden:

    location / {
    proxy_pass http://app:3000;
    }