Nginx 502 Bad Gateway hatası: nedenleri ve çözümü

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

502 Bad Gateway, Nginx'in arkasındaki programa (PHP-FPM, Node.js uygulaması, Python servisi) ulaşamadığını ya da bozuk bir yanıt aldığını söyler. Yani sorun Nginx'te değil, ya arkadaki servisin kapalı olmasında ya da Nginx'in ona yanlış yoldan gitmesindedir. Cevabı günlük dosyası verir; tahmin etmeyin, önce okuyun.

1. Günlüğe bakın

sudo tail -n 30 /var/log/nginx/error.log

Hataya yakın satırlar sebebi açıkça yazar. En sık karşılaşılanlar:

  • connect() to unix:/run/php/php8.3-fpm.sock failed (2: No such file or directory)
    PHP-FPM çalışmıyor ya da soket yolu yanlış.
  • connect() failed (111: Connection refused) while connecting to upstream
    Arkadaki uygulama o portta dinlemiyor (kapanmış ya da başka portta).
  • connect() to unix:... failed (13: Permission denied)
    Soket dosyasının izinleri Nginx kullanıcısına (www-data) izin vermiyor.
  • upstream prematurely closed connection
    Arkadaki program yanıt verirken çöktü; kendi günlüğüne bakın.

2. PHP siteleri için PHP-FPM kontrolü

sudo systemctl status php8.3-fpm
ls /run/php/

Servis çalışmıyorsa sudo systemctl restart php8.3-fpm ile başlatın. ls çıktısındaki soket adı ile Nginx ayarınızdaki fastcgi_pass satırı birebir aynı olmalı. PHP sürümünü yükselttiyseniz (8.1'den 8.3'e gibi) soketin adı da değişir ve Nginx eski adı aramaya devam eder:

sudo grep -r fastcgi_pass /etc/nginx/
sudo nginx -t
sudo systemctl reload nginx

PHP-FPM'in kendi günlüğünde server reached pm.max_children setting görüyorsanız çalışan işlem sayısı sınırı dolmuştur; sınır değerini /etc/php/8.3/fpm/pool.d/www.conf içinde yükseltin, ama bellek yettiğinden emin olun.

3. Node.js, Python gibi uygulamalar için

sudo ss -tlnp | grep 3000
grep proxy_pass /etc/nginx/sites-enabled/*

Uygulamanın dinlediği port, proxy_pass satırındaki portla aynı olmalı. Uygulama kapanmışsa nedenini öğrenmek için servis günlüğüne bakın (journalctl -u uygulamam -n 50). Uygulamanızı sunucu açılışında otomatik başlatıp çökünce yeniden başlatacak şekilde ayarlamak için arka planda çalıştırma makalesine bakın.

4. 502 değil 504 ise

504 Gateway Timeout, arkadaki programın yanıt verdiği ama çok yavaş kaldığı anlamına gelir. Uzun süren işlemlerde Nginx ayarlarında fastcgi_read_timeout 120; (PHP) ya da proxy_read_timeout 120; (proxy) değerini artırabilirsiniz. Asıl çözüm yavaş sorguyu ya da işlemi bulmaktır.

Bellek yetmiyor olabilir

PHP-FPM ya da uygulama bir anda ölüyorsa sunucunun belleği dolmuş ve çekirdek süreci öldürmüş olabilir. Doğrulamak için: sudo dmesg | grep -i "out of memory". Çözüm swap eklemek ya da paketi büyütmektir. Sunucu seçenekleri: Linux VDS.

Sık sorulanlar

502 hatası bir anda geldi, hiçbir şey değiştirmedim, neden?

Çoğu zaman otomatik güvenlik güncellemesi PHP-FPM'i yeniden başlatırken ya da sürümünü yükseltirken olur. Servis ayağa kalkmamış ya da soket adı değişmiş olabilir. Günlükteki ilk satıra bakın.

Nginx'i yeniden başlatmak çözer mi?

Sadece Nginx'in kendi sorunu varsa. 502'nin sebebi arkadaki servis olduğu için asıl yeniden başlatılması gereken PHP-FPM ya da uygulamanızdır.

502'yi sadece bazı sayfalarda görüyorum.

Belirli bir sayfa ağır bir sorgu çalıştırıp işlemi çökertiyor olabilir. Uygulamanızın kendi hata günlüğüne ve PHP-FPM günlüğüne (/var/log/php8.3-fpm.log) bakı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.