OpenLiteSpeed ile Bandwidth Throttling Yapılandırması

Bant genişliği yönetimi, özellikle paylaşımlı hosting ortamlarında veya kaynak kısıtlı sunucularda en kritik konulardan biri. OpenLiteSpeed bu konuda oldukça esnek bir yapı sunuyor ama dokümentasyon biraz dağınık olduğundan “nasıl yapılandırılır” sorusunun cevabını bulmak zaman alıyor. Bu yazıda OpenLiteSpeed üzerinde bandwidth throttling’i hem web arayüzü hem de konfigurasyon dosyaları üzerinden nasıl yapılandıracağınızı, gerçek dünya senaryolarıyla birlikte anlatacağım.

OpenLiteSpeed’de Bandwidth Throttling Nedir?

OpenLiteSpeed, istemcilere gönderilen veri hızını sınırlandırma konusunda birkaç farklı mekanizma sunuyor. Bunları kabaca ikiye ayırabiliriz:

  • Connection Throttling: Tek bir bağlantı için maksimum gönderim hızı
  • Per-IP Throttling: Belirli bir IP adresinden gelen tüm bağlantılar için toplam hız sınırı

Bu iki mekanizmayı doğru kombine etmek, hem tek bir kullanıcının sunucuyu ezmesini önler hem de genel sistem performansını korur. Örneğin bir video hosting sitesi işletiyorsanız, bir kullanıcının gigabit bağlantınızın tamamını tek başına tüketmesini istemezsiniz.

Temel Kavramlar ve Birimler

Konfigurasyon yazmadan önce OpenLiteSpeed’in hız sınırlama birimlerini anlamak gerekiyor. OLS tüm hız değerlerini bytes/saniye cinsinden alıyor. Bu yüzden kafanızın karışmaması için şu dönüşümleri aklınızda tutun:

  • 1 KB/s = 1024 bytes/saniye
  • 1 MB/s = 1048576 bytes/saniye
  • 100 KB/s = 102400 bytes/saniye
  • 500 KB/s = 512000 bytes/saniye

Ayrıca OLS’nin throttling değerlerini “0” olarak girdiğinizde sınırsız anlamına geldiğini bilmeniz önemli. Yanlışlıkla 0 girip neden çalışmıyor diye saatlerce bakabilirsiniz.

Konfigurasyon Dosyası Yapısı

OpenLiteSpeed’in ana konfigurasyon dosyası /usr/local/lsws/conf/httpd_config.conf konumundadır. Virtual host konfigürasyonları ise /usr/local/lsws/conf/vhosts/ altında her site için ayrı klasörlerde tutulur.

# Konfigurasyon dosyalarının konumunu kontrol edelim
ls -la /usr/local/lsws/conf/
ls -la /usr/local/lsws/conf/vhosts/

# Ana konfig dosyasını görüntüle
cat /usr/local/lsws/conf/httpd_config.conf | grep -i throttle

Sunucu Genelinde Throttling Yapılandırması

httpd_config.conf Üzerinden

Sunucu genelinde bant genişliği sınırlaması için ana konfigurasyon dosyasını düzenliyoruz. Bu ayarlar tüm virtual host’ları etkiler.

# Ana konfigurasyon dosyasını düzenle
nano /usr/local/lsws/conf/httpd_config.conf

Dosya içinde tuning bloğunu bulun veya yoksa oluşturun:

tuning  {
  maxConnections          2000
  maxSSLConnections       1000
  connTimeout             300
  maxKeepAliveReq         1000
  smartKeepAlive          0
  keepAliveTimeout        5
  sndBufSize              0
  rcvBufSize              0
  maxReqURLLen            8192
  maxReqHeaderSize        16380
  maxReqBodySize          2047M
  maxDynRespHeaderSize    8192
  maxDynRespSize          2047M
  maxCachedFileSize       4096
  totalInMemCacheSize     20M
  totalMMAPCacheSize      40M
  useSendfile             1
  fileETag                28
  enableAIORead           1
  enableAIOWrite          0
  useAIOSendFile          0
  maxAIOWrite             128
  maxAIOWritePerReq       16
  enableSendfileAIO       0
  maxSmallFileSize        2K
  smallFileMemBlock       4K
  largeFileBlockSize      1M
}

Buradaki sndBufSize değeri gönderme tamponu boyutunu belirler. Bu değeri küçük tutmak dolaylı olarak throttling etkisi yaratır ama gerçek throttling için farklı direktifler kullanıyoruz.

Throttle Direktiflerini Eklemek

Ana konfig dosyasına aşağıdaki bloğu ekleyin:

throttle  {
  staticReqPerSec         0
  dynReqPerSec            0
  outBandwidth            0
  inBandwidth             0
}

