OpenLiteSpeed ile Reverse Proxy ve Backend Yönetimi

Modern web mimarilerinde tek bir sunucunun her şeyi halletmesi artık pek mümkün değil. Uygulama sunucuları, cache katmanları, mikroservisler derken ortaya karmaşık bir yapı çıkıyor. İşte tam bu noktada reverse proxy devreye giriyor ve OpenLiteSpeed bu işi hem performanslı hem de yönetilebilir şekilde yapıyor. Bu yazıda OLS’nin reverse proxy yeteneklerini derinlemesine inceleyeceğiz, gerçek dünya senaryolarıyla backend yönetimini ele alacağız.

OpenLiteSpeed Reverse Proxy Nedir ve Neden Kullanılır?

Reverse proxy, istemcilerden gelen istekleri alıp arkadaki backend sunuculara ileten bir aracı katmandır. Nginx veya Apache’nin bu konuda köklü bir geçmişi olsa da OpenLiteSpeed, event-driven mimarisi sayesinde yüksek eşzamanlı bağlantılarda çok daha az kaynak tüketiyor.

OLS ile reverse proxy kurduğunuzda şu avantajları elde edersiniz:

  • SSL termination: TLS handshake’i OLS üstlenir, backend düz HTTP konuşabilir
  • Load balancing: Birden fazla backend arasında trafik dağıtımı
  • Health check: Backend sunucuları otomatik izleme ve devre dışı bırakma
  • Cache entegrasyonu: LSCache ile backend yanıtlarını önbellekleme
  • Bağlantı havuzu: Backend bağlantılarını yeniden kullanarak gecikmeyi azaltma

Tipik kullanım senaryoları şunlar oluyor: Node.js uygulaması önüne OLS koymak, birden fazla PHP-FPM pool yönetmek, Django veya FastAPI servislerini dışarıya açmak, Kubernetes pod’larına trafik yönlendirmek.

Temel Reverse Proxy Yapılandırması

OLS’de reverse proxy yapılandırması iki yolla yapılır: WebAdmin GUI üzerinden veya doğrudan konfigürasyon dosyalarını düzenleyerek. Ben her ikisini de göstereceğim ama production’da dosya tabanlı yaklaşımı tercih ediyorum, çünkü git ile versiyonlayabiliyorsunuz.

OLS’nin ana konfigürasyon dosyası genellikle şu konumdadır:

/usr/local/lsws/conf/httpd_config.conf

Virtual host konfigürasyonları ise burada bulunur:

/usr/local/lsws/conf/vhosts/

Basit bir Node.js uygulaması için reverse proxy kurulumu yapalım. Diyelim ki 3000 portunda çalışan bir Express.js uygulamanız var.

# Virtual host konfigürasyon dosyası oluştur
mkdir -p /usr/local/lsws/conf/vhosts/myapp
nano /usr/local/lsws/conf/vhosts/myapp/vhconf.conf

Virtual host konfigürasyon dosyasının temel hali:

docRoot                   /var/www/myapp/public
enableGzip                1
enableBr                  1

context / {
  type                    proxy
  handler                 backend_nodejs
  addDefaultCharset       off
}

extprocessor backend_nodejs {
  type                    proxy
  address                 127.0.0.1:3000
  maxConns                100
  pcKeepAliveTimeout      60
  initTimeout             60
  retryTimeout            0
  respBuffer              0
}

Bu basit yapılandırma bile birçok şeyi otomatik halledecek. OLS, bağlantı havuzunu yönetecek, timeout’ları kontrol edecek ve hata durumlarını loglayacak.

Load Balancer Olarak Kullanım

Gerçek dünya senaryosuna geçelim. Bir e-ticaret sitesinde trafik artışlarını yönetmek için 3 adet uygulama sunucusu kurduğunuzu varsayalım. OLS’yi load balancer olarak yapılandıralım:

# /usr/local/lsws/conf/vhosts/ecommerce/vhconf.conf

