15%

Hemat 15% di Semua Layanan Hosting

Uji kemampuanmu dan dapatkan Diskon pada paket hosting apa saja

Gunakan kode:

Skills
Memulai
10.10.2024

Cara Mengatasi Error 429 Too Many Requests

Kesalahan 429 Too Many Requests adalah kode status HTTP yang didefinisikan dalam RFC 6585 yang menandakan bahwa klien telah melampaui batas kecepatan yang diberlakukan oleh server atau proxy perantara. Server menolak permintaan lebih lanjut hingga jendela pembatasan kecepatan direset, dan secara opsional mengembalikan header Retry-After yang menunjukkan berapa lama klien harus menunggu.

Tidak seperti 503 Service Unavailable, yang mencerminkan kegagalan kapasitas sisi server, 429 adalah penolakan yang disengaja dan berbasis kebijakan. Memahami perbedaan tersebut sangat penting: solusinya tidak selalu tentang penskalaan infrastruktur — melainkan tentang mengidentifikasi *siapa* yang mengirim terlalu banyak permintaan, *mengapa*, dan kemudian memperbaiki perilaku tersebut pada lapisan tumpukan yang tepat.

Apa yang Sebenarnya Menyebabkan Kesalahan 429

Kesalahan ini muncul di beberapa lapisan, dan mencampuradukkannya menyebabkan kesalahan diagnosis. Akar penyebabnya termasuk dalam salah satu dari empat kategori:

  • Pembatasan kecepatan sisi server — Server web (Apache, Nginx), reverse proxy (HAProxy, Varnish), atau node edge CDN (Cloudflare, Fastly) memberlakukan ambang batas permintaan per-IP atau per-token.
  • Pembatasan lapisan aplikasi — Plugin WordPress, middleware khusus, atau gateway API memberlakukan batas mereka sendiri secara independen dari server web.
  • Kelelahan kuota API pihak ketiga — Aplikasi Anda memanggil API eksternal (Google Maps, Stripe, OpenAI) lebih cepat dari yang diizinkan kuota penyedia, dan 429 diteruskan kembali ke pengguna akhir.
  • Lalu lintas otomatis yang berbahaya atau tidak terkendali — Upaya login brute-force, scraper agresif, skrip pemantauan yang salah konfigurasi, atau crawler yang ditulis dengan buruk menghabiskan anggaran permintaan.

Kasus tepi yang sering terlewatkan: lingkungan shared hosting di mana lonjakan lalu lintas penyewa tetangga menghabiskan connection pool bersama, menyebabkan aplikasi Anda menerima respons 429 dari load balancer upstream meskipun kode Anda sendiri berperilaku baik. Jika Anda menggunakan paket Shared Web Hosting dan melihat lonjakan 429 yang terputus-putus tanpa lonjakan yang sesuai dalam lalu lintas Anda sendiri, ini adalah hipotesis pertama yang perlu diuji.

Langkah 1: Identifikasi Sumber Permintaan Berlebihan

Memperbaiki 429 tanpa mengidentifikasi asalnya hanyalah tebakan. Mulailah dengan data.

Membaca Log Akses Apache

grep " 429 " /var/log/apache2/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -20

Perintah ini mengekstrak setiap respons 429, menghitung kemunculan per alamat IP, dan mengurutkannya. IP yang muncul ribuan kali dalam beberapa menit kemungkinan adalah bot, skrip yang salah konfigurasi, atau penyerang.

Membaca Log Akses Nginx

awk '$9 == 429 {print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20

Mengkorelasikan dengan Path Permintaan

grep " 429 " /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -20

Jika /wp-login.php atau /xmlrpc.php mendominasi output, Anda menghadapi kampanye brute-force atau credential-stuffing. Jika endpoint API seperti /api/v1/search berada di urutan teratas, pelakunya kemungkinan adalah klien yang salah konfigurasi atau scraper.

Menggunakan fail2ban untuk Menemukan Pola

fail2ban-client status
fail2ban-client status nginx-req-limit

Jika fail2ban dikonfigurasi dengan jail nginx-req-limit, ini akan menunjukkan kepada Anda dengan tepat IP mana yang telah diblokir karena pelanggaran batas kecepatan, menghemat waktu parsing log yang signifikan.

Langkah 2: Konfigurasi Pembatasan Kecepatan di Tingkat Server Web

Apache: Menggunakan mod_ratelimit dan mod_evasive

