Nginx Üzerinde IP Adresi Bazlı Hız Sınırlandırma (Rate Limiting)

Nginx sunucularında IP adresi bazlı hız sınırlandırma (rate limiting), web sitenizin aşırı trafik yükünden korunmasını sağlayan kritik bir güvenlik mekanizmasıdır.

Nginx sunucularında IP adresi bazlı hız sınırlandırma (rate limiting), web sitenizin aşırı trafik yükünden korunmasını sağlayan kritik bir güvenlik mekanizmasıdır. Bu özellik, belirli bir IP adresinden gelen istekleri dakikada veya saatte belirli bir sayıyla sınırlayarak brute force saldırıları, DDoS girişimleri ve kaynak tüketimini önler. Kurumsal ortamlarda, özellikle e-ticaret siteleri veya API servislerinde, rate limiting uygulayarak hizmet sürekliliğini garanti altına alabilirsiniz. Bu makalede, Nginx’in limit_req modülünü kullanarak adım adım nasıl yapılandıracağınızı öğreneceksiniz. Pratik örnekler ve en iyi uygulamalarla, sunucunuzu daha güvenli hale getireceksiniz.

Nginx Rate Limiting’in Temel Kavramları

Nginx’te rate limiting, limit_req_zone ve limit_req direktifleri ile gerçekleştirilir. limit_req_zone, paylaşılan bellekte IP adreslerine göre istek sayısını takip eden bir zone tanımlar. Örneğin, bir zone 10m bellek ayırarak 160.000 IP adresini izleyebilir. Rate limiting, burst (ani artış) ve nodelay parametreleriyle esneklik kazanır; burst değeri, kısa süreli fazla isteğe izin verir.

Bu yaklaşım, sunucu kaynaklarını dengeli dağıtır ve yasal kullanıcıları etkilemeden kötü niyetli trafiği bloke eder. Kurumsal kullanımda, farklı endpoint’ler için ayrı zone’lar tanımlamak önerilir; örneğin, login sayfası için daha sıkı limitler uygulanabilir. Bu sayede, sistem performansını optimize ederken güvenlik katmanını güçlendirirsiniz. Rate limiting’i etkinleştirmek, Nginx’in http bloğunda modülün yüklü olmasını gerektirir ki varsayılan kurulumlarda bulunur.

Adım Adım Rate Limiting Yapılandırması

Zone Tanımlama

http bloğunda limit_req_zone direktifini ekleyin. Örnek: limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/m; Burada $binary_remote_addr IP’yi binary formatta kullanır, 32 bayt tasarruf sağlar. zone=mylimit 10m bellekte anahtar saklar, rate=10r/m dakikada 10 istek anlamına gelir. Bu zone, server bloklarında referans alınır. Bellek hesaplaması: (anahtar boyutu + 8 bayt) * IP sayısı; 10m ile yaklaşık 160.000 IP destekler. Kurumsal sunucularda, birden fazla zone tanımlayarak API ve statik dosya trafiğini ayırın.

Server Bloğunda Limit Uygulama

Server bloğunda location / için limit_req zone=mylimit burst=20 nodelay; ekleyin. Burst=20, 20 ekstra istek biriktirir; nodelay ile hemen reddetmez, kuyruklar. 429 Too Many Requests hatası döner. Login gibi hassas yollar için: location /login { limit_req zone=mylimit burst=5; }. Test için nginx -t ile syntax kontrolü yapın, ardından nginx -s reload ile yeniden yükleyin. Bu adımlar, saniyeler içinde devreye girer ve loglarda rate limiting olaylarını izleyebilirsiniz.

Örnek Tam Konfigürasyon

Aşağıdaki örnek, tam bir http bloğu snippet’i sunar: http { limit_req_zone $binary_remote_addr zone=api:10m rate=50r/m; server { location /api/ { limit_req zone=api burst=100 nodelay; } } }. Bu, API endpoint’lerini dakikada 50 istekle sınırlar, burst ile esneklik sağlar. Gerçek hayatta, proxy_pass ile backend’e yönlendirmede de kullanın. Log formatını özelleştirerek hit edilen limitleri takip edin: log_format main ‘$remote_addr – $request’.

İleri Seviye Yapılandırma ve En İyi Uygulamalar

İleri düzeyde, limit_req_status ile istek durumunu değişkene atayın ve custom error sayfaları oluşturun. Örneğin, limit_req_status 503; ile 503 Service Unavailable döndürün. GeoIP modülüyle entegre ederek ülke bazlı limitler ekleyin, ancak IP bazlı odaklanın. Redis gibi external storage yerine Nginx’in in-memory zone’unu tercih edin; düşük latency sağlar. Monitoring için Prometheus exporter ile zone doluluk oranlarını izleyin.

En iyi uygulamalar arasında, zone boyutunu trafik hacmine göre ayarlayın: Yüksek trafikli sitelerde 50m-100m kullanın. Whitelist için map bloğuyla belirli IP’leri hariç tutun: map $remote_addr $limit { default 1; 192.168.1.0/24 0; } ve limit_req if $limit {} içinde. Performans testi için Apache Bench (ab) ile simüle edin: ab -n 1000 -c 10 http://example.com/. Bu şekilde, 99.9% uptime hedefinize ulaşırsınız. Düzenli log analiziyle limitleri ince ayarlayın, aşırı kısıtlama kullanıcı deneyimini bozmasın.

Sonuç olarak, Nginx üzerinde IP bazlı rate limiting uygulayarak sunucunuzu proaktif şekilde koruyabilirsiniz. Bu yapılandırmayı prodüksiyona almadan test ortamında doğrulayın ve düzenli bakım yapın. Uygulama sonrası, sunucu yükünde belirgin düşüş ve güvenlik artışı gözlemleyeceksiniz. Bu teknik, modern web altyapılarının vazgeçilmez bir parçasıdır.

Kategori: Web Sunucu
Yazar: Lorem
çerik: 554 kelime
Okuma Süresi: 4 dakika
Zaman: Bugün
Yayım: 24-02-2026
Güncelleme: 24-02-2026