docRoot                   /var/www/ecommerce/public
enableGzip                1

extprocessor app_server_1 {
  type                    proxy
  address                 192.168.1.101:8080
  maxConns                300
  pcKeepAliveTimeout      60
  initTimeout             60
  retryTimeout            300
  respBuffer              0
}

extprocessor app_server_2 {
  type                    proxy
  address                 192.168.1.102:8080
  maxConns                300
  pcKeepAliveTimeout      60
  initTimeout             60
  retryTimeout            300
  respBuffer              0
}

extprocessor app_server_3 {
  type                    proxy
  address                 192.168.1.103:8080
  maxConns                300
  pcKeepAliveTimeout      60
  initTimeout             60
  retryTimeout            300
  respBuffer              0
}

vhssl {
  keyFile                 /etc/letsencrypt/live/shop.example.com/privkey.pem
  certFile                /etc/letsencrypt/live/shop.example.com/fullchain.pem
  certChain               1
  sslProtocol             24
  ciphers                 ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256
}

Load balancer grubunu ayrı bir cluster olarak tanımlamak daha temiz bir yaklaşım:

# httpd_config.conf içine eklenecek cluster tanımı

extprocessor app_cluster {
  type                    loadbalancer
  children                app_server_1, app_server_2, app_server_3
  loadbalance             roundrobin
}

context / {
  type                    proxy
  handler                 app_cluster
  addDefaultCharset       off
}

loadbalance parametresi için seçenekler şunlar:

  • roundrobin: Sıralı dağıtım, en basit yöntem
  • leastconn: En az aktif bağlantıya sahip sunucuya yönlendir
  • random: Rastgele dağıtım
  • static: İlk sunucu her zaman öncelikli, diğerleri yedek

Üretim ortamında genellikle leastconn tercih ediyorum. Özellikle işlem süreleri değişken olan uygulamalarda daha adil bir dağıtım sağlıyor.

Health Check ve Otomatik Failover

Backend sunuculardan birinin çökmesi durumunda trafiği otomatik olarak yönlendirmek kritik önem taşır. OLS’nin health check mekanizması bunu hallediyor:

extprocessor app_server_1 {
  type                    proxy
  address                 192.168.1.101:8080
  maxConns                300
  pcKeepAliveTimeout      60
  initTimeout             60
  retryTimeout            300
  respBuffer              0
  
  # Health check ayarları
  pingPath                /health
  pingInterval            10
  pingTimeout             5000
  persistConn             1
}

Uygulama tarafında basit bir health check endpoint’i olması gerekiyor. Node.js için örnek:

# Express.js health check endpoint
cat > /var/www/myapp/health.js << 'EOF'
app.get('/health', (req, res) => {
  // Veritabanı bağlantısını da kontrol edebilirsiniz
  const healthCheck = {
    status: 'UP',
    timestamp: new Date().toISOString(),
    uptime: process.uptime()
  };
  
  try {
    res.status(200).json(healthCheck);
  } catch (error) {
    healthCheck.status = 'DOWN';
    res.status(503).json(healthCheck);
  }
});
EOF

OLS, pingPath endpoint’ine belirtilen aralıklarla istek gönderir. Yanıt gelmezse veya HTTP 5xx dönerse sunucuyu devre dışı bırakır, retryTimeout süresi dolunca tekrar dener.

Header Yönetimi ve Pass-Through Yapılandırması

Reverse proxy kullanırken backend uygulamanızın gerçek IP adresini görmesi önemli. Aksi takdirde tüm istekler OLS’nin IP’sinden geliyormuş gibi görünür, log analizleri anlamsızlaşır, rate limiting çalışmaz.

context / {
  type                    proxy
  handler                 app_cluster
  addDefaultCharset       off
  
  # Gerçek IP'yi ilet
  extraHeaders            set X-Real-IP $remote_addr
  extraHeaders            set X-Forwarded-For $remote_addr
  extraHeaders            set X-Forwarded-Proto $scheme
  extraHeaders            set X-Forwarded-Host $host
}

