408 Request Timeout
Penggunaan
Ketika error 408 Request Timeout muncul, klien telah memulai sebuah permintaan tetapi karena suatu alasan belum mengirimkan seluruh payload. Hal ini terjadi ketika koneksi internet lambat atau terputus. Response tersebut menyertakan header Connection yang menyatakan bahwa koneksi telah ditutup.
Setelah menerima header Connection: close, klien mencoba permintaan tersebut kembali.
Catatan
408 Request Timeout berarti klien terlalu lambat mengirimkan permintaan ke server. 504 Gateway Timeout berarti sebuah proxy atau gateway kehabisan waktu saat menunggu server backend merespons. 408 adalah timeout dari klien ke server, sedangkan 504 adalah timeout dari server ke server. 408 merupakan salah satu dari sedikit kode 4xx yang layak dicoba ulang secara otomatis, karena penyebabnya biasanya bersifat sementara.
Dampak SEO
Mesin pencari seperti Google tidak mengindeks URL yang mengembalikan status 408. URL yang sebelumnya terindeks namun kini mengembalikan status code ini akan dihapus dari hasil pencarian.
Contoh
Klien mulai mengirim file PDF berukuran 10K ke server, tetapi koneksi mengalami masalah konektivitas yang terputus-putus dan server menyimpulkan bahwa transmisi terlalu lambat. Server membatalkan permintaan dan menutup koneksi. Ketika koneksi kembali stabil, klien berhasil mengirim ulang file tersebut.
Permintaan awal
PUT /docs HTTP/1.1
Host: example.com
Content-Type: application/pdf
Content-Length: 10000
Response awal
HTTP/1.1 408 Request Timeout
Connection: Close
Content-Type: text/html
Content-Length: 198
<html>
<head>
<title>Connection Close</title>
</head>
<body>
<p>The transmission was not received quickly
enough. Check connectivity and try again.</p>
</body>
</html>
Permintaan berikutnya
PUT /docs HTTP/1.1
Host: example.com
Content-Type: application/pdf
Content-Length: 10000
<File transfer successful for PDF file>
Response akhir
HTTP/1.1 200 OK
Cara memperbaiki
408 Request Timeout berarti server menutup koneksi karena klien tidak menyelesaikan permintaan tepat waktu.
Periksa konektivitas dan latensi jaringan. Koneksi yang tidak stabil atau lambat menunda transmisi permintaan. Jalankan ping dan traceroute ke server untuk mengidentifikasi packet loss atau hop dengan latensi tinggi. Pastikan koneksi stabil sebelum mencoba lagi.
Kurangi ukuran payload atau pecah unggahan berukuran besar. Mengirim file besar melalui koneksi lambat melampaui batas kesabaran server. Kompres payload, gunakan Transfer-Encoding chunked, atau pecah unggahan menjadi bagian-bagian kecil menggunakan API multipart upload.
Tingkatkan pengaturan timeout di sisi klien. Pustaka klien HTTP atau browser menerapkan timeout-nya sendiri. Naikkan nilai timeout koneksi dan pembacaan agar dapat mengakomodasi transfer yang lebih lambat. Pada curl, gunakan —connect-timeout dan —max-time. Pada Python requests, atur timeout=(connect, read).
Verifikasi konfigurasi timeout pada server. Sesuaikan direktif timeout berdasarkan web server yang digunakan:
nginx:
client_header_timeout 60s;
client_body_timeout 60s;
keepalive_timeout 75s;
send_timeout 60s;
Apache:
Timeout 60
KeepAliveTimeout 5
RequestReadTimeout header=20-40 body=20
Direktif RequestReadTimeout (mod_reqtimeout) mengendalikan timeout pembacaan header dan body secara terpisah. Naikkan nilai-nilai ini ketika klien memang membutuhkan waktu lebih banyak.
Sesuaikan pengaturan Keep-Alive. Nilai keepalive_timeout yang rendah menutup koneksi menganggur sebelum klien mengirimkan permintaan berikutnya pada koneksi persisten. Pada nginx, nilai default keepalive_timeout adalah 75 detik. Naikkan nilai tersebut untuk API yang melayani klien dengan pola permintaan yang meledak-ledak. Pada Apache, naikkan KeepAliveTimeout (default 5 detik) dan pastikan MaxKeepAliveRequests mengizinkan jumlah permintaan yang memadai per koneksi.
Periksa timeout pada reverse proxy dan load balancer. Ketika sebuah reverse proxy (nginx, HAProxy, AWS ELB) berada di depan server aplikasi, setiap lapisan menerapkan timeout-nya sendiri. Proxy akan menutup koneksi lebih dahulu jika timeout-nya lebih singkat daripada backend. Pada nginx dalam mode reverse proxy:
proxy_connect_timeout 60s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
AWS ALB memiliki idle timeout default sebesar 60 detik, yang dapat dikonfigurasi pada atribut load balancer.
Coba ulang permintaan. 408 umumnya bersifat sementara. Bangun kembali koneksi dan kirim ulang permintaan secara utuh. Terapkan logika retry otomatis dengan exponential backoff untuk klien programatik. Header Retry-After, bila ada, menentukan berapa lama harus menunggu sebelum mencoba lagi.
Tinjau log error server. nginx mencatat peristiwa timeout pada error log. Apache mencatat pelanggaran mod_reqtimeout. Periksa /var/log/nginx/error.log atau /var/log/apache2/error.log untuk entri yang cocok dengan stempel waktu permintaan guna mengetahui apakah pembacaan header atau body yang mengalami timeout.
Referensi kode
.NET
HttpStatusCode.RequestTimeout
Rust
http::StatusCode::REQUEST_TIMEOUT
Rails
:request_timeout
Go
http.StatusRequestTimeout
Symfony
Response::HTTP_REQUEST_TIMEOUT
Python3.5+
http.HTTPStatus.REQUEST_TIMEOUT
Java
java.net.HttpURLConnection.HTTP_CLIENT_TIMEOUT
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_REQUEST_TIMEOUT
Angular
@angular/common/http/HttpStatusCode.RequestTimeout