OpenLiteSpeed ile Node.js Uygulaması Reverse Proxy Yapılandırması

Node.js uygulamalarını doğrudan internete açmak yerine bir web sunucusunun arkasına koymak, production ortamlarında neredeyse zorunlu bir pratik haline geldi. OpenLiteSpeed bu iş için hem hafif hem de son derece yetenekli bir seçenek. Apache veya Nginx’e kıyasla daha az belgelenmiş olsa da, doğru yapılandırıldığında Node.js uygulamalarını proxy etmede gerçekten etkileyici performans gösteriyor. Bu yazıda sıfırdan başlayarak tam çalışan bir Node.js proxy ortamı kuracağız.

Neden OpenLiteSpeed ile Node.js Proxy?

Çoğu sysadmin Node.js uygulamalarını Nginx veya Apache arkasına koyar. OpenLiteSpeed’i tercih etmek için birkaç güçlü neden var:

  • Düşük bellek tüketimi: Benzer yük altında Nginx’ten bile daha az RAM kullanır
  • Event-driven mimari: Node.js’in asenkron yapısıyla uyumlu çalışır
  • Web admin paneli: Grafik arayüzden yapılandırma değişikliği yapılabilir, ancak biz her şeyi config dosyasından yapacağız
  • HTTP/2 ve HTTP/3 desteği: Kutudan çıktığı gibi modern protokolleri destekler
  • WebSocket desteği: Socket.io veya benzeri kütüphaneler kullanan uygulamalar için kritik

Gerçek dünya senaryosu olarak şunu hayal edelim: Bir e-ticaret platformu için Express.js tabanlı bir REST API geliştirdiniz. Bu API’yi 3000 portunda çalıştırıyorsunuz ve OpenLiteSpeed üzerinden SSL ile dışarıya açmanız gerekiyor. Aynı zamanda birden fazla Node.js servisi var ve bunları farklı path’ler üzerinden yönlendirmeniz gerekiyor.

Ön Gereksinimler ve Kurulum

Ubuntu 22.04 veya CentOS/AlmaLinux 8+ üzerinde çalışacağız. OpenLiteSpeed’in kurulu olduğunu varsayıyorum ama değilse önce onu halledelim.

# Ubuntu/Debian için
wget -O - https://repo.litespeed.sh | sudo bash
sudo apt-get install openlitespeed

# AlmaLinux/CentOS için
wget -O - https://repo.litespeed.sh | sudo bash
sudo dnf install openlitespeed

# Servis durumunu kontrol et
sudo systemctl status lshttpd
sudo systemctl enable lshttpd

Node.js ve PM2’nin kurulu olduğundan emin olalım:

# Node.js kurulumu (NodeSource üzerinden)
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs

# PM2 kurulumu (process manager olarak)
sudo npm install -g pm2

# Versiyonları doğrula
node --version
npm --version
pm2 --version

Örnek Node.js Uygulaması Hazırlama

Önce proxy yapacağımız basit bir Express uygulaması oluşturalım. Bu uygulama gerçek bir API’yi simüle edecek.

# Uygulama dizini oluştur
sudo mkdir -p /var/www/myapi
sudo chown -R $USER:$USER /var/www/myapi
cd /var/www/myapi

# Package.json oluştur
npm init -y
npm install express cors helmet morgan

Basit bir uygulama dosyası oluşturalım:

cat > /var/www/myapi/app.js << 'EOF'
const express = require('express');
const cors = require('cors');
const helmet = require('helmet');
const morgan = require('morgan');

const app = express();
const PORT = process.env.PORT || 3000;

app.use(helmet());
app.use(cors());
app.use(morgan('combined'));
app.use(express.json());

// Health check endpoint
app.get('/api/health', (req, res) => {
  res.json({ 
    status: 'ok', 
    timestamp: new Date().toISOString(),
    uptime: process.uptime()
  });
});

// Örnek API endpoint
app.get('/api/products', (req, res) => {
  res.json({
    products: [
      { id: 1, name: 'Ürün A', price: 99.99 },
      { id: 2, name: 'Ürün B', price: 149.99 }
    ]
  });
});