Bu bloktaki parametreler şunlardır:

  • staticReqPerSec: Saniyede maksimum statik içerik isteği sayısı
  • dynReqPerSec: Saniyede maksimum dinamik içerik isteği sayısı
  • outBandwidth: Giden bant genişliği limiti (bytes/saniye)
  • inBandwidth: Gelen bant genişliği limiti (bytes/saniye)

Virtual Host Bazlı Throttling

Gerçek dünyada genellikle sunucu genelinde değil, site bazında throttling yapmak istersiniz. Özellikle birden fazla müşterinin sitesini barındırıyorsanız bu çok daha mantıklı.

# Virtual host konfig dosyasını düzenle
nano /usr/local/lsws/conf/vhosts/example.com/vhconf.conf

Virtual host konfigurasyon dosyasına throttle bloğunu ekleyin:

throttle  {
  outBandwidth            512000
  inBandwidth             102400
  staticReqPerSec         100
  dynReqPerSec            20
}

Bu örnekte:

  • outBandwidth 512000: Giden trafik maksimum 500 KB/s
  • inBandwidth 102400: Gelen trafik maksimum 100 KB/s
  • staticReqPerSec 100: Saniyede 100 statik istek
  • dynReqPerSec 20: Saniyede 20 dinamik istek

Web Admin Paneli Üzerinden Yapılandırma

Komut satırından çalışmayı sevmiyorsanız veya görsel bir arayüz tercih ediyorsanız, OLS’nin web admin panelini kullanabilirsiniz. Varsayılan olarak https://sunucu-ip:7080 adresinde çalışır.

# Admin paneli şifresini sıfırlamak gerekirse
/usr/local/lsws/admin/misc/admpass.sh

Panel üzerinden throttling için şu yolu izleyin:

  • Configuration > Server > Tuning bölümüne gidin
  • “Connection” sekmesini açın
  • “Out Bandwidth” ve “In Bandwidth” alanlarını doldurun
  • Apply butonuna basın, ardından Graceful Restart yapın

Virtual host için ise:

  • Virtual Hosts > İlgili site > General sekmesi
  • Throttle bölümünü bulun ve değerleri girin

IP Bazlı Throttling ile Access Control

Bazen belirli IP aralıklarına özel limitler uygulamak gerekebilir. Bunu accessControl ve rewrite kurallarıyla kombinleyebilirsiniz, ancak OLS’nin native throttling özelliği IP bazlı ayrım yapmaz. Bu durumda iptables veya tc (traffic control) ile birlikte kullanmak daha etkili sonuç verir.

# tc ile belirli bir interface üzerinden giden trafiği sınırlandır
# Önce mevcut kuralları kontrol et
tc qdisc show dev eth0

# Tüm trafik için 10Mbit/s sınırı koy
tc qdisc add dev eth0 root tbf rate 10mbit burst 32kbit latency 400ms

# Kuralı kaldırmak için
tc qdisc del dev eth0 root

Bu yöntem OLS spesifik değil ama birlikte kullandığınızda çok daha granular bir kontrol sağlar.

Gerçek Dünya Senaryosu 1: Medya Dosyası Sunumu

Diyelim ki bir fotoğraf galerisi veya küçük çaplı video platformu işletiyorsunuz. Kullanıcılar büyük dosyalar indiriyor ve sunucunuzun bant genişliği sınırlı. Bu durumda her bağlantı için makul bir limit koymak mantıklı.

# Video hosting virtual host konfigürasyonu
nano /usr/local/lsws/conf/vhosts/media.example.com/vhconf.conf
virtualHost media.example.com  {
  vhRoot                  /var/www/media.example.com
  configFile              $SERVER_ROOT/conf/vhosts/media.example.com/vhconf.conf
  allowSymbolLink         1
  enableScript            0
  restrained              1

  throttle  {
    outBandwidth          2097152
    staticReqPerSec       50
    dynReqPerSec          10
  }

  context /videos/  {
    location              $VH_ROOT/videos
    allowBrowse           0
    throttle  {
      outBandwidth        1048576
    }
  }
}

Burada /videos/ dizini için ayrıca daha sıkı bir limit uyguladık. 1048576 bytes/saniye yani 1 MB/s, standart bir video stream için yeterli ama aynı anda çok sayıda kullanıcı bağlandığında sunucuyu ezmeyecek bir değer.

Gerçek Dünya Senaryosu 2: Paylaşımlı Hosting Ortamı

Birden fazla müşterinin sitesini barındırdığınız bir ortamda, tek bir müşterinin abartılı trafik üretmesi diğerlerini etkiler. Bunun için her virtual host’a uygun limitler koymak şart.