Cuplikan .htaccess yang umum beredar online menggunakan mod_rewrite untuk mengembalikan 403, bukan 429 yang tepat. Pendekatan yang lebih semantis benar dan operasional yang baik menggunakan mod_evasive untuk mitigasi DoS.

Instal dan konfigurasi mod_evasive di Debian/Ubuntu:

apt install libapache2-mod-evasive
a2enmod evasive

Kemudian tambahkan ke virtual host Apache atau konfigurasi global Anda:

<IfModule mod_evasive20.c>
    DOSHashTableSize    3097
    DOSPageCount        5
    DOSSiteCount        50
    DOSPageInterval     1
    DOSSiteInterval     1
    DOSBlockingPeriod   10
    DOSEmailNotify      admin@yourdomain.com
    DOSLogDir           /var/log/mod_evasive
</IfModule>

Ini memblokir IP mana pun yang mengakses halaman yang sama lebih dari 5 kali per detik, atau seluruh situs lebih dari 50 kali per detik, selama periode pendinginan 10 detik.

Untuk respons 429 yang tepat melalui .htaccess di Apache dengan mod_rewrite, Anda memerlukan dokumen kesalahan khusus:

ErrorDocument 429 "Too Many Requests"

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTP_USER_AGENT} ^.*(SemrushBot|AhrefsBot|MJ12bot|DotBot).*$ [NC]
    RewriteRule .* - [R=429,L]
</IfModule>

Nginx: limit_req_zone dengan Penanganan Burst yang Tepat

ngx_http_limit_req_module Nginx adalah salah satu alat pembatasan kecepatan yang paling efektif yang tersedia. Parameter utama yang sering salah dikonfigurasi adalah burst dan nodelay.

Di /etc/nginx/nginx.conf atau file include khusus:

http {
    # Zone keyed by client IP, 10MB shared memory, 10 requests/second baseline
    limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
    limit_req_zone $binary_remote_addr zone=login_limit:10m rate=1r/s;

    # Return 429 instead of the default 503
    limit_req_status 429;

    server {
        location /api/ {
            limit_req zone=api_limit burst=20 nodelay;
        }

        location /wp-login.php {
            limit_req zone=login_limit burst=3 nodelay;
        }
    }
}

Nuansa penting: Tanpa limit_req_status 429, Nginx mengembalikan 503 untuk permintaan yang dibatasi kecepatannya secara default. Mengaturnya ke 429 secara semantis benar dan memungkinkan klien mengimplementasikan logika backoff Retry-After yang tepat.

nodelay vs. tanpa flag:

  • Tanpa nodelay: permintaan berlebih mengantri dan dilayani dengan penundaan tambahan, menghabiskan koneksi worker.
  • Dengan nodelay: permintaan berlebih di luar burst langsung ditolak dengan 429, membebaskan sumber daya lebih cepat. Gunakan nodelay untuk endpoint login dan API publik.

Menambahkan Header Retry-After

Klien yang mematuhi RFC 6585 akan menghormati header Retry-After. Di Nginx, tambahkan ke respons kesalahan:

location /api/ {
    limit_req zone=api_limit burst=20 nodelay;
    add_header Retry-After 60 always;
}

Langkah 3: Diagnosis dan Perbaiki Konflik Plugin WordPress

WordPress adalah sumber umum kesalahan 429 yang disebabkan sendiri. Plugin yang melakukan polling API eksternal pada setiap pemuatan halaman — alat SEO yang mengambil data kata kunci, plugin analitik yang memanggil server, atau ekstensi WooCommerce yang mengkueri gateway pembayaran — dapat menghabiskan batas kecepatan dengan cepat.

Prosedur isolasi sistematis:

  1. Nonaktifkan semua plugin melalui dasbor WordPress atau, jika dasbor tidak dapat diakses, melalui WP-CLI:
wp plugin deactivate --all
  1. Aktifkan kembali plugin satu per satu, lakukan pengujian setelah setiap aktivasi:
wp plugin activate plugin-slug
  1. Pantau log akses di terminal terpisah saat mengaktifkan kembali:
tail -f /var/log/nginx/access.log | grep " 429 "
  1. Setelah plugin yang bermasalah teridentifikasi, periksa pengaturannya untuk interval polling API atau opsi frekuensi permintaan sebelum menonaktifkannya secara permanen.

Pelanggar umum: Jetpack (modul statistik dan sinkronisasi), Yoast SEO (saat terhubung ke MyYoast), WooCommerce Subscriptions, dan plugin apa pun yang menggunakan wp_remote_get() bawaan WordPress dalam loop tanpa caching transient.