app.listen(PORT, '127.0.0.1', () => {
  console.log(`API sunucusu ${PORT} portunda çalışıyor`);
});
EOF

PM2 ile uygulamayı başlatıp sistem yeniden başladığında otomatik çalışmasını sağlayalım:

# Uygulamayı PM2 ile başlat
cd /var/www/myapi
pm2 start app.js --name "myapi" --env production

# PM2 startup script oluştur
pm2 startup
# Çıktıdaki komutu sudo ile çalıştır

pm2 save

# Çalıştığını doğrula
pm2 status
curl http://127.0.0.1:3000/api/health

OpenLiteSpeed Yapılandırma Dosyası Anlayışı

OpenLiteSpeed’in yapılandırması /usr/local/lsws/conf/httpd_config.conf dosyasında bulunur. Virtual host’lar ise /usr/local/lsws/conf/vhosts/ dizini altındaki klasörlerde tutulur. Bu yapıyı anlamak çok önemli çünkü admin panelinden değişiklik yapsak bile sonuçta bu dosyalar güncelleniyor.

OpenLiteSpeed’de proxy yapılandırması için birkaç temel konsepti bilmek gerekiyor:

  • extprocessor: Dış işlem tanımı, Node.js’i buraya tanımlıyoruz
  • context: URL path’lerini işleyicilere bağlar
  • vhssl: SSL yapılandırması için blok
  • rewrite: URL yönlendirme kuralları

Virtual Host Yapılandırması

Önce virtual host dizin yapısını oluşturalım:

# Virtual host dizinleri
sudo mkdir -p /usr/local/lsws/conf/vhosts/mysite
sudo mkdir -p /var/www/mysite/html
sudo mkdir -p /var/log/lsws/mysite

# Sahiplik ayarları
sudo chown -R nobody:nogroup /var/www/mysite
sudo chmod -R 755 /var/www/mysite

Şimdi virtual host yapılandırma dosyasını oluşturalım. Bu dosya OpenLiteSpeed’in kalbi sayılır:

sudo tee /usr/local/lsws/conf/vhosts/mysite/vhconf.conf << 'EOF'
docRoot                   /var/www/mysite/html
vhDomain                  mysite.com
vhAliases                 www.mysite.com
adminEmails               [email protected]
enableGzip                1
enableBr                  1

index  {
  useServer               0
  indexFiles              index.html
}

# Node.js API için External Processor tanımı
extprocessor myapi {
  type                    proxy
  address                 http://127.0.0.1:3000
  maxConns                100
  initTimeout             60
  retryTimeout            0
  checkInterval           10
  pcKeepAliveTimeout      30
  respBuffer              0
  autoStart               0
  memSoftLimit            200M
  memHardLimit            300M
  procSoftLimit           400
  procHardLimit           500
}

# /api path'i Node.js'e yönlendir
context /api/ {
  type                    proxy
  handler                 myapi
  addDefaultCharset       off
}

# WebSocket desteği için
context /socket.io/ {
  type                    proxy
  handler                 myapi
  addDefaultCharset       off
}

# Statik dosyalar için ayrı context
context / {
  location                /var/www/mysite/html
  allowBrowse             0
  rewrite  {
    enable                1
    rules                 <<<END_rules
      RewriteRule ^/$ /index.html [L]
    END_rules
  }
  addDefaultCharset       off
}

# Access log
accessLog {
  fileName                /var/log/lsws/mysite/access.log
  logFormat               "%h %l %u %t "%r" %>s %b"
  logHeaders              5
  rollingSize             10M
  keepDays                30
  compressArchive         1
}
EOF

Ana Yapılandırma Dosyasına Virtual Host Ekleme

Virtual host’u ana yapılandırmaya bağlamamız gerekiyor:

sudo nano /usr/local/lsws/conf/httpd_config.conf

Listener ve virtual host tanımlarını ekleyin. Dosyanın listener bölümünü bulup şu şekilde güncelleyin:

# httpd_config.conf içine eklenecek kısımlar

listener HTTP {
  address                 *:80
  secure                  0
  map                     mysite mysite.com, www.mysite.com
}

listener HTTPS {
  address                 *:443
  secure                  1
  keyFile                 /etc/letsencrypt/live/mysite.com/privkey.pem
  certFile                /etc/letsencrypt/live/mysite.com/fullchain.pem
  certChain               1
  sslProtocol             24
  ciphers                 ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
  enableECDHE             1
  renegProtection         1
  sslSessionCache         1
  sslSessionTickets       0
  enableSpdy              15
  enableQuic              1
  map                     mysite mysite.com, www.mysite.com
}

virtualHost mysite {
  vhRoot                  /usr/local/lsws/conf/vhosts/mysite/
  configFile              vhconf.conf
  allowSymbolLink         1
  enableScript            1
  restrained              0
}

HTTP’den HTTPS’ye Yönlendirme

HTTP’yi HTTPS’ye yönlendirmek için virtual host yapılandırmasına rewrite kuralları ekleyelim. Bu production ortamı için zorunlu:

sudo tee -a /usr/local/lsws/conf/vhosts/mysite/vhconf.conf << 'EOF'

# HTTP to HTTPS redirect
rewrite  {
  enable                  1
  autoLoadHtaccess        0
  rules                   <<<END_rules
    RewriteCond %{SERVER_PORT} !^443$
    RewriteRule (.*) https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
  END_rules
}
EOF

WebSocket Proxy Yapılandırması

Eğer Socket.io veya native WebSocket kullanıyorsanız, OpenLiteSpeed’de WebSocket desteğini özellikle açmanız gerekiyor. Bu çoğu zaman gözden kaçıyor ve uygulamalar WebSocket bağlantısında timeout yaşıyor.

sudo tee /usr/local/lsws/conf/vhosts/mysite/websocket.conf << 'EOF'
# Bu kısmı vhconf.conf'a dahil edebilirsiniz

extprocessor myapi_ws {
  type                    proxy
  address                 http://127.0.0.1:3000
  maxConns                200
  initTimeout             60
  retryTimeout            0
  checkInterval           10
  pcKeepAliveTimeout      3600
  respBuffer              0
  autoStart               0
}

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

Proxy header’larını düzgün iletmek için ana yapılandırmada şu ayarı kontrol edin:

# httpd_config.conf içinde proxy header ayarları
# Bu ayarlar Node.js uygulamasının gerçek IP'yi görmesini sağlar

proxy {
  maxConnections          100
  connTimeout             60
  retry                   0
  checkInterval           10
  persistConn             1
  respBuffer              0
}

Birden Fazla Node.js Servisi için Yapılandırma

Gerçek dünyada genellikle birden fazla Node.js servisi olur. Örneğin ana API 3000’de, auth servisi 3001’de, notification servisi 3002’de çalışıyor olabilir.

sudo tee /usr/local/lsws/conf/vhosts/mysite/multiservice.conf << 'EOF'
# Ana API servisi
extprocessor main_api {
  type                    proxy
  address                 http://127.0.0.1:3000
  maxConns                100
  initTimeout             60
  retryTimeout            0
  checkInterval           10
  pcKeepAliveTimeout      30
  respBuffer              0
  autoStart               0
}

# Auth servisi
extprocessor auth_api {
  type                    proxy
  address                 http://127.0.0.1:3001
  maxConns                50
  initTimeout             60
  retryTimeout            0
  checkInterval           10
  pcKeepAliveTimeout      30
  respBuffer              0
  autoStart               0
}

# Notification servisi
extprocessor notification_api {
  type                    proxy
  address                 http://127.0.0.1:3002
  maxConns                50
  initTimeout             60
  retryTimeout            0
  checkInterval           10
  pcKeepAliveTimeout      30
  respBuffer              0
  autoStart               0
}

# URL yönlendirmeleri
context /api/v1/ {
  type                    proxy
  handler                 main_api
  addDefaultCharset       off
}

