Come appare il messaggio
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)Cause frequenti
- Apache, un'altra istanza di nginx o un servizio del pannello (Plesk, cPanel) è già in ascolto sulla porta 80 o 443.
- nginx è già in esecuzione ed è stato avviato una seconda volta invece di essere ricaricato.
- Un container Docker pubblica la stessa porta, ad esempio con
-p 80:80. - Un vecchio processo master di nginx è sopravvissuto a un crash o a un riavvio fallito.
- Nella tua configurazione due servizi usano lo stesso indirizzo e la stessa porta in
listen.
Verifica
- Chi è in ascolto sulle porte 80 e 443?
ss -ltnp | grep -E ':(80|443) ' - La configurazione è valida? (un conflitto di porta emerge solo all'avvio)
nginx -t - Cerca processi nginx rimasti
ps aux | grep '[n]ginx' - Container che pubblicano porte
docker ps --format '{{.Names}} {{.Ports}}'
Soluzione
- Ferma e disattiva l'altro servizio se non deve girare:
systemctl disable --now apache2. - Se nginx è già attivo, usa
systemctl reload nginxinvece di avviarlo di nuovo. - Termina solo un processo master chiaramente orfano e poi avvia:
pkill nginx; systemctl start nginx. - Sposta uno dei servizi su un'altra porta oppure associa ciascuno al proprio IP:
listen 203.0.113.10:80;. - Su un server con pannello, cambia l'impostazione dal pannello e non avviare a mano un secondo nginx.
Domande frequenti
nginx -t dice OK ma nginx non parte lo stesso. Perché?
nginx -t controlla sintassi e file, ma non occupa le porte. Un conflitto di porta emerge solo all'avvio vero, quindi leggi sempre anche l'output di ss -ltnp.
Due servizi possono condividere la porta 80?
Solo se ascoltano su indirizzi IP diversi. Con lo stesso indirizzo e la stessa porta uno deve spostarsi oppure stare dietro l'altro come reverse proxy.