Backend uygulamanızın bu header’ları okuması gerekiyor. Nginx ile çalışanlara tanıdık gelecek bu yapı, OLS’de de aynı şekilde çalışıyor.

Güvenlik açısından önemli bir nokta: Backend’den dönen bazı header’ları gizlemek isteyebilirsiniz. Örneğin uygulama framework’ünüzü ifşa eden header’lar:

# Rewrite kurallarıyla güvenlik header'ları ekle ve istenmeyen header'ları kaldır
rewrite  {
  rules                   <<<END_rules
  RewriteRule ^(.*)$ $1 [L,E=LSWS_HEADER:X-Powered-By:]
  END_rules
}

WebSocket Desteği

Modern uygulamaların büyük çoğunluğu WebSocket kullanıyor. Canlı bildirimler, gerçek zamanlı güncelleme, chat uygulamaları… OLS’de WebSocket desteği için özel bir yapılandırma gerekiyor:

extprocessor websocket_backend {
  type                    proxy
  address                 127.0.0.1:3001
  maxConns                1000
  pcKeepAliveTimeout      3600
  initTimeout             60
  retryTimeout            0
  respBuffer              0
}

context /ws {
  type                    proxy
  handler                 websocket_backend
  addDefaultCharset       off
}

context /socket.io {
  type                    proxy
  handler                 websocket_backend
  addDefaultCharset       off
}

WebSocket bağlantıları uzun süreli tutulur, bu yüzden pcKeepAliveTimeout değerini yüksek tutmak önemli. Ben genellikle 3600 (1 saat) ya da daha fazla veriyorum, uygulamanın ihtiyacına göre.

Path Tabanlı Yönlendirme

Mikroservis mimarisinde farklı path’leri farklı backend’lere yönlendirmek çok yaygın. Örneğin /api trafiğini Node.js’e, /admin trafiğini ayrı bir servise, statik dosyaları ise direkt olarak sunmak:

# API servisi
extprocessor api_service {
  type                    proxy
  address                 127.0.0.1:3000
  maxConns                200
  pcKeepAliveTimeout      60
  initTimeout             30
  retryTimeout            300
  respBuffer              0
}

# Admin paneli
extprocessor admin_service {
  type                    proxy
  address                 127.0.0.1:4000
  maxConns                50
  pcKeepAliveTimeout      60
  initTimeout             30
  retryTimeout            300
  respBuffer              0
}

# Statik dosyalar için context
context /static {
  location                /var/www/myapp/static/
  allowBrowse             0
  enableExpires           1
  expiresDefault          A604800
}

# API yönlendirmesi
context /api {
  type                    proxy
  handler                 api_service
  addDefaultCharset       off
}

# Admin yönlendirmesi
context /admin {
  type                    proxy
  handler                 admin_service
  addDefaultCharset       off
}

Bu yapılandırmayla tek bir domain üzerinden birden fazla servisi yönetebilirsiniz. Frontend için CDN, API için uygulama sunucusu, yönetim paneli için ayrı bir servis – hepsi aynı OLS instance’ı üzerinden.

SSL Offloading ve Backend Güvenliği

SSL termination OLS’de yapıldığında backend’e düz HTTP gidiyor. Bu performans açısından avantajlı, ancak bazı durumlarda backend’e de HTTPS ile bağlanmak isteyebilirsiniz. Örneğin backend başka bir veri merkezindeyse:

extprocessor secure_backend {
  type                    proxy
  address                 https://backend.internal.example.com:443
  maxConns                100
  pcKeepAliveTimeout      60
  initTimeout             60
  retryTimeout            300
  respBuffer              0
}

Adresin başına https:// eklemek yeterli, OLS backend’e SSL ile bağlanacak.

