Nginx başlamıyor: "bind() to 0.0.0.0:80 failed (98: Address already in use)"
Nginx'i başlatmaya ya da yeniden yüklemeye çalışıyorsunuz ve şu hatayı alıyorsunuz:
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
Bir port (80, 443) aynı anda yalnızca bir program tarafından dinlenebilir. Başka bir program o portu zaten tutuyorsa Nginx başlayamaz. Çözüm, portu tutanı bulmak ve ya onu durdurmak ya da portlarını ayırmaktır.
Portu kim kullanıyor?
sudo ss -tlnp | grep -E ":80 |:443 "
sudo lsof -i :80
Çıktıda son sütunda programın adı ve süreç numarası yazar: users:(("apache2",pid=1234,fd=4)). En sık görülen suçlular:
- Apache (
apache2ya dahttpd): Bazı paketler (PHP kurarkenapache2bağımlılığı) Apache'yi otomatik kurup başlatır. Nginx kullanacaksanız Apache'yi durdurup kapatın:sudo systemctl stop apache2 && sudo systemctl disable apache2. - Başka bir Nginx süreci: Yarım kalmış eski bir Nginx kapanmadı.
ps aux | grep nginxile bakın;sudo systemctl stop nginxya da gerekirsesudo pkill nginxsonrasudo systemctl start nginx. - Docker konteyneri:
-p 80:80ile 80'i tutan bir konteyner.docker psile bulun ve durdurun ya da başka bir porta alın. - Caddy, Traefik, bir Node uygulaması gibi doğrudan 80'e bağlanan başka bir yazılım.
Çözüm seçenekleri
- Diğer programı kapatın (gerekmiyorsa ve kalıcı kapatmak için
disablekullanın). - Portları ayırın: Nginx 80'de, diğeri örneğin 8080'de dinlesin; Nginx'ten
proxy_passile ona yönlendirin: Nginx ters proxy. - Nginx'in ayarında aynı portun iki yerde
listenile tanımlanıp tanımlanmadığına bakın: aynılisten 80;iki farklı dosyadadefault_serverolarak işaretlenmişse de benzer hata alırsınız (bu durumda hata mesajı "duplicate default server" gibi olur):sudo nginx -t.
Kontrol
sudo nginx -t
sudo systemctl start nginx
sudo systemctl status nginx
sudo ss -tlnp | grep nginx
Son komutta Nginx'i :80 ve :443 üzerinde görmelisiniz.
IPv6 ayrıntısı
Hata yalnızca [::]:80 için çıkıyorsa, sunucuda IPv6 kapalı olabilir ya da başka bir yazılım yalnızca IPv6'yı tutuyordur. Nginx'te listen [::]:80 ipv6only=on; ile ayırabilir ya da kullanmıyorsanız o listen satırını kaldırabilirsiniz.
Nginx ayarını değiştirdikten sonra siteler açılmıyorsa sitem açılmıyor kontrol listesine, güvenlik duvarında 80 ve 443'ün açık olduğunu doğrulamak için UFW rehberine bakın.
Sık sorulanlar
Ubuntu'da PHP kurunca Apache geldi, ne yapmalıyım?
PHP'yi php-fpm olarak kurduysanız Apache gelmez. libapache2-mod-php bağımlılığıyla geldiyse sudo apt purge apache2* ile kaldırabilirsiniz (Nginx kullanacaksanız).
Hata sadece reload'da çıkıyor.
Reload sırasında yeni bir listen eklediyseniz Nginx yeni portu bağlayamıyor demektir. Portu tutanı bulun ya da tam yeniden başlatma (restart) yapın.
Port boş ama yine de hata veriyor.
Süreçler kapanırken port kısa süre tutulabilir. Birkaç saniye bekleyip tekrar deneyin. Süregelen durumda sudo ss -tlnp ile gerçekten boş olduğunu doğrulayın.
İlgili makaleler
- Nginx 502 Bad Gateway hatası: nedenleri ve çözümü
- Linux sunucuya web sitesi (Nginx) nasıl kurulur?
- Docker nasıl kurulur?
Sorununuz çözülmediyse destek talebi açın. Hangi adımı denediğinizi ve ekranda ne gördüğünüzü yazarsanız çözüm çok daha hızlı olur.
Geri bildiriminiz için teşekkürler!