504 Gateway Timeout
Penggunaan
Kode status 504 Gateway Timeout berarti server sedang bertindak sebagai proxy atau gateway bagi sebuah server upstream. Setelah menerima permintaan HTTP, server mencoba meneruskan permintaan tersebut ke server upstream, tetapi tidak menerima respons apa pun dalam waktu yang diizinkan.
Hal ini berkaitan dengan kode status 502 Bad Gateway. 502 menunjukkan bahwa server upstream mengembalikan respons yang tidak valid, sedangkan 504 menunjukkan bahwa tidak ada respons yang diterima sama sekali.
Timeout spesifik per platform berbeda-beda. Shopify API menerapkan timeout permintaan 10 detik dan mengembalikan 504 Gateway Timeout ketika respons belum siap dalam rentang waktu tersebut. Pengembang yang bekerja dengan Shopify API harus mengoptimalkan kueri dan menggunakan pemrosesan latar belakang untuk operasi yang melampaui batas ini.
Dampak SEO
Googlebot memperlakukan kesalahan 5xx sebagai sinyal untuk sementara menurunkan laju perayapan di seluruh situs. URL yang sebelumnya terindeks awalnya tetap dipertahankan, tetapi waktu henti yang berkepanjangan membuat Google menghapusnya dari indeks. Konten apa pun yang dikembalikan bersama respons 504 akan diabaikan. Google secara eksplisit mengelompokkan 500, 502, dan 503 bersama-sama sebagai kesalahan server dalam dokumentasinya. 504 termasuk dalam kesalahan 5xx umum yang sama. Kesalahan 5xx pada berkas robots.txt jauh lebih parah, bahkan ketika setiap halaman lain di situs mengembalikan 200. Google menghentikan perayapan hingga 12 jam, lalu kembali menggunakan salinan ter-cache hingga 30 hari. Jika kesalahan tersebut berlanjut, Google sepenuhnya menghapus situs dari indeks. Bingbot juga memperlakukan respons 5xx sebagai kegagalan perayapan. Kesalahan 5xx yang terus-menerus mencegah pengindeksan di Bing.
Contoh
Klien meminta sebuah sumber daya dan server merespons dengan kode status 504 Gateway Timeout karena server upstream tidak mengembalikan respons HTTP.
Permintaan
GET /news HTTP/1.1
Host: example.com
Respons
HTTP/1.1 504 Gateway Timeout
Content-Type: text/html; charset=UTF-8
Content-Length: 128
<html>
<head>
<title>Gateway Timeout</title>
</head>
<body>
<p>The server is not responding.</p>
</body>
</html>
Cara memperbaiki
Proxy mengalami timeout saat menunggu backend merespons. Perbaikannya adalah menaikkan timeout atau membuat backend lebih cepat.
Naikkan timeout proxy.
Di nginx, timeout bawaannya adalah 60 detik. Naikkan direktif yang relevan di blok server atau location:
Di Apache, setel ProxyTimeout 300 di virtual host atau konfigurasi global. Saat menggunakan mod_proxy_fcgi, parameter timeout pada direktif ProxyPassMatch mengontrol lama penantian.
Selaraskan timeout backend. Proses backend memerlukan timeout yang setara atau lebih tinggi. Untuk PHP, naikkan max_execution_time di php.ini dan request_terminate_timeout di konfigurasi pool PHP-FPM. Untuk Node.js, setel server.timeout. Untuk Gunicorn, gunakan —timeout.
Optimalkan operasi backend yang lambat. Timeout adalah gejala dari operasi yang lambat. Lakukan profiling pada permintaan untuk menemukan hambatannya:
Hormati timeout yang ditetapkan platform. Platform terkelola menerapkan batas keras yang lebih pendek daripada nilai bawaan proxy pada umumnya. Shopify menetapkan plafon 10 detik. Untuk operasi yang melampaui batas platform, alihkan pekerjaan ke background job dan lakukan polling untuk hasilnya alih-alih memblokir permintaan HTTP.
Periksa jalur jaringan. Verifikasi konektivitas antara proxy dan backend dengan curl atau telnet. Kehilangan paket, penundaan DNS, atau aturan firewall pada lompatan perantara semuanya berkontribusi pada timeout. Jalankan traceroute untuk mengidentifikasi segmen jaringan yang lambat.
Tambahkan Caching. Untuk permintaan idempoten, Caching respons di lapisan proxy menghindari panggilan berulang ke backend yang lambat. Nginx proxy_cache_path dan Apache mod_cache sama-sama mengurangi beban upstream.
Referensi kode
.NET
HttpStatusCode.GatewayTimeout
Rust
http::StatusCode::GATEWAY_TIMEOUT
Rails
:gateway_timeout
Go
http.StatusGatewayTimeout
Symfony
Response::HTTP_GATEWAY_TIMEOUT
Python3.5+
http.HTTPStatus.GATEWAY_TIMEOUT
Java
java.net.HttpURLConnection.HTTP_GATEWAY_TIMEOUT
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_GATEWAY_TIMEOUT
Angular
@angular/common/http/HttpStatusCode.GatewayTimeout