#!/bin/bash
# Tüm virtual host'lara throttling ekleyen basit script
VHOSTS_DIR="/usr/local/lsws/conf/vhosts"
OUT_BW="1048576"    # 1 MB/s
IN_BW="524288"      # 512 KB/s
STATIC_RPS="200"
DYN_RPS="50"

for vhost_dir in $VHOSTS_DIR/*/; do
    vhost_name=$(basename "$vhost_dir")
    conf_file="$vhost_dir/vhconf.conf"
    
    if [ -f "$conf_file" ]; then
        # Zaten throttle bloğu var mı kontrol et
        if ! grep -q "throttle" "$conf_file"; then
            echo "Throttle ekleniyor: $vhost_name"
            cat >> "$conf_file" << EOF

throttle  {
  outBandwidth          $OUT_BW
  inBandwidth           $IN_BW
  staticReqPerSec       $STATIC_RPS
  dynReqPerSec          $DYN_RPS
}
EOF
        else
            echo "Throttle zaten mevcut: $vhost_name"
        fi
    fi
done

echo "Tamamlandi. OLS'yi graceful restart yapin."

Bu scripti çalıştırdıktan sonra OLS’yi yeniden başlatmayı unutmayın:

# Script'i çalıştırılabilir yap
chmod +x /usr/local/lsws/add_throttle.sh

# Çalıştır
/usr/local/lsws/add_throttle.sh

# OpenLiteSpeed graceful restart
/usr/local/lsws/bin/lswsctrl restart

Context Bazlı Throttling

OLS’nin güzel özelliklerinden biri, belirli URL path’leri için farklı throttling kuralları tanımlayabilmeniz. Örneğin /api/ endpoint’lerinizi korurken statik dosya indirmelerini daha özgür bırakabilirsiniz.

nano /usr/local/lsws/conf/vhosts/mysite.com/vhconf.conf
context /downloads/  {
  location              /var/www/mysite.com/downloads
  allowBrowse           1
  throttle  {
    outBandwidth        524288
    staticReqPerSec     30
  }
  extraHeaders          <<<END_extraHeaders
X-Content-Type-Options: nosniff
END_extraHeaders
}

context /api/  {
  type                  proxy
  handler               lsapi:php
  throttle  {
    dynReqPerSec        100
    outBandwidth        0
  }
}

context /uploads/  {
  location              /var/www/mysite.com/uploads
  allowBrowse           0
  throttle  {
    inBandwidth         262144
    staticReqPerSec     20
  }
}

Bu örnekte:

  • /downloads/ klasöründen indirmeler 512 KB/s ile sınırlandırıldı
  • /api/ endpoint’leri için bant genişliği sınırsız bırakıldı ama saniyede 100 istek limiti konuldu
  • /uploads/ için gelen trafik 256 KB/s ile sınırlandırıldı

Throttling Durumunu İzlemek

Yapılandırmayı yaptıktan sonra gerçekten çalışıp çalışmadığını test etmek önemli. Bunun için birkaç yöntem var.

# OLS gerçek zamanlı istatistikleri
# .rtreport dosyası anlık durum bilgisi verir
cat /tmp/lshttpd/.rtreport

# Daha okunabilir format için
watch -n 2 'cat /tmp/lshttpd/.rtreport | grep -E "BPS|REQ|THROTTLE"'
# curl ile indirme hızını test et
curl -o /dev/null --max-time 30 
  -w "Hiz: %{speed_download} bytes/saniyenSure: %{time_total}sn" 
  https://example.com/downloads/test-file.zip

Ayrıca wget ile de test yapabilirsiniz:

# wget ile hız testi
wget --progress=bar --limit-rate=0 
  -O /dev/null 
  https://example.com/downloads/test-file.zip 2>&1 | 
  grep -E "KB/s|MB/s"

OLS Log’larını İncelemek

Throttling ile ilgili sorunları debug ederken log dosyaları hayat kurtarıcı.

# Error log'u izle
tail -f /usr/local/lsws/logs/error.log | grep -i throttle

# Access log'dan yüksek bant genişliği kullanan istekleri bul
# (son alan genellikle response boyutudur)
awk '{print $10, $7}' /usr/local/lsws/logs/access.log | 
  sort -rn | head -20

# Konfigurasyon syntax kontrolü
/usr/local/lsws/bin/lswsctrl configtest

Yaygın Sorunlar ve Çözümleri

Throttling yapılandırmasında sık karşılaşılan birkaç sorun var:

Throttle değerleri uygulanmıyor gibi görünüyor:

Öncelikle konfigurasyon dosyası syntax hatası olup olmadığını kontrol edin. OLS bazen hatalı konfig varken eski ayarlarla çalışmaya devam eder.

# Konfig syntax testi
/usr/local/lsws/bin/lswsctrl configtest

# OLS process durumunu kontrol et
ps aux | grep lshttpd

# Port dinleme durumu
ss -tlnp | grep lshttpd

Graceful restart sonrası değişiklikler aktif olmadı:

Graceful restart yerine tam restart deneyin:

# Graceful restart
/usr/local/lsws/bin/lswsctrl restart

# Çalışmıyorsa tam stop/start
/usr/local/lsws/bin/lswsctrl stop
sleep 3
/usr/local/lsws/bin/lswsctrl start

Cache’lenmiş içerik throttling’i bypass ediyor:

OLS’nin LiteSpeed Cache eklentisi aktifse, cache’den dönen içerik bazen throttle kurallarını atlar. Cache konfigürasyonunuzu kontrol edin.

  • Cache’i geçici olarak devre dışı bırakıp testi tekrarlayın
  • X-LiteSpeed-Cache response header’ını kontrol edin, “hit” yazıyorsa cache’den geliyor demektir
  • Virtual host bazlı throttling yerine context bazlı throttling deneyin

Güvenlik ile Birleştirmek

Throttling sadece bant genişliği yönetimi için değil, basit bir DDoS koruması olarak da işe yarar. Özellikle dynReqPerSec değerini düşük tutmak, brute force saldırıları ve bot trafiğini önemli ölçüde kısar.

# Fail2ban ile OLS throttle log'larını kombinlemek
# /etc/fail2ban/filter.d/ols-throttle.conf
cat > /etc/fail2ban/filter.d/ols-throttle.conf << 'EOF'
[Definition]
failregex = [INFO] .* throttled, client: <HOST>
            [WARN] .* connection throttled .* from <HOST>
ignoreregex =
EOF

# /etc/fail2ban/jail.local'a ekle
cat >> /etc/fail2ban/jail.local << 'EOF'

[ols-throttle]
enabled  = true
port     = http,https
logpath  = /usr/local/lsws/logs/error.log
filter   = ols-throttle
maxretry = 10
findtime = 60
bantime  = 3600
EOF

systemctl restart fail2ban

Performans Etkisini Değerlendirmek

Throttling aktifken sunucu kaynak kullanımının nasıl değiştiğini izlemek önemli. Çok agresif limitler koyarsanız meşru kullanıcıları da olumsuz etkilersiniz.

# Basit yük testi - ab (Apache Bench) ile
ab -n 1000 -c 50 -k https://example.com/downloads/test.pdf

# Sonuçlarda "Transfer rate" değerine bakın
# Bu değer throttle limitinizin altında olmalı

# Daha gelişmiş test için wrk
wrk -t12 -c400 -d30s https://example.com/

Throttle değerlerinizi belirlerken şu faktörleri göz önünde bulundurun:

  • Sunucunuzun toplam bant genişliği
  • Ortalama eş zamanlı kullanıcı sayısı
  • İçerik tipine göre beklenen dosya boyutları
  • SLA veya hizmet seviyesi taahhütleriniz
  • Peak saatlerdeki trafik pattern’ı

İyi bir başlangıç noktası olarak: toplam bant genişliğinizi maksimum eş zamanlı bağlantı sayısına bölün ve bu değerin %60-70’ini tek bağlantı limiti olarak kullanın. Bu size hem makul bir kullanıcı deneyimi hem de sistem güvencesi sağlar.

Sonuç

OpenLiteSpeed’de bandwidth throttling, basit görünse de doğru yapılandırıldığında sunucu kaynaklarını korumanın ve adil kullanım politikası uygulamanın en etkili yollarından biri. Sunucu geneli, virtual host bazlı ve context bazlı olmak üzere üç katmanlı bir yaklaşım benimsemek, hem esneklik hem de güvenlik açısından en sağlıklı seçenek.

Yapılandırmayı yaptıktan sonra mutlaka test edin, log’ları izleyin ve kullanıcı geri bildirimlerini takip edin. Çok kısıtlayıcı limitler meşru kullanıcıları rahatsız eder, çok gevşek limitler ise throttling’in amacını ortadan kaldırır. Doğru denge, sunucunuzun kapasitesini ve kullanım pattern’larını iyi analiz etmekten geçiyor.

Son olarak, OLS’yi cPanel/WHM veya CyberPanel gibi kontrol panelleriyle birlikte kullanıyorsanız, panel üzerinden yapılan değişikliklerin konfig dosyalarının üzerine yazabileceğini unutmayın. Bu durumda throttling ayarlarınızı panel arayüzünden yönetmek çok daha güvenli olur.

Yorum yapın