İç ağda self-signed sertifika kullanıyorsanız sertifika doğrulamasını devre dışı bırakmanız gerekebilir. Bunu OLS WebAdmin’de extprocessor ayarlarından yapabilirsiniz. Ancak bu güvenlik riski oluşturur, production’da dikkatli olun.

Rate Limiting ve Güvenlik Katmanı

Reverse proxy konumundaki OLS, rate limiting için mükemmel bir yer. Backend’e gereksiz yük binmeden önce trafiği filtreleyebilirsiniz:

# httpd_config.conf içinde genel rate limiting
connTimeout               300
maxConnections            20000
maxSSLConnections         10000

# Virtual host bazında daha sıkı limitler
rewrite  {
  rules                   <<<END_rules
  RewriteCond %{REQUEST_URI} ^/api/login [NC]
  RewriteRule .* - [F,L]
  END_rules
}

OLS’nin mod_security entegrasyonu da bu katmanda devreye girebilir. Özellikle API gateway olarak kullandığınızda WAF özelliğini aktif etmek mantıklı.

Botları ve kötü niyetli tarayıcıları engellemek için:

# .htaccess veya vhconf.conf içinde
rewrite {
  rules <<<END_rules
  RewriteCond %{HTTP_USER_AGENT} (wget|curl|python-requests|Go-http-client) [NC]
  RewriteRule .* - [F,L]
  END_rules
}

Logging ve İzleme

Reverse proxy trafiğini izlemek için özel log formatı tanımlamak hayat kurtarır. Hangi backend’e ne kadar sürede cevap verdiğini görmek performans sorunlarını tespit etmek için kritik:

# httpd_config.conf içinde log formatı
log {
  useServer               0
  fileName                /usr/local/lsws/logs/myapp_access.log
  logFormat               "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i" %T/%D"
  logHeaders              5
  rollingSize             100M
  keepDays                30
  compressArchive         1
}

Log analizi için basit bir script:

#!/bin/bash
# Backend yanıt sürelerini analiz et
LOG_FILE="/usr/local/lsws/logs/myapp_access.log"

echo "=== En Yavaş 10 İstek ==="
awk '{print $NF, $7}' $LOG_FILE | sort -rn | head -10

echo ""
echo "=== 5xx Hataları ==="
grep '" 5' $LOG_FILE | awk '{print $9}' | sort | uniq -c | sort -rn

echo ""
echo "=== Saatlik İstek Dağılımı ==="
awk '{print $4}' $LOG_FILE | cut -d: -f2 | sort | uniq -c

Bu scripti cron’a ekleyip günlük rapor alabilirsiniz. Ben genellikle sabah 7’de çalıştırıp gece yarısından sonraki anormal trafiği sabah görüyorum.

Konfigürasyon Testi ve Graceful Reload

Değişiklik yaptıktan sonra OLS’yi yeniden başlatmadan konfigürasyonu test etmek isteyebilirsiniz:

# Konfigürasyon sözdizimini kontrol et
/usr/local/lsws/bin/lswsctrl configtest

# Graceful restart (mevcut bağlantıları kesmeden)
/usr/local/lsws/bin/lswsctrl restart

# Sadece konfigürasyonu yeniden yükle
kill -HUP $(cat /usr/local/lsws/admin/tmp/.lshttpd.pid)

Birden fazla sunucu yönetiyorsanız konfigürasyon değişikliklerini otomatize etmek için:

#!/bin/bash
# deploy_config.sh - OLS konfigürasyonunu güncelle ve test et

CONF_DIR="/usr/local/lsws/conf"
BACKUP_DIR="/backup/lsws-conf"

# Yedek al
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
cp -r $CONF_DIR $BACKUP_DIR/conf_$TIMESTAMP

