Was die Meldung bedeutet
bind: address already in use heißt schlicht: Ein anderer Prozess hört bereits auf diesem Port. Zwei Programme können sich denselben Port nicht teilen.
Wer belegt den Port?
ss -tlnp | grep :80
Die Ausgabe nennt den Prozessnamen und die PID. Alternativ, oft übersichtlicher:
lsof -i :80
Die häufigsten Ursachen
- Zwei Webserver — Apache und Nginx sind beide installiert, beide wollen Port 80. Einen davon deaktivieren:
systemctl disable --now apache2 - Ein Docker-Container hält den Port —
docker pszeigt die Portzuordnung in der letzten Spalte - Ein alter Prozess, der beim letzten Stopp nicht sauber beendet wurde
- Ein Dienst startet doppelt, weil er sowohl per systemd als auch manuell gestartet wurde
Sauber lösen
Der richtige Weg ist, den Dienst regulär zu stoppen:
systemctl stop nginx
Nur wenn ein Prozess wirklich hängt, hilft der harte Weg — und auch dann zuerst freundlich:
kill <PID>
kill -9 <PID> # nur wenn das obige nichts bewirkt
kill -9 gibt dem Prozess keine Gelegenheit aufzuräumen. Bei Datenbanken kann das Daten kosten — dort niemals als erste Wahl.
Der Sonderfall TIME_WAIT
Manchmal ist der Port scheinbar belegt, obwohl kein Prozess läuft. Dann steht die Verbindung noch im Zustand TIME_WAIT — ein normales Verhalten von TCP, das nach kurzer Zeit von selbst endet. Prüfen mit:
ss -tan | grep TIME-WAIT | head
Hier hilft schlicht warten, meist unter einer Minute.
Konflikte von vornherein vermeiden
Wer mehrere Dienste auf einem Server betreibt, lässt sie nicht alle direkt auf Port 80 und 443 hören. Stattdessen bekommt jeder Dienst einen eigenen internen Port, und ein Reverse Proxy verteilt die Anfragen anhand der Domain. Damit ist der Konflikt strukturell ausgeschlossen.