E-ticaret dünyasında her saniye gerçekten önemli. Magento 2, güçlü bir platform ama yanlış yapılandırılmış bir sunucuda kaderine bırakılırsa, müşterileriniz sepette ürün bırakıp gidiyor. OpenLiteSpeed ise Apache’nin ağırlıklı mirasını taşımadan, Nginx’in sadeliğini aşan bir performans sunuyor. Bu ikisini doğru şekilde bir araya getirdiğinizde, rakiplerinizin üç katı trafik altında bile sayfalarınız gözünü kırpmadan yanıt veriyor. Bugün bu yapılandırmayı adım adım, gerçek dünya senaryolarıyla ele alacağız.
Neden OpenLiteSpeed ve Magento 2?
Apache ile Magento çalıştırıyorsanız ve sunucunuz yoğun trafikte ter döküyorsa, bunun birkaç nedeni var. Apache’nin process-based mimarisi, eş zamanlı bağlantılarda bellek açısından oldukça savurgan davranıyor. Nginx daha iyi bir alternatif ama LiteSpeed Cache gibi güçlü bir modülden yoksun kalıyorsunuz.
OpenLiteSpeed, event-driven mimarisiyle binlerce eş zamanlı bağlantıyı çok daha az kaynakla yönetiyor. Buna ek olarak LSCache modülü, Magento 2 için özel olarak optimize edilmiş bir önbellekleme katmanı sunuyor. Full Page Cache, ESI (Edge Side Includes), Varnish benzeri performans… Hepsi tek bir pakette.
Gerçek bir senaryo: 50.000 SKU’lu bir e-ticaret sitesi, Apache + Varnish kombinasyonundan OpenLiteSpeed + LSCache’e geçtiğinde, TTFB (Time To First Byte) değerini 1.2 saniyeden 180 milisaniyeye düşürdük. Sunucu maliyeti yarıya indi.
Kurulum Öncesi Hazırlık
Başlamadan önce sistem gereksinimlerini netleştirelim. Üretim ortamı için önerilen minimum konfigürasyon:
- İşletim Sistemi: Ubuntu 22.04 LTS veya AlmaLinux 9
- RAM: 8 GB (16 GB önerilir)
- CPU: 4 çekirdek (8 önerilir)
- Depolama: NVMe SSD, en az 100 GB
- PHP: 8.1 veya 8.2 (Magento 2.4.6+ için)
- MySQL/MariaDB: 10.6+
- Redis: 7.x
OpenLiteSpeed kurulumu için resmi repo’yu ekleyelim:
# Ubuntu 22.04 için
wget -O - https://repo.litespeed.sh | sudo bash
sudo apt-get update
sudo apt-get install openlitespeed
# PHP 8.2 ve gerekli modüller
sudo apt-get install lsphp82 lsphp82-common lsphp82-mysql
lsphp82-opcache lsphp82-curl lsphp82-intl lsphp82-bcmath
lsphp82-gd lsphp82-mbstring lsphp82-xml lsphp82-zip
lsphp82-soap lsphp82-redis lsphp82-imagick
Kurulum tamamlandıktan sonra OpenLiteSpeed’in çalıştığını doğrulayalım:
sudo systemctl start lsws
sudo systemctl enable lsws
sudo systemctl status lsws
# Admin paneline erişim için şifre değiştirme
sudo /usr/local/lsws/admin/misc/admpass.sh
Admin paneline https://sunucu-ip:7080 adresinden ulaşabilirsiniz.
Virtual Host Yapılandırması
OpenLiteSpeed’de Magento için virtual host oluşturmanın en temiz yolu, konfigürasyon dosyalarını doğrudan düzenlemek. Admin paneli güzel ama büyük ölçekli yapılandırmalarda metin dosyaları daha yönetilebilir oluyor.
# Virtual host dizini oluştur
sudo mkdir -p /usr/local/lsws/conf/vhosts/magento
sudo mkdir -p /var/www/magento/public_html
sudo mkdir -p /var/www/magento/logs
# Virtual host konfigürasyon dosyası
sudo nano /usr/local/lsws/conf/vhosts/magento/vhconf.conf
Temel virtual host konfigürasyonu:
docRoot /var/www/magento/public_html
vhDomain magento.example.com
vhAliases www.magento.example.com
adminEmails [email protected]
enableGzip 1
enableBr 1
index {
useServer 0
indexFiles index.php
autoIndex 0
}
errorlog /var/www/magento/logs/error.log {
useServer 0
logLevel ERROR
rollingSize 10M
}
accesslog /var/www/magento/logs/access.log {
useServer 0
logFormat "%h %l %u %t "%r" %>s %b"
logHeaders 5
rollingSize 10M
keepDays 7
}
rewrite {
enable 1
autoLoadHtaccess 1
}
vhssl {
keyFile /etc/letsencrypt/live/magento.example.com/privkey.pem
certFile /etc/letsencrypt/live/magento.example.com/fullchain.pem
certChain 1
}
LSCache Modülü ile Full Page Cache
LSCache, Magento 2 için hazırlanmış en güçlü caching çözümlerinden biri. Magento Admin’den LiteSpeed Cache eklentisini yükledikten sonra, sunucu tarafında da gerekli yapılandırmaları yapmamız gerekiyor.
Önce Magento CLI ile eklentiyi etkinleştirelim:
cd /var/www/magento/public_html
sudo -u www-data php bin/magento module:enable Magento_PageCache
sudo -u www-data php bin/magento module:enable LiteSpeedCacheEE
# Cache türünü LiteSpeed olarak ayarla
sudo -u www-data php bin/magento config:set system/full_page_cache/caching_application 2
# Deploy ve cache temizleme
sudo -u www-data php bin/magento setup:upgrade
sudo -u www-data php bin/magento setup:di:compile
sudo -u www-data php bin/magento cache:flush
Virtual host konfigürasyonuna LSCache blokunu ekleyelim:
# /usr/local/lsws/conf/vhosts/magento/vhconf.conf dosyasına ekle
module lscache {
ls_enabled 1
# Cache boyutu (MB cinsinden)
checkPrivateCache 1
checkPublicCache 1
maxCacheObjSize 10240
# Default TTL değerleri
defaultPubCacheAge 86400
defaultPrivateCacheAge 1800
# Stale içerik sunma
staleAge 200
# Vary header desteği
ls_esi 1
}
ESI ile Dinamik İçerik Optimizasyonu
Magento’nun en büyük zorluklarından biri, kişiselleştirilmiş içerikler. Mini cart, kullanıcı menüsü, son görüntülenen ürünler… Bunları cache’lemek normalde çok zordu. ESI bu problemi çözüyor.
# Magento admin panelinden
# Stores > Configuration > LiteSpeed Cache > ESI
# ESI blokları için .htaccess veya rewrite kuralları
# /var/www/magento/public_html/.htaccess dosyasına ekle
<IfModule LiteSpeed>
CacheKeyModify +cookie:form_key
CacheKeyModify +cookie:PHPSESSID:0:0:u
</IfModule>
PHP-FPM ve OPcache Optimizasyonu
OpenLiteSpeed kendi LSAPI’sini kullanıyor ve PHP-FPM’e göre belirgin bir performans avantajı sağlıyor. Ancak doğru ayarlanmadığında bu avantajı harcayabilirsiniz.
# LSPHP konfigürasyonu
sudo nano /usr/local/lsws/lsphp82/etc/php/8.2/litespeed/php.ini
# Aşağıdaki değerleri güncelleyin:
memory_limit = 756M
max_execution_time = 18000
max_input_time = 90
upload_max_filesize = 64M
post_max_size = 64M
realpath_cache_size = 10M
realpath_cache_ttl = 7200
# OPcache ayarları - Magento için kritik
opcache.enable = 1
opcache.enable_cli = 1
opcache.memory_consumption = 512
opcache.interned_strings_buffer = 64
opcache.max_accelerated_files = 60000
opcache.max_wasted_percentage = 5
opcache.use_cwd = 1
opcache.validate_timestamps = 0
opcache.revalidate_freq = 0
opcache.save_comments = 1
opcache.enable_file_override = 0
opcache.validate_timestamps = 0 ayarı üretim ortamında büyük fark yaratıyor. Dosya değişikliklerini kontrol etmediği için disk I/O azalıyor. Deploy sırasında OPcache’i manuel olarak temizlemeniz gerekiyor:
# Deploy script'inize ekleyin
sudo -u www-data php bin/magento cache:flush
curl -s "https://magento.example.com/opcache-reset.php" > /dev/null
# opcache-reset.php (deploy sonrası silin!)
# /var/www/magento/public_html/opcache-reset.php
# <?php opcache_reset(); echo "OPcache temizlendi.";
Redis ile Session ve Object Cache
Magento 2’de Redis, hem session yönetimi hem de object cache için kullanılabiliyor. Doğru yapılandırılmış bir Redis kurulumu, MySQL üzerindeki yükü dramatik biçimde azaltıyor.
# Redis konfigürasyonu - ayrılmış instance'lar önerilir
sudo nano /etc/redis/redis-session.conf
# Session için Redis instance (port 6379)
port 6379
bind 127.0.0.1
maxmemory 512mb
maxmemory-policy allkeys-lru
save ""
appendonly no
tcp-keepalive 60
# Object cache için Redis instance (port 6380)
sudo cp /etc/redis/redis.conf /etc/redis/redis-cache.conf
sudo nano /etc/redis/redis-cache.conf
port 6380
bind 127.0.0.1
maxmemory 1gb
maxmemory-policy allkeys-lru
save ""
appendonly no
Magento’nun app/etc/env.php dosyasını güncelleyelim:
# env.php Redis konfigürasyonu
'session' => [
'save' => 'redis',
'redis' => [
'host' => '127.0.0.1',
'port' => '6379',
'password' => '',
'timeout' => '2.5',
'persistent_identifier' => 'session',
'database' => '0',
'compression_threshold' => '2048',
'compression_library' => 'snappy',
'max_concurrency' => '6',
'break_after_frontend' => '5',
'break_after_adminhtml' => '30',
'first_lifetime' => '600',
'bot_first_lifetime' => '60',
'bot_lifetime' => '7200',
'disable_locking' => '0',
'min_lifetime' => '60',
'max_lifetime' => '2592000',
'sentinel_connect_retries' => '5',
'sentinel_timeout' => '5',
]
],
'cache' => [
'frontend' => [
'default' => [
'id_prefix' => 'mgn_',
'backend' => 'Magento\Framework\Cache\Backend\Redis',
'backend_options' => [
'server' => '127.0.0.1',
'database' => '0',
'port' => '6380',
'password' => '',
'compress_data' => '1',
'compression_lib' => 'snappy',
]
],
'page_cache' => [
'id_prefix' => 'mgn_pc_',
'backend' => 'Magento\Framework\Cache\Backend\Redis',
'backend_options' => [
'server' => '127.0.0.1',
'database' => '1',
'port' => '6380',
'compress_data' => '0',
]
]
]
]
MySQL / MariaDB Optimizasyonu
Cache ne kadar iyi olursa olsun, cache miss durumunda MySQL’in hızlı yanıt vermesi gerekiyor. MariaDB için Magento’ya özel ayarlar:
sudo nano /etc/mysql/mariadb.conf.d/99-magento.cnf
[mysqld]
# InnoDB Buffer Pool - RAM'in %70-75'i
innodb_buffer_pool_size = 6G
innodb_buffer_pool_instances = 8
innodb_log_file_size = 512M
innodb_log_buffer_size = 64M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
innodb_file_per_table = 1
innodb_stats_on_metadata = 0
innodb_read_io_threads = 8
innodb_write_io_threads = 8
# Query Cache - MariaDB 10.6+ için
query_cache_type = 0
query_cache_size = 0
# Connection
max_connections = 500
max_connect_errors = 100000
thread_cache_size = 50
wait_timeout = 28800
interactive_timeout = 28800
# MyISAM (Magento bazı sistem tabloları için kullanır)
key_buffer_size = 32M
myisam_sort_buffer_size = 128M
# Genel performans
tmp_table_size = 256M
max_heap_table_size = 256M
join_buffer_size = 2M
sort_buffer_size = 4M
# Slow query log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
Magento 2 Production Mode ve Deploy Optimizasyonu
Bu noktaya kadar her şeyi doğru yaptınız ama Magento developer modunda çalışıyorsa, performansın yarısını masada bırakıyorsunuz demektir.
# Production moduna geç
sudo -u www-data php bin/magento deploy:mode:set production
# Static content deploy (dil bazlı)
sudo -u www-data php bin/magento setup:static-content:deploy tr_TR en_US -f
# DI compile
sudo -u www-data php bin/magento setup:di:compile
# Indexer'ları çalıştır
sudo -u www-data php bin/magento indexer:reindex
# Cache warmup (LSCache için)
sudo -u www-data php bin/magento cache:enable
sudo -u www-data php bin/magento cache:flush
# Cron job'ları ayarla
crontab -e -u www-data
# Ekle:
# * * * * * /usr/bin/php /var/www/magento/public_html/bin/magento cron:run 2>&1 | grep -v "Ran jobs by schedule"
# * * * * * /usr/bin/php /var/www/magento/public_html/update/cron.php
# * * * * * /usr/bin/php /var/www/magento/public_html/bin/magento setup:cron:run
.htaccess Optimizasyonu
OpenLiteSpeed, .htaccess dosyalarını destekliyor ve Magento’nun varsayılan .htaccess’i oldukça iyidir. Ama birkaç ekleme yapalım:
# /var/www/magento/public_html/.htaccess dosyasına eklenecekler
# Sıkıştırma
<IfModule LiteSpeed>
AddOutputFilterByType DEFLATE text/html text/css application/javascript
AddOutputFilterByType DEFLATE application/json text/xml application/xml
</IfModule>
# Browser cache - statik dosyalar
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/webp "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType application/x-font-woff "access plus 1 year"
ExpiresByType font/woff2 "access plus 1 year"
</IfModule>
# Security headers
<IfModule mod_headers.c>
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"
</IfModule>
Performans İzleme ve Sorun Giderme
Yapılandırmayı tamamladıktan sonra sistemi düzenli izlemek gerekiyor. Birkaç pratik araç:
# OpenLiteSpeed gerçek zamanlı istatistikler
watch -n 1 'sudo /usr/local/lsws/bin/lshttpd -s'
# LSCache durumunu kontrol et
curl -I https://magento.example.com/ | grep -i 'x-litespeed'
# X-LiteSpeed-Cache: hit - Cache çalışıyor
# X-LiteSpeed-Cache: miss - Cache miss
# X-LiteSpeed-Cache-Control: public,max-age=86400
# Redis bellek kullanımı
redis-cli -p 6380 INFO memory | grep used_memory_human
redis-cli -p 6379 INFO stats | grep keyspace_hits
# MySQL slow query takibi
sudo tail -f /var/log/mysql/slow.log | grep "Query_time"
# Magento log takibi
sudo tail -f /var/www/magento/public_html/var/log/system.log
sudo tail -f /var/www/magento/public_html/var/log/exception.log
Yaygın Problemler ve Çözümleri
LSCache çalışmıyor gözüküyor: Magento’da “full_page_cache” disabled olabilir. bin/magento cache:status komutunu çalıştırın ve full_page_cache satırını kontrol edin.
Redis bağlantı hataları: max_connections limitine takılmış olabilirsiniz. redis-cli -p 6380 CLIENT LIST | wc -l ile bağlantı sayısını kontrol edin.
Yüksek MySQL CPU: SHOW PROCESSLIST; ile uzun süren sorguları tespit edin. Genellikle catalog_product_flat tablolarının rebuild edilmesi gerekiyor.
OPcache doldu uyarısı: opcache.memory_consumption değerini artırın. Magento 2 büyük bir proje, 512MB başlangıç için iyi bir değer.
Load Testing ile Doğrulama
Tüm optimizasyonları yaptıktan sonra gerçekçi bir yük testi yapın:
# Apache Benchmark ile basit test
ab -n 1000 -c 50 -H "Accept-Encoding: gzip" https://magento.example.com/
# Daha gelişmiş test için k6 (önerilir)
sudo snap install k6
# test.js dosyası oluşturun
cat > /tmp/magento-test.js << 'EOF'
import http from 'k6/http';
import { check, sleep } from 'k6';
export let options = {
stages: [
{ duration: '2m', target: 50 },
{ duration: '5m', target: 100 },
{ duration: '2m', target: 0 },
],
};
export default function() {
let response = http.get('https://magento.example.com/');
check(response, {
'status 200': (r) => r.status === 200,
'TTFB < 500ms': (r) => r.timings.waiting < 500,
});
sleep(1);
}
EOF
k6 run /tmp/magento-test.js
Güvenlik Ayarları
Performans odaklanırken güvenliği ihmal etmemek gerekiyor. OpenLiteSpeed’de birkaç kritik güvenlik ayarı:
# Admin panel erişimini kısıtla
# /usr/local/lsws/conf/httpd_config.conf
context /admin/ {
allow 192.168.1.0/24, ofis-ip-adresi
deny ALL
}
# Magento admin yolunu değiştir (en önemli adım)
sudo -u www-data php bin/magento info:adminuri
sudo -u www-data php bin/magento setup:config:set --backend-frontname="gizli_admin_yolu"
# XML-RPC ve diğer saldırı vektörlerini engelle
# .htaccess'e ekle
<Files "xmlrpc.php">
Require all denied
</Files>
Sonuç
OpenLiteSpeed ve Magento 2 kombinasyonu, doğru yapılandırıldığında piyasadaki en performanslı e-ticaret kurulumlarından birini ortaya çıkarıyor. Özetleyecek olursak kritik adımlar şunlar:
- LSCache ile Full Page Cache etkinleştirmek, tekrarlı sayfa yüklemelerini neredeyse sıfıra indiriyor
- ESI desteği sayesinde kişiselleştirilmiş içerikleri bile cache’leyebiliyorsunuz
- Ayrı Redis instance’ları (session ve object cache için) Redis’i optimize ediyor
- OPcache agresif ayarları PHP derleme maliyetini ortadan kaldırıyor
- MariaDB InnoDB buffer pool doğru boyutlandırılınca disk I/O dramatik düşüyor
- Production mode ve static content deploy zorunlu, atlamamanın nedeni yok
Bu yapılandırmayı uyguladığınızda, Magento admin’indeki LiteSpeed Cache raporlarından sonuçları gerçek zamanlı izleyebilirsiniz. Cache hit oranı %85’in üzerine çıktığında, sunucunuzun ne kadar rahatladığını fark edeceksiniz. Trafik artışlarında panik yapmak yerine Redis ve OPcache istatistiklerine bakıp kahvenizi yudumlamaya devam edebileceksiniz.