Solusi yang benar hampir tidak pernah menghapus plugin — melainkan memastikan respons API di-cache menggunakan transient WordPress:

$cached = get_transient( 'my_api_response' );
if ( false === $cached ) {
    $response = wp_remote_get( 'https://api.example.com/data' );
    set_transient( 'my_api_response', $response, HOUR_IN_SECONDS );
    $cached = $response;
}

Langkah 4: Implementasikan Throttling Permintaan API dalam Kode Aplikasi

Ketika aplikasi Anda adalah *klien* yang mengakses API pihak ketiga, Anda bertanggung jawab untuk menghormati batas kecepatan mereka. Mengandalkan penangkapan respons 429 secara reaktif adalah rekayasa yang buruk — implementasikan throttling proaktif.

Node.js dengan p-throttle

import pThrottle from 'p-throttle';

const throttle = pThrottle({
    limit: 10,       // max 10 calls
    interval: 1000   // per 1000ms (1 second)
});

const throttledFetch = throttle(async (url) => {
    const response = await fetch(url);
    return response.json();
});

Python dengan tenacity untuk Exponential Backoff

Throttling saja tidak cukup jika API memberlakukan batas burst. Kombinasikan throttling dengan exponential backoff pada respons 429:

import requests
from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception

def is_rate_limited(exception):
    return (
        isinstance(exception, requests.HTTPError)
        and exception.response.status_code == 429
    )

@retry(
    retry=retry_if_exception(is_rate_limited),
    wait=wait_exponential(multiplier=1, min=2, max=60),
    stop=stop_after_attempt(5)
)
def call_api(url):
    response = requests.get(url)
    response.raise_for_status()
    return response.json()

Ini mencoba ulang hingga 5 kali dengan exponential backoff (2 detik, 4 detik, 8 detik, 16 detik, 32 detik), dibatasi hingga 60 detik — sebuah pola yang menghormati infrastruktur penyedia API sambil memulihkan diri dengan baik.

Menghormati Header Retry-After

Jika API mengembalikan header Retry-After, gunakan itu alih-alih backoff tetap:

def call_with_retry_after(url):
    response = requests.get(url)
    if response.status_code == 429:
        retry_after = int(response.headers.get("Retry-After", 5))
        time.sleep(retry_after)
        return call_with_retry_after(url)
    response.raise_for_status()
    return response.json()

Langkah 5: Blokir dan Kelola Bot di Beberapa Lapisan

Bot jarang mengumumkan diri mereka secara jujur, tetapi mereka meninggalkan sidik jari dalam string user-agent, pola permintaan, dan anomali header.

Blokir Bot Buruk yang Dikenal di Nginx

map $http_user_agent $bad_bot {
    default         0;
    ~*SemrushBot    1;
    ~*AhrefsBot     1;
    ~*MJ12bot       1;
    ~*DotBot        1;
    ~*PetalBot      1;
    ~*serpstatbot   1;
}

server {
    if ($bad_bot) {
        return 429;
    }
}

Kelola Kecepatan Crawl melalui robots.txt

User-agent: Googlebot
Crawl-delay: 2

User-agent: *
Crawl-delay: 10

Perhatikan bahwa Crawl-delay tidak dihormati oleh semua crawler, tetapi ini menandakan niat dan dihormati oleh Bing, Yandex, dan sebagian besar bot yang berperilaku baik.

Integrasi Web Application Firewall (WAF)

WAF yang beroperasi di edge CDN (Cloudflare, AWS WAF, Sucuri) dapat memberlakukan batas kecepatan sebelum lalu lintas mencapai server asal Anda, secara dramatis mengurangi beban. Aturan Rate Limiting Cloudflare, misalnya, dapat dikonfigurasi untuk menantang atau memblokir IP yang melampaui ambang batas tanpa perubahan apa pun pada konfigurasi server asal Anda — keuntungan operasional yang signifikan untuk situs dengan lalu lintas tinggi.

Langkah 6: Sesuaikan Pengaturan Plugin Keamanan di WordPress

Jika Anda menggunakan Wordfence, ambang batas pembatasan kecepatan sering ditetapkan secara konservatif dan dapat memicu false positive untuk pengguna yang sah, terutama pada situs dengan penggunaan AJAX yang berat atau aktivitas pengguna yang sudah login.

