Sunucuna yönelik büyük dosya indirme talepleri, video stream istekleri veya belirli IP’lerden gelen agresif bot trafiği, bandwith’ini saniyeler içinde eritebilir. Apache’nin mod_ratelimit modülü, bu tür senaryolarda her bağlantının tüketebileceği bant genişliğini granüler düzeyde kontrol etmeni sağlar. Kurulumu basit, konfigürasyonu esnek ve production ortamında son derece etkili bir araçtan bahsediyoruz.
mod_ratelimit Nedir ve Ne Zaman Kullanmalısın?
mod_ratelimit, Apache HTTP Server’ın resmi dağıtımıyla gelen bir modüldür. Temel işlevi, her HTTP bağlantısı için ayrı ayrı bant genişliği sınırı uygulamaktır. Burada dikkat edilmesi gereken nokta şu: bu modül IP başına değil, bağlantı başına hız sınırlaması yapar. Yani aynı IP’den 5 bağlantı açılırsa her birisi kendi kotasını kullanır.
Gerçek dünyada bu modülü şu senaryolarda kullanırsın:
- Büyük dosya sunucuları: ISO, video, yazılım paketi gibi büyük dosyaların dağıtıldığı sunucularda tek bir kullanıcının tüm bant genişliğini tüketmesini engellemek için
- Media streaming siteleri: MP3, MP4 gibi içeriklerin kontrollü bir hızda sunulması için
- Ortak hosting ortamları: Birden fazla müşterinin aynı sunucuyu paylaştığı durumda adil kaynak dağılımı sağlamak için
- API sunucuları: İstemcilerin belirli bir hızın üzerinde veri çekmesini kısıtlamak için
- Hotlink koruması: Başka sitelerden direkt link verilen büyük dosyaların sunucu kaynaklarını tüketerek DOS durumuna yol açmasını önlemek için
mod_ratelimit, mod_qos veya mod_bw gibi alternatiflere kıyasla çok daha hafif bir yapıya sahiptir. Extra bir derleme veya paket kurulumu gerekmez, Apache 2.4 ile birlikte zaten gelir.
Modülün Kurulumu ve Aktifleştirilmesi
Debian/Ubuntu Sistemlerde
Debian tabanlı sistemlerde modülü aktifleştirmek son derece kolaydır:
# Modülün mevcut olup olmadığını kontrol et
apache2ctl -M | grep ratelimit
# Modülü aktifleştir
sudo a2enmod ratelimit
# Apache'yi yeniden başlat
sudo systemctl restart apache2
Eğer modül listede görünmüyorsa Apache kurulumunun tam paketini aldığından emin ol:
sudo apt install apache2 -y
sudo a2enmod ratelimit
sudo systemctl restart apache2
RHEL/CentOS/Rocky Linux Sistemlerde
Red Hat tabanlı sistemlerde modüller genellikle httpd paketiyle birlikte gelir ve LoadModule direktifi ile aktifleştirilir:
# Modülün varlığını kontrol et
httpd -M | grep ratelimit
# Eğer modül dosyası mevcutsa ama yüklü değilse
grep -r "ratelimit" /etc/httpd/conf.modules.d/
Eğer modül yüklü değilse /etc/httpd/conf.modules.d/00-base.conf dosyasını düzenle:
sudo nano /etc/httpd/conf.modules.d/00-base.conf
# Şu satırın yorum işaretini kaldır veya ekle:
LoadModule ratelimit_module modules/mod_ratelimit.so
Değişikliği doğrula:
sudo httpd -t && sudo systemctl restart httpd
Temel Konfigürasyon: Rate-Limit Direktifi
mod_ratelimit tek bir direktif kullanır: RateLimit. Bu direktifin sözdizimi şöyledir:
RateLimit: Bağlantı başına maksimum transfer hızını kilobayt/saniye (KB/s) cinsinden belirler. Değer, tam sayı olarak girilir.
En basit kullanım örneğiyle başlayalım. Tüm bağlantıları 500 KB/s ile sınırla:
<VirtualHost *:80>
ServerName dosyalar.sirket.com
DocumentRoot /var/www/dosyalar
# Tüm bağlantılar için global hız sınırı
<Directory "/var/www/dosyalar">
SetOutputFilter RATE_LIMIT
SetEnv rate-limit 500
</Directory>
</VirtualHost>
Burada SetOutputFilter RATE_LIMIT direktifi, Apache’nin çıktı filtresini devreye sokar. SetEnv rate-limit 500 ise bu filtreye uygulanacak hız değerini (KB/s cinsinden) belirtir. Yani her bağlantı maksimum 500 KB/s hızında veri alabilir.
Başlangıç Burst Hızı Ayarı
Gerçek dünyada kullanıcı deneyimini iyileştirmek için ilk birkaç saniyede daha yüksek hız verilmesi, ardından kısıtlanması oldukça yaygın bir yöntemdir. mod_ratelimit bu durumu rate-initial-burst parametresiyle destekler:
<Directory "/var/www/videolar">
SetOutputFilter RATE_LIMIT
# Normal hız: 200 KB/s
SetEnv rate-limit 200
# İlk burst: 500 KB/s (tarayıcının buffer'ı doldurması için)
SetEnv rate-initial-burst 500
</Directory>
rate-limit: Saniye başına maksimum transfer hızı (KB/s). Zorunlu parametredir. rate-initial-burst: Bağlantının başında izin verilen yüksek hız değeri (KB/s). İsteğe bağlıdır, girilmezse burst uygulanmaz.
Bu yapı özellikle video streaming’de çok işe yarar. Tarayıcı, videonun ilk saniyelerini hızlı indirerek buffer’ı doldurur; ardından sistem normal kota hızına düşer. Kullanıcı kesintisiz izleme deneyimi yaşar.
Dosya Türüne Göre Hız Sınırlama
Tüm içeriği aynı oranla kısıtlamak yerine, belirli dosya uzantılarına özel kurallar tanımlayabilirsin. Bunun için direktifini kullanırsın:
<VirtualHost *:443>
ServerName cdn.sirket.com
DocumentRoot /var/www/cdn
# HTML, CSS, JS dosyaları kısıtlama olmadan gitsin
<FilesMatch ".(html|css|js)$">
SetOutputFilter RATE_LIMIT
SetEnv rate-limit 0
</FilesMatch>
# Görsel dosyalar için orta hız
<FilesMatch ".(jpg|jpeg|png|gif|webp)$">
SetOutputFilter RATE_LIMIT
SetEnv rate-limit 300
</FilesMatch>
# Büyük medya dosyaları ciddi şekilde kısıtlansın
<FilesMatch ".(mp4|avi|mkv|mov|wmv)$">
SetOutputFilter RATE_LIMIT
SetEnv rate-initial-burst 1024
SetEnv rate-limit 150
</FilesMatch>
# Arşiv ve kurulum dosyaları
<FilesMatch ".(zip|tar.gz|iso|exe|dmg)$">
SetOutputFilter RATE_LIMIT
SetEnv rate-initial-burst 2048
SetEnv rate-limit 400
</FilesMatch>
</VirtualHost>
rate-limit değeri 0 olarak ayarlandığında kısıtlama uygulanmaz. Bu yüzden HTML/CSS/JS gibi küçük ve kritik dosyalar için 0 kullanmak mantıklıdır.
Location Bazlı Hız Sınırlama
Belirli URL path’lerine özel kurallar uygulamak istiyorsan direktifini kullan:
<VirtualHost *:80>
ServerName api.uygulama.com
DocumentRoot /var/www/api
# API endpointleri için genel kısıtlama
<Location "/api/v1">
SetOutputFilter RATE_LIMIT
SetEnv rate-limit 100
</Location>
# Rapor indirme endpointi çok yavaş olsun
<Location "/api/v1/export">
SetOutputFilter RATE_LIMIT
SetEnv rate-initial-burst 512
SetEnv rate-limit 50
</Location>
# Static asset'ler serbest gitsin
<Location "/static">
SetOutputFilter RATE_LIMIT
SetEnv rate-limit 0
</Location>
# Admin paneli için yüksek hız
<Location "/admin">
SetOutputFilter RATE_LIMIT
SetEnv rate-limit 0
</Location>
</VirtualHost>
.htaccess ile Hız Sınırlama
Eğer sunucu konfigürasyonuna erişimin yoksa veya dizin bazında dinamik kural uygulamak istiyorsan .htaccess dosyasını kullanabilirsin. Bunun çalışması için AllowOverride direktifinin aktif olması gerekir:
# Ana konfigürasyonda AllowOverride açık olmalı
<Directory "/var/www/html">
AllowOverride All
</Directory>
Ardından ilgili dizine .htaccess dosyası oluştur:
cat > /var/www/html/downloads/.htaccess << 'EOF'
# Bu dizindeki tüm dosyalar için hız sınırlaması
SetOutputFilter RATE_LIMIT
SetEnv rate-initial-burst 1024
SetEnv rate-limit 250
EOF
Önemli not: .htaccess dosyaları her istek sırasında okunduğu için performans açısından bir miktar yük oluşturur. Production ortamında mümkün oldukça ana konfigürasyon dosyalarını tercih et.
Gerçek Dünya Senaryosu: Dosya Paylaşım Sunucusu
Şirkette kullanılan bir iç dosya paylaşım sunucusu düşün. Çalışanlar büyük CAD dosyaları, video eğitimler ve yazılım paketleri indiriyor. Birkaç kişinin aynı anda büyük dosya indirmesi ağı kilitleme potansiyeli taşıyor. İşte bu senaryo için kapsamlı bir konfigürasyon:
<VirtualHost *:443>
ServerName dosyalar.sirket.local
DocumentRoot /var/www/dosyalar
SSLEngine on
SSLCertificateFile /etc/ssl/certs/sirket.crt
SSLCertificateKeyFile /etc/ssl/private/sirket.key
# Genel dizin konfigürasyonu
<Directory "/var/www/dosyalar">
Options -Indexes +FollowSymLinks
AllowOverride None
Require all granted
</Directory>
# Küçük dokümanlar (PDF, DOCX vb.) - orta hız
<Location "/docs">
SetOutputFilter RATE_LIMIT
SetEnv rate-initial-burst 2048
SetEnv rate-limit 800
</Location>
# Yazılım paketleri - kısıtlı ama makul hız
<Location "/software">
SetOutputFilter RATE_LIMIT
SetEnv rate-initial-burst 4096
SetEnv rate-limit 500
</Location>
# Video eğitimler - streaming dostu ayar
<Location "/egitim">
SetOutputFilter RATE_LIMIT
SetEnv rate-initial-burst 2048
SetEnv rate-limit 300
</Location>
# Büyük arşivler - ciddi kısıtlama
<Location "/arsiv">
SetOutputFilter RATE_LIMIT
SetEnv rate-initial-burst 1024
SetEnv rate-limit 200
</Location>
# Log konfigürasyonu
ErrorLog ${APACHE_LOG_DIR}/dosyalar-error.log
CustomLog ${APACHE_LOG_DIR}/dosyalar-access.log combined
</VirtualHost>
mod_rewrite ile Koşullu Hız Sınırlama
mod_rewrite ile birleştirildiğinde daha akıllı kurallar oluşturabilirsin. Örneğin, belirli bir User-Agent’a sahip botları kısıtla:
<VirtualHost *:80>
ServerName www.sirket.com
DocumentRoot /var/www/html
RewriteEngine On
# Bilinen download manager'ları tespit et
RewriteCond %{HTTP_USER_AGENT} "wget|curl|aria2|IDM" [NC]
RewriteRule .* - [E=DOWNLOAD_BOT:1]
# Bot tespit edildiyse hız ortamını ayarla
<If "%{ENV:DOWNLOAD_BOT} == '1'">
SetOutputFilter RATE_LIMIT
SetEnv rate-limit 100
</If>
# Normal kullanıcılar için daha iyi hız
<Directory "/var/www/html/downloads">
SetOutputFilter RATE_LIMIT
SetEnv rate-initial-burst 1024
SetEnv rate-limit 500
</Directory>
</VirtualHost>
mod_headers ile Hız Bilgisini İstemciye Bildirme
İstemciye ne kadar hız aldığını bildirmek istersen mod_headers modülünü kullanarak özel header’lar ekleyebilirsin:
<Location "/downloads">
SetOutputFilter RATE_LIMIT
SetEnv rate-limit 500
# İstemciye hız bilgisini header ile bildir
Header always set X-Rate-Limit "500KB/s"
Header always set X-Server-Policy "bandwidth-limited"
</Location>
Bu yaklaşım özellikle API istemcilerinin politikadan haberdar olmasını sağlar.
Konfigürasyonu Test Etme ve Doğrulama
Konfigürasyonu uyguladıktan sonra her şeyin beklendiği gibi çalıştığını doğrulamalısın:
# Önce Apache konfigürasyonunu syntax açısından kontrol et
sudo apache2ctl -t
# veya RHEL/CentOS için:
sudo httpd -t
# Modülün yüklendiğini teyit et
apache2ctl -M | grep ratelimit
# Test için wget ile hız ölçümü yap
wget --progress=dot:mega -O /dev/null http://dosyalar.sirket.com/test-dosya.iso 2>&1 | grep -E "KB/s|MB/s"
# curl ile test et
curl -o /dev/null -w "Ortalama hız: %{speed_download} bytes/sn"
http://dosyalar.sirket.com/downloads/buyuk-dosya.zip
curl ile yapılan testte çıktıdaki speed_download değeri bytes/saniye cinsindendir. 500 KB/s limit için yaklaşık 512000 bytes/s görmen beklenir.
Daha detaylı test için Apache access log’larını gerçek zamanlı takip edebilirsin:
# Access log'larını canlı izle
sudo tail -f /var/log/apache2/access.log
# Hız ile ilgili metrikleri filtrele
sudo tail -f /var/log/apache2/access.log | awk '{print $1, $7, $10}'
Sık Yapılan Hatalar ve Çözümleri
Hız Sınırı Çalışmıyor
En sık karşılaşılan sorun, filtrenin doğru uygulanmamasıdır. Bunu birkaç adımda kontrol et:
# Modülün gerçekten yüklü olduğunu doğrula
apache2ctl -M | grep -i rate
# SetOutputFilter direktifinin doğru yazıldığını kontrol et
# Yanlış: SetOutputFilter rate_limit
# Doğru: SetOutputFilter RATE_LIMIT
grep -r "RATE_LIMIT" /etc/apache2/sites-enabled/
Proxy veya CDN Arkasındaki Sorunlar
Eğer Apache, nginx veya bir CDN’in arkasında reverse proxy olarak çalışıyorsa mod_ratelimit yine de bağlantı başına çalışır. Ancak CDN katmanı birden fazla isteği tek TCP bağlantısına sıkıştırabilir. Bu durumda kısıtlama beklenenden farklı davranış gösterebilir.
Nginx + Apache setup’ında şunu göz önünde bulundur:
- Nginx ile Apache arasındaki bağlantı hızlanır
- Gerçek istemciye yönelik hız nginx katmanında uygulanmalıdır
mod_ratelimitbu senaryoda nginx’e karşı sınırlama yapar, istemciye karşı değil
Yanlış Birim Kullanımı
rate-limit değeri kilobyte/saniye (KB/s) cinsindendir, kilobit değil. Sık yapılan hata, Megabyte cinsinden değer girmektir:
# YANLIS: Bu değer Megabyte değil, KB cinsinden okunur
SetEnv rate-limit 1.5
# DOGRU: 1.5 MB/s için 1536 KB yaz
SetEnv rate-limit 1536
# DOGRU: 500 KB/s
SetEnv rate-limit 500
# DOGRU: 2 MB/s
SetEnv rate-limit 2048
Performans Etkileri
mod_ratelimit, modülün kendisi açısından son derece hafif bir yapıya sahiptir. Ancak hız sınırlaması doğası gereği bağlantıların daha uzun süre açık kalmasına neden olur. Bu durum şu sonuçları doğurabilir:
- Worker sayısı dolabilir: Yavaş bağlantılar Apache worker’larını uzun süre meşgul eder.
MaxRequestWorkersdeğerini buna göre ayarla. - Timeout değerleri: Uzun süren transferlerde
TimeOutdeğerinin yeterince yüksek olması gerekir. - KeepAlive: Hız sınırlı bağlantılar üzerinde
KeepAliveaçıksa bağlantı sayısı hızla artabilir.
Bu etkiyi yönetmek için Apache MPM ayarlarını gözden geçir:
# Mevcut MaxRequestWorkers değerini gör
grep -r "MaxRequestWorkers" /etc/apache2/mods-enabled/
# Gereksinimine göre artır (örnek: event MPM)
sudo nano /etc/apache2/mods-available/mpm_event.conf
mod_ratelimit Alternatifleriyle Karşılaştırma
- mod_qos: IP başına, sunucu genelinde veya bağlantı bazında daha karmaşık QoS kuralları tanımlar.
mod_ratelimit‘e kıyasla çok daha fazla özellik sunar ama konfigürasyonu da o ölçüde karmaşıktır. - mod_cband: Toplam transfer kotası, günlük/aylık limitler gibi quota tabanlı kısıtlamalar için uygundur. Ancak artık aktif olarak geliştirilmemektedir.
- Traffic shaping (tc/iptables): İşletim sistemi seviyesinde uygulama fırsatı verir, Apache’den bağımsız çalışır. Daha güçlüdür ama yönetmesi daha zordur.
- nginx limit_rate: Eğer nginx kullanıyorsan kendi
limit_ratedirektifi benzer işlevi çok temiz bir şekilde yerine getirir.
mod_ratelimit, saf Apache kurulumlarında gerçekten sıfır bağımlılıkla çalışan, konfigürasyonu dakikalar içinde yapılabilen bir çözüm olarak öne çıkar.
Sonuç
mod_ratelimit, Apache ile gelen ve kurulum gerektirmeyen nadir kullanışlı araçlardan biridir. Özellikle dosya indirme sunucuları, media streaming altyapıları ve paylaşımlı hosting ortamlarında bant genişliğini adil ve kontrollü biçimde dağıtmak için ilk tercih edilmesi gereken çözümdür.
Uygulamanın özeti şu şekilde çıkar: a2enmod ratelimit ile modülü etkinleştir, SetOutputFilter RATE_LIMIT filtresini ekle, SetEnv rate-limit [KB/s] ile kotanı belirle ve ihtiyaç duyarsan rate-initial-burst ile kullanıcı deneyimini iyileştir.
Tek bir direktifle çözemeyeceğin, IP başına kota veya günlük toplam transfer limiti gibi daha karmaşık gereksinimlerin varsa mod_qos veya işletim sistemi seviyesinde traffic shaping çözümlerine geçiş yapmanın zamanı gelmiştir. Ancak senin durumun “büyük dosyalar sunucumu boğuyor, her bağlantıyı kısıtlamam lazım” şeklindeyse mod_ratelimit tam olarak ihtiyacın olan şeydir.