context /api/auth/ {
  type                    proxy
  handler                 auth_api
  addDefaultCharset       off
}

context /api/notifications/ {
  type                    proxy
  handler                 notification_api
  addDefaultCharset       off
}
EOF

Yapılandırmayı Test Etme ve Servisi Yeniden Başlatma

Değişiklikleri uygulamadan önce yapılandırma dosyasını test etmek iyi bir alışkanlık:

# Yapılandırmayı kontrol et
sudo /usr/local/lsws/bin/lshttpd -t

# Servisi graceful restart ile yeniden başlat
sudo /usr/local/lsws/bin/lswsctrl restart

# Veya systemd üzerinden
sudo systemctl restart lshttpd

# Servis durumunu kontrol et
sudo systemctl status lshttpd

# Log'ları izle
sudo tail -f /usr/local/lsws/logs/error.log
sudo tail -f /var/log/lsws/mysite/access.log

Proxy’nin çalışıp çalışmadığını test edelim:

# HTTP testi
curl -v http://mysite.com/api/health

# HTTPS testi
curl -v https://mysite.com/api/health

# Header kontrolü (X-Forwarded-For gibi proxy header'larını doğrula)
curl -I https://mysite.com/api/health

# WebSocket testi (wscat gerekli: npm install -g wscat)
wscat -c wss://mysite.com/socket.io/

Güvenlik Ayarları ve Header Yönetimi

Proxy arkasındaki Node.js uygulamasının güvenli çalışması için bazı header ayarları yapmak gerekiyor:

# vhconf.conf içine eklenecek güvenlik header'ları
# headerOps direktifi ile response header'larını düzenleyebiliriz

module mod_security {
}

# Aşağıdakileri context tanımlarının dışına, genel bölüme ekleyin
rewrite  {
  enable                  1
  rules                   <<<END_rules
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set X-XSS-Protection "1; mode=block"
    Header always set Referrer-Policy "strict-origin-when-cross-origin"
  END_rules
}

Node.js tarafında ise Express uygulamanızın proxy arkasında çalıştığını belirtmeniz gerekiyor:

# app.js içinde şu ayarı ekleyin
# Bu sayede req.ip gerçek kullanıcı IP'sini gösterir

cat >> /var/www/myapi/app.js << 'EOF'

// Proxy güven ayarı - OpenLiteSpeed arkasında çalışırken
app.set('trust proxy', 1);

// Gerçek IP'yi logla
app.get('/api/ip-test', (req, res) => {
  res.json({ 
    realIP: req.ip,
    forwardedFor: req.headers['x-forwarded-for'],
    protocol: req.protocol
  });
});
EOF

Rate Limiting ve Bant Genişliği Yönetimi

OpenLiteSpeed seviyesinde temel rate limiting ekleyebilirsiniz. Bu Node.js uygulamasına gereksiz yük binmesini engeller:

sudo tee -a /usr/local/lsws/conf/vhosts/mysite/vhconf.conf << 'EOF'

# Bağlantı limitleri
throttle {
  staticReqPerSec         100
  dynReqPerSec            50
  outBandwidth            1024
  inBandwidth             0
  dynResponseSize         0
  hardLimit               1
}

# IP bazlı bağlantı limiti
perClientConnLimit {
  dynReqPerSec            20
  staticReqPerSec         50
  softLimit               50
  hardLimit               100
  gracePeriod             15
  banPeriod               300
}
EOF

Yaygın Sorunlar ve Çözümleri

Gerçek ortamlarda karşılaşılan tipik problemler ve çözümleri:

502 Bad Gateway hatası aldığınızda ilk kontrol etmeniz gereken şey Node.js servisinin ayakta olup olmadığı:

# Node.js servis durumu
pm2 status
pm2 logs myapi --lines 50

# Port dinleniyor mu?
sudo ss -tlnp | grep 3000
sudo netstat -tlnp | grep 3000

# OpenLiteSpeed error log
sudo tail -50 /usr/local/lsws/logs/error.log