Navigasikan ke Wordfence > Firewall > All Firewall Options > Rate Limiting dan tinjau:

  • Bagaimana kita harus memperlakukan crawler Google — atur ke "Verified Google crawlers are not rate limited" untuk mencegah dampak SEO.
  • Jika permintaan siapa pun melebihi — tingkatkan ambang batas dari default (misalnya, dari 240 menjadi 480 permintaan per menit untuk pengguna yang sudah login di situs dengan konten berat).
  • Jika tampilan halaman crawler melebihi — sesuaikan berdasarkan persyaratan anggaran crawl aktual Anda.

Setelah menyesuaikan, pantau tampilan Live Traffic Wordfence selama 24–48 jam untuk mengonfirmasi bahwa pengguna yang sah tidak lagi diblokir.

Langkah 7: Hapus Cache Sisi Klien dan Diagnosis Masalah Tingkat Browser

Respons 429 yang di-cache di browser jarang terjadi tetapi mungkin terjadi jika respons menyertakan header Cache-Control: max-age (kesalahan konfigurasi server). Respons 429 standar seharusnya tidak di-cache.

Chrome:

Settings > Privacy and Security > Clear browsing data

Pilih Cached images and files dan Cookies and other site data, lalu hapus.

Verifikasi header respons secara langsung menggunakan curl untuk menyingkirkan perilaku khusus browser:

curl -I -X GET https://yourdomain.com/problematic-endpoint

Cari header Cache-Control, Retry-After, dan X-RateLimit-* dalam respons. Header ini mengungkapkan dengan tepat lapisan mana yang memberlakukan batas dan kapan klien dapat mencoba ulang.

Perbandingan: Pendekatan Pembatasan Kecepatan berdasarkan Lapisan

LapisanAlat / MetodeGranularitasOverheadTerbaik Untuk
CDN / EdgeCloudflare Rate Limiting, AWS WAFPer IP, per path, per headerSangat rendah (pre-origin)DDoS, mitigasi scraper
Reverse ProxyNginx `limit_req_zone`Per IP, per zoneRendahEndpoint API, halaman login
Server WebApache `mod_evasive`Per IP, per halamanRendah-sedangShared hosting, tumpukan lama
AplikasiThrottle middleware, gateway APIPer pengguna, per token, per kunciSedangSaaS multi-tenant, REST API
Plugin CMSWordfence, iThemes SecurityPer IP, per peran penggunaSedang-tinggiPerlindungan khusus WordPress
Kode Klien`tenacity`, `p-throttle`, backoffPer permintaan keluarSisi aplikasiKonsumsi API pihak ketiga

Kapan Menghubungi Penyedia Hosting Anda

Eskalasikan ke penyedia hosting Anda ketika:

  • 429 berasal dari load balancer upstream atau reverse proxy yang tidak Anda kendalikan.
  • Analisis log menunjukkan aplikasi Anda berada dalam volume permintaan yang diharapkan tetapi kesalahan terus berlanjut.
  • Anda memerlukan pengecualian batas kecepatan sementara selama lonjakan lalu lintas yang direncanakan (peluncuran produk, kampanye pemasaran).
  • Kesalahan hanya muncul di wilayah geografis tertentu, menunjukkan masalah perutean CDN atau anycast.

Saat menggunakan paket VPS Hosting, Anda memiliki akses langsung ke file konfigurasi server dan dapat mengimplementasikan semua perubahan Nginx dan Apache yang dijelaskan di atas tanpa membuka tiket dukungan. Pada infrastruktur terkelola seperti Dedicated Servers, tim dukungan penyedia Anda dapat membantu dengan pelacakan koneksi tingkat kernel dan aturan firewall perangkat keras yang melampaui apa yang dapat dicapai oleh konfigurasi lapisan aplikasi.

Jika tumpukan Anda menyertakan panel kontrol, VPS dengan cPanel mengekspos pengaturan ModSecurity dan pembatasan kecepatan Apache melalui GUI, yang menyederhanakan konfigurasi untuk tim tanpa keahlian baris perintah yang mendalam.

Mengamankan Endpoint API dengan SSL

Faktor yang sering diabaikan: endpoint HTTP yang tidak terenkripsi lebih rentan terhadap serangan replay dan credential stuffing, yang mendorong kesalahan 429 akibat brute-force. Memberlakukan HTTPS dengan Sertifikat SSL yang valid memastikan bahwa token autentikasi dan cookie sesi tidak dapat dicegat dan diputar ulang oleh alat otomatis, mengurangi satu kategori lalu lintas pemicu batas kecepatan dari sumbernya.

