Nginx Rate Limit Nasıl Çalışır? Botları ve Saldırıları Yavaşlatan Yöntem

Bir gece bloguma aniden saniyede 500 istek gelmeye başladı. Normal trafik saniyede 3-5 istek. Sunucu yavaşlamıştı, sayfalar 10 saniyede açılıyordu. Cloudflare DDoS koruması henüz tetiklenmemişti — istekler “meşru” görünüyorlardı. O an Nginx rate limit kurmamış olmama lanet ettim. Sonra hızla kurdum ve sorun çözüldü. O günden beri rate limit hayat kurtaran bir güvenlik katmanı oldu.
Konu İçeriği
Rate Limiting Nedir?
Rate limiting, bir IP adresinden belirli bir zaman diliminde yapılabilecek istek sayısını sınırlama tekniğidir. Örneğin, bir IP saniyede en fazla 10 sayfa isteyebilir — fazlası reddedilir. Bu, brute-force saldırılarını, aşırı scraping’i ve DDoS saldırılarını yavaşlatan en basit ve etkili yöntemlerden biri. Nginx’e göre, doğru yapılandırılmış rate limiting ile kötü niyetli trafiğin %80’i sunucuya ulaşmadan engellenebiliyor (Nginx, “Rate Limiting Guide”, 2026).

Nginx Rate Limit Kurulumu — Adım Adım
Benim uyguladığım yapılandırmayı adım adım anlatayım:
Adım 1: Zone Tanımlama
Önce http bloğunda bir zone tanımlayın. Zone, IP adreslerini ve istek sayılarını hafızada tutan bir alan:
http {
limit_req_zone $binary_remote_addr zone=genel:10m rate=10r/s;
limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;
}
Burada ne yaptık?
- zone=genel: Her IP saniyede en fazla 10 istek yapabilir
- zone=login: Login sayfası için dakikada 5 istek
- 10m: Zone için 10 MB bellek (yaklaşık 160.000 IP adresi tutabilir)
Benim sunucumda 10 MB yeterli. Daha yoğun siteler için 50-100 MB gerekebilir.
Adım 2: Kural Uygulama
Server bloğunda kuralları uygulayın:
server {
# Genel rate limit
limit_req zone=genel burst=20 nodelay;
# Login sayfası için sıkı limit
location /wp-login.php {
limit_req zone=login burst=5 nodelay;
}
# API endpoint'leri için orta limit
location /api/ {
limit_req zone=genel burst=10 nodelay;
}
}
burst=20 ne demek? Kullanıcı anlık olarak 20 istek gönderebilir (traffic spike), ama sonraki istekler sınırı aşarsa reddedilir. nodelay ise burst isteklerini hemen işler, beklemez.
Adım 3: Özel Hata Sayfası
Rate limit’e takılan kullanıcılara güzel bir hata sayfası gösterin:
error_page 429 /rate-limit.html;
location = /rate-limit.html {
internal;
return 429 'Çok fazla istek gönderiyorsunuz. Lütfen bekleyin.';
}
Ben özel bir HTML sayfası oluşturdum — “Biraz yavaşladın gibi” diye esprili bir mesaj var. Kullanıcı dostu olmak önemli.
Farklı Senaryolar İçin Rate Limit Ayarları
| Senaryo | Rate Limit | Burst | Açıklama |
|---|---|---|---|
| Blog/İçerik sitesi | 10r/s | 20 | Normal gezinti için yeterli |
| Login sayfası | 5r/m | 5 | Brute-force engelleme |
| API endpoint | 30r/s | 50 | Ajans ve mobil uygulamalar için |
| Dosya yükleme | 2r/m | 3 | Spam ve aşırı yükleme engelleme |
| Arama sayfası | 3r/m | 5 | Bot scraping engelleme |
Bu ayarları kendi sitenizin trafiğine göre ayarlayın. Benim blogum düşük trafikli olduğu için limitler sıkı tutulabilir. Yüksek trafikli sitelerde daha gevşetmek gerekir.

