Jika Anda mengelola server web berbasis PHP, mungkin pernah mengalami situasi di mana website tiba-tiba lambat, atau muncul 504 Gateway Timeout di browser. Meski script PHP terlihat ringan dan database tidak besar, worker PHP-FPM bisa “hang” selama puluhan menit, membuat server tidak responsif.
Artikel ini menjelaskan penyebab, hubungan dengan Nginx, dan cara mengatasinya.
Contents
1. Gejala PHP-FPM Lambat
Log PHP-FPM sering menunjukkan sesuatu seperti:
[pool www] child 515958 exited with code 0 after 2529.933860 seconds from start
- Code 0 → worker PHP-FPM keluar normal, tidak crash.
- Waktu eksekusi >2500 detik (~42 menit) → jauh lebih lama dari normal (<1–5 detik).
- Request yang lama ini menyebabkan Nginx menunggu terlalu lama → muncul Connection Timeout / 504 Gateway Timeout.
Jadi meski PHP-FPM sendiri tidak error, Nginx akan “memutus” koneksi karena menunggu response terlalu lama.
2. Penyebab Worker PHP-FPM Lambat
Jika script PHP ringan, penyebab lambat biasanya terkait request tertahan atau blocking, seperti:
| Penyebab | Penjelasan |
|---|---|
| Menunggu resource eksternal | API, server lain, atau file network yang lambat. |
| Session / file lock | PHP menggunakan session file → request lain menunggu release lock. |
| Query database lambat | Query tanpa index, JOIN kompleks, atau deadlock. |
| Network / DNS lambat | Fungsi seperti file_get_contents() atau gethostbyname() menunggu resolusi. |
| Request bot / malicious | Bot mencoba exploit → worker tertahan menunggu input, meski script ringan. |
Kesimpulan: PHP-FPM worker “hang” bukan karena script besar, tapi karena menunggu resource eksternal atau blocking, sehingga Nginx juga timeout.
3. Hubungan PHP-FPM Lambat dan Nginx Timeout
- Nginx bertindak sebagai reverse proxy ke PHP-FPM via FastCGI.
- Jika worker PHP-FPM tertahan >timeout Nginx (
fastcgi_read_timeoutbiasanya 60–120 detik), Nginx memutus koneksi → 504 Gateway Timeout. - Worker PHP-FPM tetap berjalan di backend, sehingga slot worker bisa penuh → request lain antre → website melambat atau tidak responsif.
Ilustrasi alurnya:
Client → Nginx → PHP-FPM Worker → Database/API/File
← 504 Timeout jika PHP-FPM terlalu lama
4. Cara Menemukan Script atau URL Lambat
A. Aktifkan PHP-FPM Slowlog
- Edit file pool PHP-FPM (
www.conf):
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
- Semua request >30 detik akan dicatat di slowlog, termasuk URL, file, dan baris script yang tertahan.
B. Cek Slowlog
sudo tail -f /var/log/php7.4-fpm.slow.log
- Akan muncul detail script yang tertahan.
- Bisa dicoba dengan script test:
<?php
sleep(35); // request >30 detik
echo "Test slowlog";
C. Monitor PHP-FPM Status Realtime
Tambahkan di www.conf:
pm.status_path = /status
- Reload PHP-FPM, akses:
http://yourdomain/status
- Bisa melihat jumlah active, idle, dan slow request secara realtime.
5. Cara Mengatasi Worker PHP-FPM Lambat
- Batasi timeout operasi blocking:
- cURL:
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
- file_get_contents / fopen:
stream_context_create(['http'=>['timeout'=>10]]);
- Optimalkan query database:
- Gunakan index, batasi JOIN, periksa slow query log.
- Batasi
max_execution_timedi PHP:
max_execution_time = 120
- Sesuaikan Nginx timeout sementara:
fastcgi_read_timeout 300s;
- Gunakan slowlog untuk analisa:
- Ketahui URL dan script yang membuat worker >40 menit → optimalkan script atau resource eksternal.
6. Kesimpulan
- Worker PHP-FPM yang berjalan >40 menit sangat abnormal, bahkan untuk script ringan.
- Penyebab utama adalah request tertahan / blocking, bukan script berat.
- Nginx akan mengalami Connection Timeout / 504 jika worker PHP-FPM terlalu lama.
- PHP-FPM slowlog adalah alat paling efektif untuk menemukan URL dan baris script yang bermasalah.
- Setelah diketahui, optimalkan script, query, dan resource eksternal → server kembali responsif.