Server

504 Gateway Timeout — Penyebab dan Cara Mengatasinya

Diperbarui 2026-08-30Baca ~9 menit

504 Gateway Timeout berarti server di depan — biasanya Nginx atau sebuah load balancer — meneruskan permintaan Anda ke backend, menunggu, lalu menyerah. Backend tidak menolak, tidak crash; ia hanya belum sempat menjawab.

Membedakan ini dari 502 menghemat banyak waktu. 502 berarti backend mengembalikan sesuatu yang tidak masuk akal atau sudah mati; 504 berarti ia masih berjalan, masih bekerja, hanya lebih lambat daripada batas kesabaran yang dikonfigurasi. Hampir semua perbaikan 504 bermuara pada dua hal: mempercepat pekerjaannya, atau menaikkan batas tunggu — dan urutan itu sebaiknya tidak dibalik.

Beda 504 dengan 502, 503, dan 408

Keempatnya muncul saat ada yang salah antara proxy dan aplikasi, tetapi masing-masing menunjuk ke tempat yang berbeda.

KodeApa yang terjadiPeriksa dulu
504 Gateway TimeoutBackend hidup tapi menjawab terlalu lambatQuery lambat, API eksternal, proses panjang
502 Bad GatewayBackend mati atau balasannya rusakLog crash PHP-FPM, Node, Gunicorn
503 Service UnavailableServer menolak menerima pekerjaan baruAntrean penuh, maintenance, rate limit
408 Request TimeoutKlien mengirim permintaan terlalu lambatJaringan pengguna, upload besar
💡 Kalau 502 dan 504 muncul bergantian di halaman yang sama, biasanya backend melambat lalu dibunuh process manager karena melewati batas waktu — perbaiki bagian lambatnya, kedua kode itu hilang bersamaan.

Timeout mana yang sebenarnya habis

Inilah yang membuat 504 lebih menyebalkan dari seharusnya: satu permintaan melewati beberapa lapisan, masing-masing punya hitungan mundur sendiri, dan lapisan yang habis lebih dulu menentukan pesan yang Anda lihat. Menaikkan angka yang salah tidak mengubah apa pun.

LapisanParameter umumNilai bawaan tipikal
Nginx → backendproxy_read_timeout60 detik
Nginx → PHP-FPMfastcgi_read_timeout60 detik
PHPmax_execution_time30 detik
PHP-FPMrequest_terminate_timeoutbiasanya nonaktif
Cloudflare (paket gratis)timeout tetap100 detik — tidak bisa diubah
💡 Kalau Anda memakai Cloudflare paket gratis, batas 100 detik itu keras. Tidak ada konfigurasi server yang bisa melewatinya — permintaan yang lebih lama harus dipindah ke proses latar belakang.

Penyebab umum, dari yang paling sering

  • Query database lambat. Penyebab nomor satu, hampir selalu satu query tanpa index yang memindai seluruh tabel setelah datanya membesar.
  • Panggilan API eksternal tanpa timeout. Aplikasi Anda menunggu layanan pihak ketiga yang sedang lambat, dan karena tidak ada batas waktu, ia menunggu selamanya.
  • Pekerjaan berat dijalankan di dalam permintaan HTTP. Ekspor laporan, kirim email massal, pemrosesan gambar — semua itu milik antrean latar belakang, bukan siklus permintaan.
  • Worker habis. Semua proses PHP-FPM atau Node sibuk dengan permintaan lambat, sehingga permintaan baru mengantre sampai waktunya habis sebelum sempat diproses.
  • Cron yang tumpang tindih. wp-cron di situs ramai terpicu setiap kunjungan, menumpuk, dan menghabiskan worker.
  • Server kehabisan RAM lalu mulai swap. Semua tetap berjalan, hanya puluhan kali lebih lambat, dan timeout muncul di seluruh situs.
  • Plugin atau pustaka yang mengakses jaringan saat halaman dimuat. Cek pembaruan, validasi lisensi, memuat font jarak jauh — masing-masing menambah beberapa detik.

