Nginx başlamıyor: "bind() to 0.0.0.0:80 failed (98: Address already in use)"

Nginx ve Web Sunucusu 64 görüntülenme Markdown

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 (apache2 ya da httpd): Bazı paketler (PHP kurarken apache2 bağı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 nginx ile bakın; sudo systemctl stop nginx ya da gerekirse sudo pkill nginx sonra sudo systemctl start nginx.
  • Docker konteyneri: -p 80:80 ile 80'i tutan bir konteyner. docker ps ile 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

  1. Diğer programı kapatın (gerekmiyorsa ve kalıcı kapatmak için disable kullanın).
  2. Portları ayırın: Nginx 80'de, diğeri örneğin 8080'de dinlesin; Nginx'ten proxy_pass ile ona yönlendirin: Nginx ters proxy.
  3. Nginx'in ayarında aynı portun iki yerde listen ile tanımlanıp tanımlanmadığına bakın: aynı listen 80; iki farklı dosyada default_server olarak 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

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.

Faydalı oldu mu?

Geri bildiriminiz için teşekkürler!

Hâlâ Yardıma mı İhtiyacınız Var?

Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.