Apache mod_ratelimit ile Bağlantı Hız Sınırlama

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_ratelimit bu 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. MaxRequestWorkers değerini buna göre ayarla.
  • Timeout değerleri: Uzun süren transferlerde TimeOut değerinin yeterince yüksek olması gerekir.
  • KeepAlive: Hız sınırlı bağlantılar üzerinde KeepAlive açı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_rate direktifi 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.

Yorum yapın