429 “Çok Fazla İstek” Hatasını Nasıl Çözersiniz

HTTP 429 “Çok Fazla İstek” hatası, bir kullanıcının (veya istemcinin) belirli bir zaman diliminde izin verilen istek sayısını aştığında bir sunucu tarafından gönderilen bir oran sınırlama yanıt kodudur. Bu durum genellikle güvenlik, API koruma veya anti-DDoS mekanizmalarının bir parçasıdır.

Üretim ortamlarında, hizmetleri kesintiye uğratabilir, API entegrasyonlarını bozabilir veya SEO’yu etkileyebilir. Bu ileri düzey kılavuz, 429 hatasını tanımlama, önleme ve çözme yöntemlerini hem istemci tarafı hem de sunucu tarafı perspektiflerinden ele almaktadır.

429 Hatasına Neler Sebep Olur?

Yaygın senaryolar:

  • Bir kullanıcı/bot çok fazla HTTP isteği (API çağrıları, sayfa yüklemeleri vb.) gönderiyor

  • Uygulamanız, üçüncü taraf bir hizmeti çok agresif bir şekilde tarıyor veya sorguluyor

  • Web uygulama güvenlik duvarları (WAF’lar) veya ters proxy’ler (örn. Cloudflare, Nginx) oran limitlerini uygular

  • Sunucu veya arka uç API’leri oran sınırlama kütüphaneleri kullanır (örn. express-rate-limit, mod_evasive vb.)

  • Botlar veya tarayıcılar web sitesini veya uç noktayı doldurur

Adım 1: Kaynağı Belirleyin

✅ 1. Yanıt Başlıklarını Kontrol Edin

Sunucular genellikle 429 yanıtı ile birlikte bir Retry-After başlığı gönderir:

HTTP/1.1 429 Too Many Requests
Retry-After: 60

Bu, istemciye tekrar denemeden önce ne kadar beklemesi gerektiğini (saniye cinsinden) bildirir.

✅ 2. Erişim Günlüklerini Kontrol Edin

Apache için:

cat /var/log/apache2/access.log | grep "429"

Nginx için:

cat /var/log/nginx/access.log | grep "429"

Bu, hangi IP’lerin veya uç noktaların limiti tetiklediğini belirlemeye yardımcı olur.

✅ 3. İzleme Araçlarını Kullanın

  • Fail2Ban günlükleri

  • Cloudflare Güvenlik Duvarı Olayları

  • Uygulama düzeyi günlükler (Laravel, Express, Django vb.)

  • Oran limit analitiği (bir API geçidi kullanıyorsanız)

Adım 2: Sunucu Tarafı Düzeltmeleri

A. Nginx Oran Sınırlama (aktifse)

Nginx şu şekilde yapılandırılabilir:

limit_req_zone $binary_remote_addr zone=api_limit:10m rate=5r/s;

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

Çözüm:

  • Oranı artırın veya patlama değerini artırın

  • Belirli yollar için (örn. /api/) uygulayın, genel olarak değil

  • Bilinen iç IP’leri beyaz listeye alın

B. Apache (mod_evasive veya mod_security)

Eğer mod_evasive aktifse:

sudo nano /etc/apache2/mods-enabled/evasive.conf

Ayarları değiştirin:

DOSPageCount 10
DOSSiteCount 100
DOSBlockingPeriod 10

➡️ Eşik değerlerini artırın veya belirli güvenilir IP’ler için devre dışı bırakın.

C. Cloudflare / CDN Kuralları

Eğer Cloudflare arkasındaysanız, kontrol edin:

  • Oran Sınırlama Kuralları Güvenlik > WAF

  • Bot Savaş Modu

  • Güvenlik Duvarı Kuralları User-Agent veya IP’ye göre engelleme

Çözüm:

  • Hassasiyeti azaltın

  • Sunucu IP’lerini veya belirli kullanıcı ajanlarını beyaz listeye alın

  • Güvenli tarayıcılar ve ortaklar için özel kurallar oluşturun

D. Uygulama Düzeyi Oran Sınırlama

Uygulamanızın şu kütüphaneleri kullanarak limitleri uygulayıp uygulamadığını kontrol edin:

  • Node.js: express-rate-limit

  • Laravel: ThrottleRequests

  • Django: drf-extensions veya middleware

Yapılandırmayı güncelleyin, örneğin:

rateLimit({
windowMs: 1 * 60 * 1000, // 1 minute
max: 100, // limit each IP to 100 requests per minute
})

➡️ Limitleri ayarlayın, kullanıcı/IP beyaz listeleme ekleyin veya kimlik doğrulama token’larına dayalı kota artırın.

Adım 3: İstemci Tarafı Düzeltmeleri (API Tüketirken)

Eğer uygulamanız istemci ise ve 429 alıyorsanız:

✅ Üssel Geri Çekme Uygulayın

İstekleri artan gecikmelerle otomatik olarak yeniden deneyin:

const retryAfter = (attempt) => Math.pow(2, attempt) * 1000;

✅ Retry-After Başlıklarına Saygı Gösterin

if (response.status === 429) {
const wait = response.headers['retry-after'] * 1000;
setTimeout(() => retryRequest(), wait);
}

✅ İstemci İçin Oran Sınırlama Ekleyin

Sorgulama yapıyorsanız kendi isteklerinizi sınırlayın:

// Use lodash or custom throttling
_.throttle(() => fetchData(), 1000);

Adım 4: SEO Dikkat Edilmesi Gerekenler

Arama motoru tarayıcılarına sunulan bir 429 durumu, sıralamanızı olumsuz etkileyebilir.

✅ Çözüm:

  • Bunun yerine Retry-After ile birlikte bir 503 (Hizmet Kullanılamıyor) sunun

  • Tarama hızını sınırlamak için robots.txt kullanın:

    User-agent: *
    Crawl-delay: 10
  • Cloudflare’da: Botlar > Tarama Yönetimi kısmına gidin

Adım 5: Meşru Kullanıcıları Engellemeden Koruma

Sert 429 limitleri yerine:

  • Şüpheli etkinlikler için CAPTCHA’lar kullanın

  • Sert engelleme yerine ilerleyen gecikmeler uygulayın

  • Giriş yapmış kullanıcılar için IP tabanlı oran sınırlama yerine kullanıcı tabanlı oran sınırlama kullanın

  • Daha yüksek oran limitleri ile kimlik doğrulama erişimi sağlayın (örn. API anahtarları veya token’lar aracılığıyla)

Sonuç

429 Çok Fazla İstek hatası, yararlı ama bazen rahatsız edici bir araçtır. Nereden geldiğini anlamak – sunucu, CDN veya uygulama – bunu çözmenin anahtarıdır. Doğru yapılandırma, günlükleme ve istemci tarafında limitlere saygı gösterilmesi ile koruma ve kullanılabilirlik arasında bir denge kurabilirsiniz.