Matriks Keputusan Teknis: Memilih Solusi yang Tepat

Gunakan daftar periksa ini untuk mengarahkan diagnosis Anda ke solusi yang tepat:

  • 429 pada /wp-login.php atau /xmlrpc.php — Perkuat Nginx limit_req untuk path tersebut, blokir xmlrpc.php sepenuhnya jika tidak diperlukan, aktifkan perlindungan brute-force Wordfence.
  • 429 pada endpoint API dari kode aplikasi Anda sendiri — Implementasikan exponential backoff dengan parsing header Retry-After; tambahkan caching transient/Redis untuk mengurangi frekuensi panggilan keluar.
  • 429 yang memengaruhi semua pengguna secara terputus-putus pada shared hosting — Migrasi ke VPS untuk sumber daya terisolasi dan batas kecepatan yang dapat dikonfigurasi.
  • 429 dari API pihak ketiga yang dikonsumsi aplikasi Anda — Audit frekuensi panggilan, implementasikan antrian permintaan, cache respons secara agresif, dan hubungi penyedia API untuk mendiskusikan peningkatan kuota.
  • 429 yang disebabkan oleh bot atau crawler tertentu — Blokir di tingkat WAF atau Nginx map berdasarkan user-agent; verifikasi crawler yang sah (Googlebot) melalui reverse DNS sebelum memblokir.
  • 429 yang hanya muncul di browser, tidak di curl — Hapus cache browser; periksa apakah ada service worker yang meng-cache respons kesalahan; periksa header Cache-Control pada respons 429.
  • 429 tanpa pola yang dapat diidentifikasi dalam log — Periksa log CDN upstream atau load balancer; batas mungkin diberlakukan pada lapisan infrastruktur yang tidak terlihat dalam log aplikasi.

FAQ

Apa perbedaan antara kesalahan 429 dan 503?

429 adalah penolakan yang disengaja dan berbasis kebijakan yang dikeluarkan ketika klien melampaui kecepatan permintaan yang ditentukan. 503 menunjukkan bahwa server sementara tidak dapat menangani permintaan karena kelebihan beban atau pemeliharaan. Solusi untuk 429 adalah penyesuaian batas kecepatan atau koreksi perilaku klien; solusi untuk 503 adalah penskalaan kapasitas atau pemulihan layanan.

Haruskah saya selalu meningkatkan batas kecepatan ketika melihat 429?

Tidak. Meningkatkan batas hanya tepat dilakukan ketika lalu lintas yang sah sedang diblokir. Jika 429 disebabkan oleh bot, upaya brute-force, atau skrip yang salah konfigurasi, menaikkan batas memperburuk masalah dengan membiarkan lebih banyak lalu lintas berbahaya masuk. Selalu identifikasi sumbernya terlebih dahulu.

Apa yang dilakukan header Retry-After dan haruskah saya selalu menyertakannya?

Header Retry-After memberi tahu klien berapa detik harus menunggu sebelum mencoba ulang. RFC 6585 merekomendasikan untuk menyertakannya dengan setiap respons 429. Klien HTTP dan konsumen API yang berperilaku baik akan menghormatinya, mengurangi badai percobaan ulang yang memperparah masalah pembatasan kecepatan asli.

Bisakah kesalahan 429 merusak SEO saya?

Ya, jika Googlebot secara konsisten menerima respons 429, frekuensi crawl untuk situs Anda akan berkurang, yang dapat menunda pengindeksan konten baru atau yang diperbarui. Wordfence dan plugin serupa harus dikonfigurasi untuk mengecualikan crawler Google yang terverifikasi dari pembatasan kecepatan. Pantau laporan Crawl Stats di Google Search Console untuk lonjakan kesalahan server.

Bagaimana cara mencegah aplikasi saya sendiri memicu kesalahan 429 pada API eksternal?

Implementasikan kombinasi throttling proaktif (batasi kecepatan permintaan keluar di bawah ambang batas yang didokumentasikan API), caching respons yang agresif (simpan hasil API di Redis atau Memcached dengan TTL yang sesuai), dan exponential backoff reaktif (parse header Retry-After dan lakukan backoff sesuai). Jangan pernah melakukan panggilan API secara sinkron pada setiap pemuatan halaman tanpa lapisan caching di depannya.

15%

Hemat 15% di Semua Layanan Hosting

Uji kemampuanmu dan dapatkan Diskon pada paket hosting apa saja

Gunakan kode:

Skills
Memulai