504 Gateway Timeout için extprocessor timeout değerlerini artırın. Özellikle uzun süren işlemler yapan API’ler için bu kritik:

# vhconf.conf'ta extprocessor bloğunu şöyle güncelleyin
extprocessor myapi {
  type                    proxy
  address                 http://127.0.0.1:3000
  maxConns                100
  initTimeout             120
  retryTimeout            0
  checkInterval           10
  pcKeepAliveTimeout      60
  respBuffer              0
  autoStart               0
}

X-Forwarded-For header’ı gelmiyor sorununda ana yapılandırma dosyasında şu satırın varlığını kontrol edin:

# httpd_config.conf içinde
useIpInProxyHeader      1

Büyük dosya yüklemelerinde sorun yaşıyorsanız:

# vhconf.conf içine
tuning {
  maxReqURLLen            32768
  maxReqHeaderSize        65536
  maxReqBodySize          2048M
  maxCachedSmallFileSize  4096
  totalInMemCacheSize     40M
}

PM2 ve OpenLiteSpeed Entegrasyonu Monitoring

Production ortamında her iki servisi de izlemek gerekiyor:

# PM2 monitoring dashboard
pm2 monit

# PM2 log rotation kurulumu
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 50M
pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress true

# OpenLiteSpeed istatistikleri
curl http://localhost:7080/status

# Anlık bağlantı sayısı
sudo /usr/local/lsws/bin/lswsctrl status

# Canlı log izleme (hem OLS hem PM2)
pm2 logs & sudo tail -f /usr/local/lsws/logs/error.log

SSL/TLS Sertifika Yenileme Sonrası Reload

Let’s Encrypt kullanıyorsanız, sertifika yenileme sonrasında OpenLiteSpeed’i reload etmeniz gerekiyor. Certbot hook dosyası oluşturalım:

sudo tee /etc/letsencrypt/renewal-hooks/post/openlitespeed-reload.sh << 'EOF'
#!/bin/bash
sudo systemctl reload lshttpd
EOF

sudo chmod +x /etc/letsencrypt/renewal-hooks/post/openlitespeed-reload.sh

# Sertifika yenileme testi
sudo certbot renew --dry-run

Yapılandırma Backup’ı

Son olarak, çalışan yapılandırmanın yedeğini almak kritik:

# Tüm OpenLiteSpeed konfigürasyonunu yedekle
sudo tar -czf /root/ols-config-backup-$(date +%Y%m%d).tar.gz 
  /usr/local/lsws/conf/ 
  /var/log/lsws/

# Yedekten geri yükleme
sudo tar -xzf /root/ols-config-backup-20241201.tar.gz -C /
sudo systemctl restart lshttpd

Sonuç

OpenLiteSpeed ile Node.js proxy yapılandırması ilk bakışta karmaşık görünse de adım adım ilerlediğinizde gayet mantıklı bir yapıya oturtuyor. Önemli noktaları özetlersek:

  • extprocessor bloğu Node.js servisinizi OpenLiteSpeed’e tanıtır, timeout ve bağlantı limitleri burada belirlenir
  • context blokları hangi URL’lerin Node.js’e, hangilerinin statik dosya sunucusuna gideceğini tanımlar
  • trust proxy ayarını Node.js tarafında yapmayı unutmayın, yoksa gerçek IP’yi göremezsiniz
  • WebSocket kullanan uygulamalar için ayrı bir extprocessor tanımı ve uzun keepalive süresi şart
  • PM2 ile Node.js süreçlerini yönetmek, crash durumlarında otomatik yeniden başlatma sağlar

Nginx’ten geçiş yapıyorsanız en büyük fark syntax’ta. Nginx’in blok yapısına alışkınsanız OpenLiteSpeed’in iç içe blok yapısı biraz farklı gelecek ama birkaç yapılandırma sonrasında alışıyorsunuz. Performans açısından özellikle yüksek eş zamanlı bağlantı senaryolarında OpenLiteSpeed’in avantajını net olarak görüyorsunuz.

Yorum yapın