Periksa dengan urutan ini

  • Tentukan apakah error terjadi di semua halaman atau hanya beberapa. Seluruh situs lambat biasanya soal sumber daya server; satu halaman lambat hampir selalu satu query atau satu panggilan eksternal di halaman itu.
  • Ukur waktu respons sebenarnya dengan "curl -o /dev/null -s -w '%{time_total}\n' https://situsanda.com/". Angkanya memberi tahu apakah Anda mepet di ambang batas atau jauh melewatinya.
  • Aktifkan slow query log MySQL dengan ambang 1 detik lalu biarkan beberapa menit. Ini langkah dengan hasil tercepat di seluruh daftar ini.
  • Baca error log Nginx. Baris "upstream timed out" menyebutkan backend dan endpoint mana yang kehabisan waktu.
  • Periksa RAM dan swap dengan "free -m". Kalau swap dipakai banyak, tangani memori dulu — sisanya cuma mengobati gejala.
  • Hitung worker yang sibuk dibanding totalnya. PHP-FPM punya halaman status; kalau selalu menyentuh pm.max_children, masalahnya antrean, bukan timeout itu sendiri.
  • Nonaktifkan sementara komponen yang memanggil layanan eksternal. Kalau 504 hilang, pelakunya ketemu dan Anda bisa memberi timeout pendek untuk panggilan itu.
  • Naikkan timeout hanya setelah tahu persis apa yang lambat, dan lakukan sebagai langkah sementara yang disengaja, bukan sebagai perbaikan.
💡 Menaikkan proxy_read_timeout ke 300 detik menghilangkan 504 tapi menggantinya dengan halaman yang butuh 4 menit. Pengunjung sudah pergi jauh sebelum selesai, jadi satu-satunya yang berubah adalah pesan errornya.

Memperbaiki akar masalahnya

Setelah tahu apa yang lambat, penanganannya hampir selalu jatuh ke salah satu dari tiga kelompok berikut.

Tambahkan index untuk query lambat. Kolom yang sering difilter tanpa index memaksa database membaca seluruh tabel di setiap permintaan. Jalankan EXPLAIN pada query terlambat di log; kalau terlihat pemindaian penuh, Anda sudah menemukan pekerjaannya dan biasanya selesai kurang dari semenit.

Keluarkan pekerjaan panjang dari siklus permintaan. Ekspor file, kirim email, buat thumbnail, dan sinkronisasi data sebaiknya berjalan di antrean latar belakang, sementara permintaan HTTP langsung menjawab bahwa pekerjaan sudah diterima. Ini perubahan paling memakan tenaga, tapi juga yang menghapus seluruh kelas error 504 secara permanen.

Beri timeout pada setiap panggilan keluar. Setiap permintaan ke layanan pihak ketiga harus punya batas beberapa detik dan penanganan kegagalan. Tanpa itu, API lambat di belahan dunia lain langsung menjadi halaman error Anda.

Kalau semuanya sudah wajar tapi server tetap tidak sanggup, barulah masalahnya benar-benar sumber daya. CPU selalu tinggi, RAM selalu habis, dan swap aktif terus adalah tanda nyata untuk upgrade — berbeda dengan upgrade hanya karena melihat 504.

Butuh sumber daya yang cukup agar tak berlomba dengan timeout?

Cloud VPS NVMe dengan akses root penuh — atur sendiri timeout, slow query log, dan jumlah worker. Mulai ฿150/bulan.

Pertanyaan yang Sering Diajukan

Saya sudah menaikkan timeout tapi 504 tetap muncul. Kenapa?

Karena Anda menaikkan lapisan yang salah. Permintaan melewati Nginx, lalu PHP-FPM atau application server, lalu database, dan setiap lapisan punya timeout sendiri — yang terpendek yang menang. Kalau situs berada di belakang Cloudflare paket gratis, ada pula batas keras 100 detik yang tidak bisa dilewati konfigurasi server mana pun.

Apakah 504 memengaruhi SEO?

Ya, kalau berlangsung lama. Googlebot yang menemui 504 akan mencoba lagi nanti, dan beberapa kejadian sesekali hampir tidak berdampak. Tapi timeout terus-menerus selama berhari-hari menurunkan laju crawl dan akhirnya membuat halaman keluar dari indeks. Laporan Crawl stats di Search Console menunjukkan berapa banyak error yang benar-benar ditemui Googlebot.

Kenapa 504 hanya muncul saat jam ramai?

Karena yang habis adalah worker, bukan waktu. Saat semua proses sibuk, permintaan baru mengantre dan hitungan timeout sudah berjalan sebelum ada yang memprosesnya. Cari query lambat yang menahan worker terlalu lama, alih-alih menambah worker lalu kehabisan RAM.

Admin WordPress saya 504 tapi halaman publiknya normal. Kenapa?

Karena halaman admin tidak di-cache dan menjalankan jauh lebih banyak query. Penyebab tersering adalah tabel wp_options yang membengkak oleh transient kedaluwarsa, atau plugin yang mengecek pembaruan saat halaman dimuat. Bersihkan transient lama dan matikan plugin satu per satu untuk menemukan pelakunya.