Rate Limit İzleme — Nasıl Anlıyorum Çalışıyor?
Rate limit’in çalışıp çalışmadığını izlemek için:
# Nginx loglarında rate limit olaylarını filtrele grep "limiting requests" /var/log/nginx/error.log | tail -20
Ben ayrıca Nginx status sayfasını da kullanıyorum:
location /nginx-status {
stub_status on;
allow 127.0.0.1;
deny all;
}
Bu sayfadan aktif bağlantı sayısını ve toplam istek sayısını görebiliyorum. Prometheus + Grafana ile görselleştirme de mümkün ama ben basit bir bash script ile günlük rapor alıyorum.
Rate Limit vs Cloudflare vs WAF — Hangisi Ne Zaman?
Bu üçü farklı katmanlarda çalışır ve birbirini tamamlar:
- Nginx Rate Limit: Sunucu katmanında, IP bazlı, çok hızlı, düşük kaynak tüketimi
- Cloudflare WAF: CDN katmanında, trafik sunucuya ulaşmadan engellenir, daha akıllı
- ModSecurity/WAF: Uygulama katmanında, kural bazlı, en detaylı ama en yavaş
Ben hepsini birlikte kullanıyorum: Cloudflare ilk filtre, Nginx rate limit ikinci filtre, WAF üçüncü filtre. Katmanlı güvenlik en iyi yaklaşım.
Karşılaştığım Sorunlar ve Çözümleri
Sorun 1: CDN arkasındaki IP’ler: Cloudflare arkasında çalışırken, Nginx tüm istekleri Cloudflare IP’lerinden geliyor sanır. Çözüm: set_real_ip_from ile Cloudflare IP’lerini tanıyın ve gerçek IP’yi X-Forwarded-For header’ından alın.
set_real_ip_from 103.21.244.0/22; set_real_ip_from 103.22.200.0/22; # ... diğer Cloudflare IP'leri real_ip_header CF-Connecting-IP;
Sorun 2: Meşru kullanıcılar etkilenebilir: Rate limit çok sıkıysa, hızlı gezinen meşru kullanıcılar 429 hatası alabilir. Ben burst değerini artırarak çözdüm. Ayrıca login sayfası için limit sıkı tutup, genel sayfalar için gevşetiyorum.
Sorun 3: Hafıza tüketimi: Zone büyüklüğü yetersizse, eski IP’ler temizlenir ve limit sıfırlanır. Ben 10 MB’ı yetersiz buldum ve 50 MB’a çıkardım. 160.000’den fazla IP adresi takip edebiliyor artık.
Sıkça Sorulan Sorular
Rate limit SEO’yu etkiler mi?
Hayır, arama motoru botları (Googlebot vb.) çok hızlı istek göndermez. Ayrıca Googlebot için ayrı bir limit tanımlayabilir veya whitelist’e alabilirsiniz.
Rate limit DDos engeller mi?
Küçük ölçekli DDoS saldırılarını yavaşlatabilir ama büyük botnet saldırılarını tek başına engelleyemez. Cloudflare gibi bir CDN ile birlikte kullanılmalı.
Rate limit login brute-force’u engeller mi?
Evet, dakikada 5 deneme gibi bir limit koyarsanız, brute-force saldırıları pratik olarak imkansız hale gelir. Saniyede 100 deneme yapan bir saldırgan, dakikada sadece 5 deneme yapabilir.
Nginx rate limit konfigürasyonunu test edebilirmiyim?
Evet, Apache Benchmark (ab) ile: ab -n 100 -c 10 https://siteniz.com/. İlk 10-20 istek başarılı, sonrası 429 dönmeli.
Birden fazla Nginx sunucusunda rate limit paylaşılabilir mi?
Evet, Nginx Plus’ta (ücretli) shared zone ile Redis kullanarak birden fazla sunucu arasında rate limit paylaşabilirsiniz. Açık kaynak Nginx’te bu özellik yok, her sunucu kendi limitini tutar.
Sonuç
Nginx rate limiting basit, hızlı ve etkili bir güvenlik aracı. Benim sunucuma o gece gelen saldırıyı dakikalar içinde durdurdu. O günden beri hiç rate limit’siz bir sunucu kurmadım.
Kurulumu 10 dakika sürüyor ve ciddi bir güvenlik katmanı ekliyor. Eğer sunucunuzda Nginx çalışıyorsa ve rate limit kullanmıyorsanız, hemen başlayın. O saldırı anında “keşke” demek istemezsiniz.


