HTTPQUERY
Bahasa Indonesia

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