PHP 502 Bad Gateway: PHP-FPM Yeniden Başlatma ve Sorun Giderme
PHP 502 Bad Gateway hatası genellikle PHP-FPM servisinin çökmesinden veya yanlış yapılandırılmış socket bağlantısından kaynaklanır.
PHP 502 Bad Gateway Hatası Nedir?
502 Bad Gateway hatası, ön uç web sunucusunun (genellikle Nginx) arka uç sunucudan (PHP-FPM) geçersiz bir yanıt aldığında döndürdüğü HTTP durum kodudur. PHP-FPM (FastCGI Process Manager), PHP betiklerini çalıştıran bağımsız bir servis olarak çalışır. Nginx ve PHP-FPM arasındaki iletişim koptuğunda veya PHP-FPM yanıt veremez hale geldiğinde bu hata ortaya çıkar.
502 Bad Gateway
nginx/1.24.0
Hatanın Başlıca Nedenleri
1. PHP-FPM Servisi Çökmüş
PHP-FPM sürecinin tamamen durması en yaygın nedendir. Bellek yetersizliği, PHP kodu hatası veya sistem kaynakları tükenmesi PHP-FPM'i çökertebilir.
2. Socket Dosyası Sorunu
Nginx, PHP-FPM ile Unix socket veya TCP port üzerinden iletişim kurar. Socket dosyasının yanlış izinleri veya yanlış yol belirtilmesi 502 hatasına neden olur.
3. pm.max_children Yetersizliği
PHP-FPM'in işleyebileceği maksimum eş zamanlı istek sayısı pm.max_children ile belirlenir. Bu değer yetersiz kalırsa yeni istekler işlenemez ve 502 hatası oluşur.
4. PHP Script Zaman Aşımı
Uzun süre çalışan PHP betikleri, Nginx'in bekleme süresini aşabilir ve 502 hatası oluşabilir.
5. Yanlış Nginx-FPM Yapılandırması
Nginx yapılandırmasındaki yanlış socket yolu veya port numarası bağlantı hatasına yol açar.
Hızlı Tanı Adımları
# PHP-FPM servis durumunu kontrol et
sudo systemctl status php8.2-fpm
# PHP-FPM error log
sudo tail -50 /var/log/php8.2-fpm.log
# Nginx error log
sudo tail -50 /var/log/nginx/error.log
# Socket dosyasını kontrol et
ls -la /run/php/php8.2-fpm.sock
Çözüm 1: PHP-FPM'i Yeniden Başlatma
# PHP-FPM yeniden başlat
sudo systemctl restart php8.2-fpm
# Durumu kontrol et
sudo systemctl status php8.2-fpm
# Otomatik başlatmayı aktifleştir
sudo systemctl enable php8.2-fpm
PHP-FPM yeniden başlatıldıktan sonra site genellikle hemen çalışmaya devam eder.
Çözüm 2: Socket İzinlerini Düzeltme
PHP-FPM pool yapılandırmasını açın:
sudo nano /etc/php/8.2/fpm/pool.d/www.conf
Şu ayarları kontrol edin ve düzeltin:
; Socket yolu
listen = /run/php/php8.2-fpm.sock
; Socket sahibi ve grubu - Nginx kullanıcısıyla eşleşmeli
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
; Pool kullanıcısı
user = www-data
group = www-data
Nginx yapılandırmasında socket yolunun doğru olduğunu kontrol edin:
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
TCP port kullanmak isterseniz:
# www.conf dosyasında
listen = 127.0.0.1:9000
# Nginx yapılandırmasında
fastcgi_pass 127.0.0.1:9000;
Çözüm 3: pm.max_children Değerini Artırma
www.conf dosyasını düzenleyin:
sudo nano /etc/php/8.2/fpm/pool.d/www.conf
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
Doğru pm.max_children değerini hesaplamak için:
# Her PHP-FPM süreci ortalama ne kadar RAM kullanıyor?
ps --no-headers -o "rss,cmd" -C php-fpm8.2 | awk '{ sum+=$1 } END { printf "%d MB\n", sum/NR/1024 }'
Örneğin her süreç 30MB kullanıyorsa ve 1GB RAM ayırdıysanız: 1024 / 30 ≈ 34 süreç çalıştırabilirsiniz.
Çözüm 4: Nginx ve PHP-FPM Zaman Aşımı Ayarları
server {
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_read_timeout 300;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
}
}
PHP-FPM tarafında:
; www.conf dosyasında
request_terminate_timeout = 300s
PHP.ini'de:
max_execution_time = 300
max_input_time = 300
Çözüm 5: Otomatik PHP-FPM Yeniden Başlatma
PHP-FPM çöktüğünde otomatik yeniden başlaması için systemd override dosyası oluşturun:
sudo systemctl edit php8.2-fpm
[Service]
Restart=always
RestartSec=5s
StartLimitInterval=60s
StartLimitBurst=5
sudo systemctl daemon-reload
sudo systemctl restart php8.2-fpm
Çözüm 6: Bellek Sorunlarını Giderme
# Sistem bellek kullanımı
free -h
# OOM (Out of Memory) killer logları
sudo dmesg | grep -i "oom\|kill"
# PHP-FPM bellek kullanımı
ps aux | grep php-fpm | awk '{sum += $6} END {print sum/1024 " MB"}'
Eğer OOM killer PHP-FPM'i öldürüyorsa sunucuya daha fazla RAM eklemeli veya Swap alanı oluşturmalısınız.
PHP-FPM Durum Sayfası
PHP-FPM'in kendi durum sayfasını aktifleştirerek gerçek zamanlı izleme yapabilirsiniz:
; www.conf dosyasında
pm.status_path = /status
ping.path = /ping
; Nginx yapılandırmasında
location ~ ^/(status|ping)$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
allow 127.0.0.1;
deny all;
}
curl http://localhost/status
Önleyici Tedbirler
- PHP-FPM için yeterli
pm.max_childrendeğeri belirleyin - Sunucu monitoring aracı kurun (Netdata, Prometheus)
- Slow log aktifleştirip yavaş PHP betiklerini optimize edin
- PHP-FPM durum sayfasını Nagios/Zabbix ile izleyin
- Systemd Restart=always ile otomatik kurtarma sağlayın
Özet
PHP 502 Bad Gateway hatası çoğunlukla PHP-FPM servisinin durmasından kaynaklanır. İlk adım systemctl restart php8.2-fpm ile servisi yeniden başlatmaktır. Sorun tekrarlanıyorsa socket izinlerini, pm.max_children değerini ve sunucu kaynaklarını kontrol edin. Systemd Restart direktifi ile PHP-FPM çöktüğünde otomatik yeniden başlamasını sağlayın.
Yorumlar
Henüz yorum yok. İlk yorumu siz yapın!