PHP-FPM Bisa ‘Hang’ dan Menyebabkan Nginx Connection Timeout? Ini Solusinya

PHP-FPM Bisa ‘Hang’ dan Menyebabkan Nginx Connection Timeout? Ini Solusinya

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.


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:

PenyebabPenjelasan
Menunggu resource eksternalAPI, server lain, atau file network yang lambat.
Session / file lockPHP menggunakan session file → request lain menunggu release lock.
Query database lambatQuery tanpa index, JOIN kompleks, atau deadlock.
Network / DNS lambatFungsi seperti file_get_contents() atau gethostbyname() menunggu resolusi.
Request bot / maliciousBot 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_timeout biasanya 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

  1. 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
  1. 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

  1. Batasi timeout operasi blocking:
  • cURL:
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
  • file_get_contents / fopen:
stream_context_create(['http'=>['timeout'=>10]]);
  1. Optimalkan query database:
  • Gunakan index, batasi JOIN, periksa slow query log.
  1. Batasi max_execution_time di PHP:
max_execution_time = 120
  1. Sesuaikan Nginx timeout sementara:
fastcgi_read_timeout 300s;
  1. 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.