# Yeni konfigürasyonu uygula
cp /deploy/lsws-conf/* $CONF_DIR/vhosts/myapp/

# Sözdizimi kontrolü
if /usr/local/lsws/bin/lswsctrl configtest; then
  echo "Konfigürasyon geçerli, yeniden yükleniyor..."
  /usr/local/lsws/bin/lswsctrl restart
  echo "OLS başarıyla yeniden yüklendi"
else
  echo "HATA: Konfigürasyon geçersiz, önceki sürüme dönülüyor..."
  cp -r $BACKUP_DIR/conf_$TIMESTAMP/* $CONF_DIR/
  exit 1
fi

Gerçek Dünya Senaryosu: Django Uygulaması

Bir Django uygulamasını OLS arkasında çalıştıralım. Django, Gunicorn WSGI sunucusuyla birlikte çalışır ve OLS bu servisi reverse proxy olarak sunar:

# Gunicorn servisi systemd ile başlatılıyor
# /etc/systemd/system/gunicorn.service
cat > /etc/systemd/system/gunicorn.service << 'EOF'
[Unit]
Description=Gunicorn Django App
After=network.target

[Service]
User=www-data
Group=www-data
WorkingDirectory=/var/www/djangoapp
ExecStart=/var/www/djangoapp/venv/bin/gunicorn 
          --workers 4 
          --bind 127.0.0.1:8000 
          --timeout 120 
          --access-logfile /var/log/gunicorn/access.log 
          --error-logfile /var/log/gunicorn/error.log 
          djangoapp.wsgi:application
Restart=always

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable gunicorn
systemctl start gunicorn

OLS virtual host konfigürasyonu:

# /usr/local/lsws/conf/vhosts/django/vhconf.conf

docRoot                   /var/www/djangoapp/static

extprocessor gunicorn_backend {
  type                    proxy
  address                 127.0.0.1:8000
  maxConns                50
  pcKeepAliveTimeout      300
  initTimeout             120
  retryTimeout            300
  respBuffer              0
}

# Statik dosyalar OLS'den direkt sunulsun
context /static {
  location                /var/www/djangoapp/staticfiles/
  allowBrowse             0
  enableExpires           1
  expiresDefault          A2592000
}

context /media {
  location                /var/www/djangoapp/media/
  allowBrowse             0
  enableExpires           1
  expiresDefault          A2592000
}

# Diğer her şeyi Django'ya yönlendir
context / {
  type                    proxy
  handler                 gunicorn_backend
  addDefaultCharset       off
}

Bu yapılandırmayla statik dosyalar doğrudan OLS tarafından sunulur, Django uygulamasına gereksiz yük binmez. Django’nun collectstatic komutuyla toplanan dosyalar staticfiles/ klasöründe olacak ve OLS bunları çok daha hızlı serve edecek.

Sonuç

OpenLiteSpeed’in reverse proxy yetenekleri, Nginx’e kıyasla belki daha az bilinse de gerçek anlamda kurumsal düzeyde özellikler sunuyor. Event-driven mimarisi sayesinde yüksek eşzamanlı bağlantılarda diğer sunuculardan daha az kaynak tüketiyor. Health check, load balancing, SSL offloading ve WebSocket desteği gibi özellikleri tek bir konfigürasyon dosyasında yönetebiliyorsunuz.

Buraya kadar anlattıklarımı özetlemek gerekirse: Path tabanlı yönlendirmeyle mikroservis mimarisi kurabilirsiniz, leastconn algoritmasıyla akıllı load balancing yapabilirsiniz, health check mekanizmasıyla otomatik failover sağlayabilirsiniz ve graceful reload ile zero-downtime deployment gerçekleştirebilirsiniz.

Eğer şu an Nginx veya Apache ile reverse proxy yapıyorsanız ve performans sıkıntısı yaşıyorsanız, OLS’yi test ortamında denemenizi kesinlikle tavsiye ederim. Geçiş süreci göründüğü kadar zor değil, konfigürasyon dili birkaç saatte oturuyor. Akıllıca yapılandırılmış bir OLS reverse proxy, backend sunucularınızın ömrünü ciddi ölçüde uzatacak.

Yorum yapın