Nginx 504 Gateway Timeout Hatası: Tam Çözüm Rehberi
Nginx upstream'den zamanında yanıt alamadığında 504 hatası oluşur. Timeout değerleri ve PHP-FPM ayarlarıyla çözülür.
Nginx 504 Hatası Nedir?
HTTP 504 Gateway Timeout hatası, Nginx'in bir upstream sunucusundan (PHP-FPM, Node.js, Python/uWSGI, Ruby veya başka bir backend servisi) belirlenen süre içinde yanıt alamaması durumunda istemciye döndürdüğü HTTP hata kodudur. Nginx burada bir ters proxy (reverse proxy) olarak çalışır ve arkasındaki uygulamadan yanıt bekler; yanıt gelmezse 504 hatası üretir.
Bu hata, sunucunun tamamen çöktüğü anlamına gelmez. Arka plan hizmeti çalışıyor olabilir ancak belirli bir isteği işlemesi çok uzun sürüyor ya da yüksek yük altında yetersiz worker ile sıkışmış olabilir. E-ticaret sitelerinde büyük sipariş işlemleri, toplu veri import/export işlemleri, yavaş veritabanı sorguları veya dış API çağrıları sırasında sıkça karşılaşılır.
Tarayıcıda şu mesajla karşılaşırsınız:
504 Gateway Time-out
The server didn't respond in time.
Nginx hata loglarında ise şuna benzer bir kayıt görünür:
upstream timed out (110: Connection timed out) while reading response header from upstream,
client: 1.2.3.4, server: example.com, request: "POST /wp-admin/admin-ajax.php HTTP/1.1",
upstream: "fastcgi://unix:/run/php/php8.2-fpm.sock"
Olası Nedenler
- PHP-FPM worker sayısı yetersiz, istekler kuyrukta bekliyor
- PHP betiği çok uzun süren veritabanı sorgusu yapıyor
- Backend Node.js/Python servisi yanıt veremiyor
- Nginx timeout değerleri çok düşük ayarlanmış (varsayılan 60 saniye)
- Disk I/O veya ağ gecikmesi nedeniyle upstream yanıt veremiyor
- MySQL veya Redis bağlantı sorunu
- Dış API çağrısı zaman aşımına uğruyor
- PHP betiğinde sonsuz döngü veya bellek sızıntısı var
Çözüm Adımları
1. Nginx Timeout Değerlerini Artırma
Nginx yapılandırma dosyanızı düzenleyin. Bu ayarlar genellikle /etc/nginx/nginx.conf veya site yapılandırmasında (/etc/nginx/sites-available/) bulunur:
nano /etc/nginx/sites-available/example.com
location bloğuna veya server bloğuna şu direktifleri ekleyin:
server {
# ...
fastcgi_read_timeout 300;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_send_timeout 300;
send_timeout 300;
keepalive_timeout 300;
}
Değişikliği test edip uygulayın:
nginx -t && sudo systemctl reload nginx
2. PHP-FPM Worker Sayısını Artırma
PHP-FPM havuz yapılandırmasını düzenleyin:
nano /etc/php/8.2/fpm/pool.d/www.conf
Şu değerleri güncelleyin:
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.max_requests = 500
; PHP-FPM request timeout
request_terminate_timeout = 300
PHP-FPM'i yeniden başlatın:
sudo systemctl restart php8.2-fpm
Mevcut PHP-FPM durumunu ve process sayısını kontrol etmek için:
ps aux | grep php-fpm | wc -l
# veya status endpoint aktifse:
curl http://localhost/fpm-status
3. PHP Script Timeout Artırma
PHP'nin maksimum çalışma süresini de artırmanız gerekebilir:
nano /etc/php/8.2/fpm/php.ini
# Şu değeri güncelleyin:
max_execution_time = 300
max_input_time = 300
4. Node.js / Proxy Backend Timeout
Backend'inizin Node.js veya başka bir uygulama sunucusu olduğu durumlarda:
location /api/ {
proxy_pass http://127.0.0.1:3000;
proxy_read_timeout 300s;
proxy_connect_timeout 75s;
proxy_send_timeout 300s;
}
5. MySQL Yavaş Sorguları Tespit Etme
504 hatasına yavaş veritabanı sorguları da neden olabilir. MySQL slow query log'u aktifleştirin:
nano /etc/mysql/mysql.conf.d/mysqld.cnf
# Ekleyin:
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
sudo systemctl restart mysql
# Yavaş sorguları inceleyin:
tail -f /var/log/mysql/slow.log
6. Nginx Hata Loglarını İnceleme
Sorunu teşhis etmek için hata loglarını takip edin:
tail -f /var/log/nginx/error.log
tail -f /var/log/nginx/access.log
Özet ve Önleyici Tedbirler
- Nginx ve PHP-FPM timeout değerlerini uygulamanızın gerçek ihtiyacına göre ayarlayın
- PHP-FPM
pm.max_childrendeğerini sunucu RAM'ine göre hesaplayın (RAM / ortalama PHP bellek kullanımı) - MySQL yavaş sorgularını düzenli olarak analiz edin ve indeksleri optimize edin
- Uzun süren işlemleri arka plan job'ları (queue) olarak çalıştırın
- Harici API çağrılarına mutlaka timeout ekleyin ve cache kullanın
- Sunucu kaynaklarını (CPU, RAM, disk I/O) izlemek için Netdata veya Prometheus kullanın
İlgili Makaleler
Yorumlar
Henüz yorum yok. İlk yorumu siz yapın!