504 berarti halamannya masih dibangun ketika Nginx berhenti menunggu. Tidak ada yang jatuh. Ada sesuatu yang makan waktu lebih lama daripada yang diizinkan, dan pertanyaan jujurnya adalah: apa.

Temukan permintaan yang lambat

PHP-FPM menuliskan log kelambatan kalau Anda memintanya, dan ia mencetak persis fungsi apa yang sedang berjalan saat waktunya habis. Itulah seluruh jawabannya, jadi nyalakan dulu sebelum mengubah apa pun yang lain.

; in the pool config
request_slowlog_timeout = 5s
slowlog = /var/log/php8.3-fpm-slow.log
  1. Muat ulang PHP-FPM — systemctl reload php8.3-fpm
  2. Ulangi halaman yang lambat itu — Satu permintaan sudah cukup.
  3. Baca jejaknya — tail -60 /var/log/php8.3-fpm-slow.log — bingkai teratas adalah yang sedang berjalan.

Tiga hal yang biasanya menjadi penyebabnya

  • Panggilan ke luar tanpa tenggat waktu. Gerbang pembayaran atau API yang berhenti menjawab akan menahan halaman Anda selama soketnya masih terbuka. Setiap permintaan keluar butuh tenggat waktunya sendiri, dan lima detik itu sudah murah hati.
  • Kueri tanpa indeks. Tabel yang tahun lalu kecil sekarang tidak lagi kecil. Log kueri lambat menyebut namanya.
  • Perulangan atas sebuah direktori. Folder yang sudah tumbuh sampai seratus ribu berkas butuh bermenit-menit untuk didaftar.
Menaikkan fastcgi_read_timeout membuat galatnya hilang dan membiarkan pengunjung menatap tab kosong selama lima menit, bukan satu. Perbaiki penantiannya, bukan batasnya.

Kapan menaikkannya memang BENAR

Satu keadaan saja: pekerjaan panjang yang memang Anda picu sendiri — sebuah migrasi, impor besar — pada halaman yang hanya Anda pakai. Naikkan untuk lokasi itu saja, jangan pernah secara menyeluruh.

location = /admin/import.php {
    fastcgi_read_timeout 600;
}
Apa pun yang bisa dipicu seorang pengunjung tempatnya di sebuah antrean. Halaman itu memulai pekerjaannya lalu langsung kembali; pekerjaannya sendiri yang melapor setelah selesai.