503 Service Unavailable
Penggunaan
Status code 503 Service Unavailable berarti server tidak dapat memenuhi permintaan HTTP karena alasan yang bersifat sementara. Server kelebihan beban akibat lonjakan trafik mendadak, sumber daya sedang terkunci, server sedang melakukan reboot, atau kesalahan konfigurasi firewall sedang memblokir permintaan tersebut.
Banyak situs mengembalikan status code 503 Service Unavailable selama pemeliharaan situs, dan inilah pendekatan yang direkomendasikan untuk memastikan peringkat pencarian tidak terpengaruh.
Ketika server mengetahui masalahnya, misalnya sumber daya yang terkunci atau kelebihan beban, header HTTP Retry-After memberi tahu klien kapan harus mengirim ulang permintaan.
Amazon S3 mengembalikan 503 Slow Down ketika laju permintaan melampaui batas throughput per-prefix. Lonjakan mendadak di atas ambang batas tersebut memicu throttling sementara S3 menskalakan partisi di latar belakang. Menyebarkan objek ke beberapa prefix, menerapkan exponential backoff, dan menaikkan laju permintaan secara bertahap akan menghindari error ini. S3 tidak mengenakan biaya untuk respons 503.
Fastly mengembalikan 503 Service Unavailable dengan teks alasan “Loop detected” ketika sebuah permintaan tampak dirutekan kembali ke layanan Fastly yang sama atau telah melewati terlalu banyak server Fastly. Fastly melacak jumlah hop permintaan menggunakan header Fastly-FF dan CDN-Loop. Sebuah permintaan ditolak sebagai loop ketika permintaan tersebut melampaui salah satu batas berikut: lebih dari tiga kunjungan sebelumnya ke POP yang sama untuk layanan yang sama, lebih dari enam layanan Fastly unik dalam jalur permintaan, atau lebih dari dua puluh hop total di seluruh layanan. Loop umumnya terjadi ketika hostname yang sama dikonfigurasi sebagai domain sekaligus backend untuk sebuah layanan, dan DNS untuk hostname tersebut mengarah ke Fastly. Menggunakan hostname origin terpisah (misalnya origin.example.re) atau alamat IP untuk backend akan menghindari loop tersebut.
Catatan
503 berarti server tidak tersedia untuk sementara bagi semua klien (kelebihan beban, pemeliharaan). 429 berarti ada klien tertentu yang melampaui batas lajunya. Gunakan 429 untuk throttling per klien dan 503 untuk ketidaktersediaan di seluruh server.
Dampak SEO
Googlebot memperlakukan error 5xx sebagai sinyal untuk menurunkan laju crawl di seluruh situs untuk sementara. URL yang sebelumnya terindeks pada awalnya tetap dipertahankan, tetapi downtime yang berkepanjangan membuat Google menghapusnya dari indeks. Konten apa pun yang dikembalikan bersama respons 503 akan diabaikan. Google memperlakukan 500, 502, dan 503 secara identik. 503 tidak memiliki keunggulan khusus dibanding status code 5xx lainnya untuk pemeliharaan terencana, meskipun saran umum menyatakan sebaliknya. Error 5xx pada file robots.txt jauh lebih parah, bahkan ketika setiap halaman lain di situs mengembalikan 200. Google menghentikan crawling hingga 12 jam, lalu beralih ke salinan cache hingga 30 hari. Jika error terus berlanjut, Google akan menghapus seluruh situs dari indeks. Bingbot menghormati Retry-After pada respons 503 untuk menjadwalkan kunjungan berikutnya. Respons 503 yang terus-menerus mencegah pengindeksan di Bing.
Contoh
Klien meminta sebuah sumber daya dan server merespons dengan 503 Service Unavailable karena sumber daya tersebut tidak tersedia untuk sementara. Header Retry-After menyarankan pengiriman ulang permintaan setelah 30 menit.
Permintaan
GET /latest_quotes HTTP/1.1
Host: example.com
Respons
HTTP/1.1 503 Service Unavailable
Content-Type: text/html; charset=UTF-8
Content-Length: 124
Retry-After: 1800
<html>
<head>
<title>Resource Busy</title>
</head>
<body>
<p>Try again after 30 minutes.</p>
</body>
</html>
Cara memperbaiki
Tentukan apakah 503 tersebut disengaja (mode pemeliharaan) atau tidak terencana (kelebihan beban, crash). 503 yang disengaja dan dipasangkan dengan header Retry-After tidak memerlukan debugging, hanya perlu menunggu pemeliharaan selesai.
Untuk error 503 yang tidak terencana, periksa penyebab umum berikut:
Sumber daya server habis. Jalankan top, htop, atau vmstat di server. Penggunaan CPU atau memori yang tinggi berarti server kekurangan kapasitas. Di Apache, log error menampilkan “server reached MaxRequestWorkers setting” ketika semua slot worker terisi. Naikkan MaxRequestWorkers (dan ServerLimit untuk prefork MPM) pada konfigurasi Apache. Di nginx, naikkan worker_connections di blok events.
Crash pada pool aplikasi. PHP-FPM, Gunicorn, atau process manager serupa yang keluar saat menerima beban membuat web server tidak memiliki backend untuk melayani permintaan. Periksa log process manager, lalu perbesar ukuran pool (pm.max_children di PHP-FPM, —workers di Gunicorn).
Connection pool habis. Connection pool database atau API eksternal yang kering memaksa aplikasi menolak permintaan baru. Perbesar ukuran pool pada konfigurasi aplikasi dan pastikan koneksi dilepaskan dengan benar setelah digunakan.
Rate limiting. Modul limit_req dan limit_conn pada nginx mengembalikan 503 (atau status kustom) ketika ambang batas terlampaui. Tinjau direktif limit_req_zone dan limit_conn_zone. Naikkan nilai burst atau tambahkan nodelay untuk menyerap lonjakan trafik.
Kegagalan health check load balancer. Health check yang gagal mengeluarkan server dari rotasi. Di AWS ALB/NLB, periksa kesehatan target pada konsol. Di blok upstream nginx, tinjau pengaturan max_fails dan fail_timeout.
Restart akibat deployment. Rolling deployment dengan jumlah instance yang terlalu sedikit menyebabkan jendela 503 yang singkat. Tingkatkan jumlah minimum instance yang sehat atau gunakan blue-green deployment.
Throttling AWS S3 (503 Slow Down). S3 melakukan throttling terhadap permintaan yang melampaui batas laju permintaan per-prefix. Sebarkan objek ke beberapa prefix menggunakan prefix key acak (misalnya hex-hash/original-key). Terapkan exponential backoff yang dimulai dari 1 detik. Naikkan laju permintaan secara bertahap alih-alih mengirim trafik burst. AWS SDK mencoba ulang respons 503 SlowDown secara otomatis dengan backoff jika dikonfigurasi dengan benar.
Untuk lonjakan trafik, tambahkan lapisan CDN atau Caching untuk mengalihkan permintaan statis. Siapkan pemantauan dan peringatan pada tingkat 503 sehingga keterbatasan sumber daya terlihat sebelum terjadi outage penuh.
Referensi kode
.NET
HttpStatusCode.ServiceUnavailable
Rust
http::StatusCode::SERVICE_UNAVAILABLE
Rails
:service_unavailable
Go
http.StatusServiceUnavailable
Symfony
Response::HTTP_SERVICE_UNAVAILABLE
Python3.5+
http.HTTPStatus.SERVICE_UNAVAILABLE
Java
java.net.HttpURLConnection.HTTP_UNAVAILABLE
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_SERVICE_UNAVAILABLE
Angular
@angular/common/http/HttpStatusCode.ServiceUnavailable