membahas cara teknis mengatasi masalah PHP-FPM yang hang sehingga Nginx menampilkan 504 Gateway Timeout, lengkap dengan langkah praktis dan rekomendasi optimasi.
Contents
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:
| Penyebab | Penjelasan |
|---|---|
| Request menunggu resource eksternal | API, server lain, atau file network yang lambat. |
| Session file lock | Jika session disimpan di file, request lain menunggu release lock. |
| Query database lambat | Query berat, JOIN kompleks, atau deadlock. |
| DNS atau network blocking | Fungsi PHP menunggu resolusi DNS atau koneksi jaringan. |
| Bot / malicious request | Request 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
- 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
- Restart PHP-FPM:
sudo systemctl restart php7.4-fpm
- 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
- Batasi request ke resource eksternal dengan timeout yang wajar.
- Gunakan cache untuk query atau API response yang sering diakses.
- Pertimbangkan load balancing atau scaling PHP-FPM jika ada traffic tinggi.
- 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.