Mengatasi Nginx 504 Gateway Timeout: PHP-FPM Worker yang Terjebak

Mengatasi Nginx 504 Gateway Timeout: PHP-FPM Worker yang Terjebak

membahas cara teknis mengatasi masalah PHP-FPM yang hang sehingga Nginx menampilkan 504 Gateway Timeout, lengkap dengan langkah praktis dan rekomendasi optimasi.


1. Gejala Nginx 504 Gateway Timeout

504 Gateway Timeout terjadi ketika Nginx tidak menerima response dari PHP-FPM dalam batas waktu tertentu (fastcgi_read_timeout). Tanda-tandanya:

  • Browser menampilkan 504 Gateway Timeout.
  • Log Nginx menunjukkan request tertunda, contohnya:
upstream timed out (110: Connection timed out) while reading response header from upstream
  • Log PHP-FPM menunjukkan worker yang berjalan sangat lama, misal:
[pool www] child 515958 exited with code 0 after 2529.933860 seconds

Artinya PHP-FPM worker hang, tapi server tidak crash.


2. Penyebab Utama Worker PHP-FPM Terjebak

Berdasarkan pengalaman operasional server, penyebab umum worker PHP-FPM hang adalah:

PenyebabPenjelasan
Request menunggu resource eksternalAPI, server lain, atau file network yang lambat.
Session file lockJika session disimpan di file, request lain menunggu release lock.
Query database lambatQuery berat, JOIN kompleks, atau deadlock.
DNS atau network blockingFungsi PHP menunggu resolusi DNS atau koneksi jaringan.
Bot / malicious requestRequest abnormal atau scanner mencoba exploit → worker tertahan.

Efek: Worker tertahan → Nginx menunggu → timeout → 504.


3. Cara Menemukan Worker yang Terjebak

A. Aktifkan PHP-FPM Slowlog

  1. Edit pool PHP-FPM:
sudo nano /etc/php/7.4/fpm/pool.d/www.conf

Tambahkan / ubah:

request_slowlog_timeout = 30s
slowlog = /var/log/php7.4-fpm.slow.log
  1. Restart PHP-FPM:
sudo systemctl restart php7.4-fpm
  1. Setelah itu, semua request >30 detik akan dicatat dengan URL, file, dan baris code.

B. Monitor Slowlog

sudo tail -f /var/log/php7.4-fpm.slow.log
  • Hasil slowlog akan menunjukkan request mana yang membuat worker hang.
  • Bisa dites dengan script dummy:
<?php
sleep(35);
echo "Test slowlog";

C. Gunakan status PHP-FPM

Tambahkan di www.conf:

pm.status_path = /status
  • Akses:
http://yourdomain/status
  • Bisa melihat jumlah active, idle, dan slow request realtime.

4. Cara Mengatasi Worker PHP-FPM Hang

Berikut langkah praktis untuk mengurangi atau menghilangkan 504 Gateway Timeout akibat worker hang:

A. Batasi timeout operasi blocking

  • cURL:
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
  • file_get_contents / fopen:
stream_context_create(['http'=>['timeout'=>10]]);

B. Optimalkan Database

  • Gunakan index, batasi JOIN kompleks.
  • Periksa slow query log dan optimalkan query yang lambat.

C. Batasi max_execution_time

max_execution_time = 120
  • Worker akan dihentikan jika melebihi batas waktu eksekusi.

D. Sesuaikan Timeout Nginx

fastcgi_read_timeout 300s;
  • Tingkatkan sementara jika ada request panjang yang sah, tapi jangan terlalu besar.

E. Monitor Slowlog Secara Berkala

  • Identifikasi URL, script, atau resource eksternal yang sering membuat worker hang.
  • Perbaiki kode atau batasi penggunaan resource yang lambat.

5. Pencegahan Jangka Panjang

  1. Batasi request ke resource eksternal dengan timeout yang wajar.
  2. Gunakan cache untuk query atau API response yang sering diakses.
  3. Pertimbangkan load balancing atau scaling PHP-FPM jika ada traffic tinggi.
  4. Audit dan batasi bot/malicious request untuk mencegah worker tertahan.

Kesimpulan

  • Worker PHP-FPM hang → menyebabkan Nginx 504 Gateway Timeout.
  • Penyebab utama biasanya request tertahan / blocking, bukan script berat.
  • PHP-FPM slowlog dan monitoring status pool adalah alat penting untuk menemukan akar masalah.
  • Optimasi script, query, timeout, dan resource eksternal → server responsif kembali.