OpenLiteSpeed ile Memcached ve Redis Entegrasyonu
Web sunucunuzun performansını ciddi ölçüde artırmak istiyorsanız, önbellek sistemleri bu işin tam merkezinde yer alır. OpenLiteSpeed, hem Memcached hem de Redis ile entegre çalışabilecek şekilde tasarlanmıştır ve doğru konfigürasyon yapıldığında sunucunuz üzerindeki yük dramatik biçimde azalır. Bu yazıda, her iki önbellek sistemini de OpenLiteSpeed ile nasıl kullanacağınızı adım adım anlatacağım. Sadece kurulum değil, gerçek dünya senaryolarında nasıl davranacağını da ele alacağız.
Önce Bir Adım Geri: Neden Memcached veya Redis?
OpenLiteSpeed kendi içinde LSCache adında güçlü bir önbellek mekanizması barındırır. Peki neden bunun yanında Memcached veya Redis’e ihtiyaç duyuyoruz? Cevap basit: farklı katmanlar, farklı ihtiyaçlar.
LSCache sayfa düzeyinde önbellek için mükemmeldir. Ama PHP oturum yönetimi, uygulama verisi önbellekleme, veritabanı sorgu sonuçları veya mikroservisler arası veri paylaşımı gibi durumlarda uygulama katmanında bir önbellek sistemine ihtiyaç duyarsınız.
- Memcached: Basit, hızlı, dağıtık önbellek. Karmaşık veri yapılarına ihtiyaç duymayan, saf hız odaklı senaryolar için idealdir.
- Redis: Kalıcılık, pub/sub, listeler, setler, hash yapıları gibi zengin özellikler sunar. PHP oturum yönetimi, kuyruk sistemleri ve daha karmaşık önbellek ihtiyaçları için tercih edilir.
Bir e-ticaret sitesi yönetiyorsanız ve aynı anda binlerce kullanıcı oturum açıyorsa, PHP oturumlarını Redis’te tutmak hem sunucu belleğini korur hem de çoklu sunucu senaryolarında oturum paylaşımını mümkün kılar.
Sistem Hazırlığı ve Gereksinimler
Başlamadan önce sisteminizin hazır olduğundan emin olalım. Bu yazıdaki örnekler Ubuntu 22.04 LTS üzerinde test edilmiştir ancak CentOS/AlmaLinux için de benzer adımlar geçerlidir.
OpenLiteSpeed’in kurulu olduğunu varsayıyorum. Değilse:
wget -O - https://repo.litespeed.sh | sudo bash
sudo apt-get install openlitespeed
sudo /usr/local/lsws/bin/lsws start
Sisteminizin güncel olduğundan emin olun:
sudo apt-get update && sudo apt-get upgrade -y
sudo apt-get install -y build-essential git curl wget
PHP sürümünüzü kontrol edin. OpenLiteSpeed ile LSPHP kullanıyorsunuzdur büyük ihtimalle:
/usr/local/lsws/lsphp81/bin/php -v
# ya da hangi sürüm kuruluysa
ls /usr/local/lsws/ | grep lsphp
Memcached Kurulumu ve Konfigürasyonu
Memcached Servisini Kurma
sudo apt-get install -y memcached libmemcached-tools
sudo systemctl enable memcached
sudo systemctl start memcached
Varsayılan olarak Memcached 127.0.0.1:11211 üzerinde çalışır. Konfigürasyon dosyasını düzenleyelim:
sudo nano /etc/memcached.conf
Kritik parametreler şunlardır:
- -m 256: Memcached’in kullanacağı maksimum bellek miktarı (MB). Sunucunuzun RAM’ine göre ayarlayın.
- -p 11211: Dinlenecek port numarası.
- -u memcache: Çalışacağı kullanıcı.
- -l 127.0.0.1: Dinlenecek IP adresi. Güvenlik için sadece localhost olarak bırakın.
- -c 1024: Maksimum eş zamanlı bağlantı sayısı.
- -t 4: İşlemci thread sayısı. Sunucunuzun CPU çekirdek sayısına göre ayarlayın.
Bir üretim ortamı için tipik bir konfigürasyon:
# /etc/memcached.conf içeriği
-m 512
-p 11211
-u memcache
-l 127.0.0.1
-c 2048
-t 4
-I 10m
Burada -I 10m parametresi maksimum nesne boyutunu 10MB’a çıkarır. Varsayılan 1MB bazen yetersiz kalabilir.
Değişiklikleri uygulamak için servisi yeniden başlatın:
sudo systemctl restart memcached
sudo systemctl status memcached
LSPHP için Memcached Eklentisi
OpenLiteSpeed, LSPHP adında kendi PHP motorunu kullanır. Bu nedenle standart PHP paket yöneticisi yerine LSPHP için eklenti kurmamız gerekir:
# PHP 8.1 için (sürümünüze göre değiştirin)
sudo apt-get install -y lsphp81-memcached
# veya
sudo apt-get install -y lsphp81-memcache
İki farklı eklenti var dikkat edin:
- php-memcache: Eski, daha basit sürüm
- php-memcached: Libmemcached üzerine kurulu, daha özellikli yeni sürüm. Genellikle bu tercih edilir.
Eklentinin yüklendiğini doğrulayın:
/usr/local/lsws/lsphp81/bin/php -m | grep -i memcach
PHP’de Memcached Kullanımı
Basit bir test yapalım. Web kök dizininize bir test dosyası oluşturun:
<?php
// /usr/local/lsws/Example/html/memcache-test.php
$memcached = new Memcached();
$memcached->addServer('127.0.0.1', 11211);
// Veri kaydetme
$memcached->set('test_key', 'Merhaba Dunya!', 60); // 60 saniye TTL
// Veri okuma
$deger = $memcached->get('test_key');
echo "Okunan değer: " . $deger . "n";
// İstatistikler
$stats = $memcached->getStats();
echo "Bağlantı durumu: " . ($deger ? "Başarılı" : "Başarısız") . "n";
echo "Hit sayısı: " . $stats['127.0.0.1:11211']['get_hits'] . "n";
echo "Miss sayısı: " . $stats['127.0.0.1:11211']['get_misses'] . "n";
?>
Bu dosyayı çalıştırdığınızda her şey yolundaysa “Merhaba Dunya!” çıktısını görmelisiniz.
Redis Kurulumu ve Konfigürasyonu
Redis Servisini Kurma
Redis kurulumu Memcached’e benzer ama konfigürasyon seçenekleri çok daha zengindir:
sudo apt-get install -y redis-server
sudo systemctl enable redis-server
sudo systemctl start redis-server
Redis konfigürasyon dosyasını düzenleyelim:
sudo nano /etc/redis/redis.conf
Önemli ayarlar:
- bind 127.0.0.1: Güvenlik için sadece localhost’tan bağlantı kabul et
- port 6379: Varsayılan Redis portu
- maxmemory 512mb: Redis’in kullanabileceği maksimum bellek
- maxmemory-policy allkeys-lru: Bellek dolduğunda en az kullanılan anahtarları sil
- save 900 1: Her 900 saniyede en az 1 değişiklik varsa diske kaydet (kalıcılık için)
- requirepass guclu_sifre_buraya: Redis için parola belirleme
Üretim ortamı için kritik bir güvenlik adımı: Redis’e mutlaka parola koyun.
# redis.conf içinde şu satırı bulup düzenleyin
requirepass "SuperGizliParola123!"
maxmemory 512mb
maxmemory-policy allkeys-lru
Servisi yeniden başlatın:
sudo systemctl restart redis-server
# Bağlantıyı test edin
redis-cli ping
# PONG cevabı gelmelidir
# Parola ile bağlanma
redis-cli -a "SuperGizliParola123!" ping
LSPHP için Redis Eklentisi
sudo apt-get install -y lsphp81-redis
Kurulumu doğrulayın:
/usr/local/lsws/lsphp81/bin/php -m | grep -i redis
PHP Oturumlarını Redis ile Yönetme
Bu, Redis’in en yaygın kullanım senaryolarından biridir. Özellikle birden fazla web sunucusu çalıştırdığınızda (load balancer arkasında), PHP oturumlarının merkezi bir yerde saklanması şarttır.
sudo nano /usr/local/lsws/lsphp81/etc/php/8.1/litespeed/php.ini
Aşağıdaki ayarları bulun ve değiştirin:
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379?auth=SuperGizliParola123!&database=1"
Burada database=1 kullanarak oturumları ayrı bir Redis veritabanında tutuyoruz. Bu iyi bir pratiktir, oturum verilerini diğer uygulama verilerinden ayırır.
Ayarı test etmek için:
<?php
// session-test.php
session_start();
if (!isset($_SESSION['ziyaret_sayisi'])) {
$_SESSION['ziyaret_sayisi'] = 0;
}
$_SESSION['ziyaret_sayisi']++;
echo "Bu sayfayı " . $_SESSION['ziyaret_sayisi'] . " kez ziyaret ettiniz.n";
echo "Oturum ID: " . session_id() . "n";
echo "Oturum kayıt yöneticisi: " . ini_get('session.save_handler') . "n";
?>
Sayfayı birkaç kez yenileyin, sayacın arttığını görmelisiniz. Redis’te oturumun oluştuğunu da doğrulayabilirsiniz:
redis-cli -a "SuperGizliParola123!" -n 1 keys "PHPREDIS_SESSION:*"
WordPress için Gerçek Dünya Senaryosu
Diyelim ki OpenLiteSpeed üzerinde WordPress çalıştırıyorsunuz. Bu çok yaygın bir senaryo. Hem LSCache hem de Redis’i birlikte kullanmak inanılmaz sonuçlar verebilir.
Önce WordPress için bir Redis nesne önbelleği kuralım. W3 Total Cache veya Redis Object Cache eklentisini kullanabilirsiniz. Manuel kurulum için:
cd /var/www/html/wordpress/wp-content
sudo wget https://raw.githubusercontent.com/rhubarbgroup/redis-cache/develop/includes/object-cache.php
# veya Redis Object Cache eklentisini WordPress admin panelinden kurun
wp-config.php dosyasına Redis bağlantı bilgilerini ekleyin:
// wp-config.php içine ekleyin
define('WP_REDIS_HOST', '127.0.0.1');
define('WP_REDIS_PORT', 6379);
define('WP_REDIS_PASSWORD', 'SuperGizliParola123!');
define('WP_REDIS_DATABASE', 2); // WordPress için ayrı veritabanı
define('WP_REDIS_TIMEOUT', 1);
define('WP_REDIS_READ_TIMEOUT', 1);
define('WP_REDIS_PREFIX', 'wp_sitem_'); // Çoklu WordPress için prefix
OpenLiteSpeed Web Admin Paneli Üzerinden Konfigürasyon
OpenLiteSpeed’in web admin paneli (varsayılan olarak 8088 portunda) üzerinden de önbellek ayarları yapabilirsiniz.
Admin paneline giriş yapın: https://sunucu-ip:7080
Sanal Host Konfigürasyonu için:
- Virtual Hosts menüsüne gidin
- İlgili sanal host’u seçin
- Cache sekmesine tıklayın
- “Enable Cache” seçeneğini aktifleştirin
LSCache ve Redis/Memcached bir arada çalışırken görev dağılımı şöyle olur:
- LSCache: Statik sayfa önbellekleme, HTML çıktılarını önbellekleme
- Redis/Memcached: PHP nesneleri, veritabanı sorgu sonuçları, oturum yönetimi
Bu iki katman birbirini tamamlar ve sunucu üzerindeki yükü minimize eder.
Performans İzleme ve Sorun Giderme
Sistemin düzgün çalışıp çalışmadığını izlemek için araçlar şarttır.
Memcached istatistikleri:
# Genel istatistikler
echo "stats" | nc 127.0.0.1 11211
# Belirli bir anahtarı kontrol et
echo "get test_key" | nc 127.0.0.1 11211
# Tüm önbelleği temizle (dikkatli kullanın!)
echo "flush_all" | nc 127.0.0.1 11211
Redis izleme komutları:
# Gerçek zamanlı komut izleme
redis-cli -a "SuperGizliParola123!" monitor
# Bellek kullanımı ve genel istatistikler
redis-cli -a "SuperGizliParola123!" info memory
# Anlık saniyedeki komut sayısı
redis-cli -a "SuperGizliParola123!" info stats | grep instantaneous_ops
# Tüm anahtarları listele (üretimde dikkatli kullanın, büyük veritabanlarında bloklar)
redis-cli -a "SuperGizliParola123!" keys "*"
# Veritabanındaki anahtar sayısı
redis-cli -a "SuperGizliParola123!" dbsize
Bir sorunla karşılaştığınızda ilk bakmanız gereken yer log dosyaları:
# OpenLiteSpeed error log
sudo tail -f /usr/local/lsws/logs/error.log
# PHP error log
sudo tail -f /usr/local/lsws/logs/stderr.log
# Redis log
sudo tail -f /var/log/redis/redis-server.log
Güvenlik Sertleştirmesi
Hem Memcached hem de Redis internet üzerinden erişilebilir olmamalıdır. Bunun için güvenlik duvarı kuralları ekleyin:
# UFW kullanıyorsanız
sudo ufw deny 11211/tcp
sudo ufw deny 6379/tcp
# Sadece localhost'tan erişime izin ver
sudo ufw allow from 127.0.0.1 to any port 11211
sudo ufw allow from 127.0.0.1 to any port 6379
# Değişiklikleri uygula
sudo ufw reload
sudo ufw status
Eğer birden fazla uygulama sunucunuz varsa ve Redis’e uzaktan bağlanıyorsanız, mutlaka SSL/TLS tüneli veya VPN kullanın. Redis 6.0 ve sonrasında native TLS desteği geldi:
# Redis konfigürasyonunda TLS aktivasyonu
# /etc/redis/redis.conf
tls-port 6380
tls-cert-file /etc/ssl/redis/redis.crt
tls-key-file /etc/ssl/redis/redis.key
tls-ca-cert-file /etc/ssl/redis/ca.crt
Birden Fazla Uygulama için Önbellek İzolasyonu
Aynı sunucuda birden fazla web uygulaması çalıştırıyorsanız, önbellek verilerinin birbirini etkilememesi için izolasyon şarttır.
Redis için her uygulama ayrı bir veritabanı numarası kullanabilir (0-15 arası):
- 0: Genel kullanım
- 1: PHP oturumları
- 2: WordPress site 1
- 3: WordPress site 2
- 4: E-ticaret uygulaması
Memcached’de veritabanı kavramı yoktur, bunun yerine anahtar önekleri (prefix) kullanılır:
<?php
$memcached = new Memcached();
$memcached->addServer('127.0.0.1', 11211);
// Site bazlı prefix kullanımı
$site_prefix = 'site1_';
$memcached->set($site_prefix . 'user_123', $kullanici_verisi, 3600);
$veri = $memcached->get($site_prefix . 'user_123');
?>
Önbellek Isıtma Stratejisi
Sunucu yeniden başladıktan veya önbellek temizlendikten sonra “cache cold” durumu yaşarsınız. Bu süreçte tüm istekler veritabanına ulaşır ve geçici bir yavaşlama olur. Bunu minimize etmek için önbellek ısıtma scripti kullanabilirsiniz:
#!/bin/bash
# cache-warm.sh
URLS=(
"https://siteniz.com/"
"https://siteniz.com/en-cok-ziyaret-edilen-sayfa/"
"https://siteniz.com/urunler/"
"https://siteniz.com/hakkimizda/"
)
echo "Önbellek ısıtma başlıyor..."
for url in "${URLS[@]}"; do
curl -s -o /dev/null -w "%{url_effective}: %{http_code} (%{time_total}s)n" "$url"
sleep 0.5
done
echo "Önbellek ısıtma tamamlandı."
Bu scripti sunucu yeniden başladıktan sonra otomatik çalıştırmak için systemd servisi veya cron kullanabilirsiniz.
Yük Testi ile Farkı Görmek
Konfigürasyonu tamamladıktan sonra gerçek farkı görmek istersiniz. Apache Bench (ab) ile basit bir test:
# Önce önbellek olmadan test et
ab -n 1000 -c 50 https://siteniz.com/
# Önbellek etkinleştirip tekrar test et
# Sonuçları karşılaştırın, requests/second değerine bakın
Gerçek bir senaryoda, Redis ve Memcached entegrasyonundan sonra tipik olarak şu iyileşmeleri görebilirsiniz:
- Veritabanı sorgu sayısında yüzde 60-80 azalma
- Ortalama yanıt süresinde yüzde 40-70 iyileşme
- Sunucu CPU kullanımında belirgin düşüş
Tabii bu rakamlar uygulamanızın yapısına ve mevcut optimizasyon durumuna göre değişir.
Otomatik Yeniden Başlatma ve İzleme
Üretim ortamında bu servislerin her zaman ayakta kalması kritiktir. Systemd zaten bu işi yapar ama ek bir izleme katmanı eklemek iyi pratiktir:
# Servis durumlarını tek seferde kontrol et
sudo systemctl status memcached redis-server openlitespeed
# Uptime bilgisi
systemctl show memcached --property=ActiveEnterTimestamp
Eğer Nagios, Zabbix veya Prometheus kullanıyorsanız, Memcached ve Redis için hazır eklentiler ve exporter’lar mevcuttur. Redis Exporter ile Prometheus/Grafana üçlüsü, Redis performansını görselleştirmek için çok yaygın bir kombinasyondur.
Sonuç
OpenLiteSpeed, Memcached ve Redis üçlüsü doğru konfigüre edildiğinde birbirini mükemmel tamamlayan bir ekosistem oluşturur. LSCache sayfa düzeyinde önbelleklemeyi üstlenirken, Redis oturum yönetimi ve nesne önbellekleme konusunda güvenilir bir altyapı sağlar. Memcached ise saf hız gerektiren basit önbellek senaryolarında hafifliğiyle öne çıkar.
Bu yazıda ele aldığımız konuları özetleyecek olursam: Memcached ve Redis’in kurulumu ve temel konfigürasyonu, LSPHP eklentilerinin kurulumu, PHP oturumlarının Redis’e taşınması, WordPress için nesne önbellekleme, güvenlik sertleştirmesi ve önbellek izolasyonu konularını pratiğe dökecek kadar detaylı ele almaya çalıştım.
Unutmayın, önbellek konfigürasyonu bir kez yapıp bırakılan bir şey değildir. Uygulamanız büyüdükçe, trafik arttıkça önbellek stratejinizi gözden geçirmeniz ve ince ayar yapmanız gerekecektir. İstatistikleri düzenli takip edin, hit/miss oranlarına bakın ve buna göre TTL değerlerini ve bellek ayırımını optimize edin. İyi bir önbellek hit oranı yüzde 80’in üzerindedir. Bunun altındaysanız, önbellek stratejinizi gözden geçirin.
