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.