OpenLiteSpeed ve PHP LSAPI ile Yüksek Performanslı PHP Yapılandırması

PHP uygulamalarının performansı, web sunucusunun PHP ile nasıl iletişim kurduğuna doğrudan bağlıdır. Geleneksel FastCGI yaklaşımının ötesine geçen LSAPI (LiteSpeed Server Application Programming Interface), OpenLiteSpeed ile PHP arasında son derece verimli bir köprü kurar. Eğer hâlâ PHP-FPM ile çalışıyorsanız ve sunucunuzda ciddi yük altında gecikme yaşıyorsanız, bu yazı tam size göre.

LSAPI Nedir ve PHP-FPM’den Farkı Ne?

PHP-FPM, FastCGI protokolü üzerinden çalışır. Her istek için socket üzerinden veri transferi yapılır, process yönetimi ayrı bir daemon tarafından üstlenilir ve bu katman, beraberinde belirli bir overhead getirir.

LSAPI ise LiteSpeed’in kendi geliştirdiği bir API’dır. OpenLiteSpeed, PHP süreçlerini doğrudan kendi process modeli içinde yönetir. Aralarındaki fark şu noktalarda belirginleşir:

  • Süreç yönetimi: PHP-FPM kendi pool’larını yönetirken LSAPI süreçleri doğrudan OpenLiteSpeed tarafından yönetilir
  • Bellek kullanımı: LSAPI worker’ları daha az bellek overhead’i ile çalışır
  • Bağlantı modeli: Unix socket yerine shared memory ve dahili mekanizmalar kullanılır
  • Restart davranışı: PHP işleyicileri, web sunucusu konfigürasyonu değiştiğinde otomatik olarak reload edilir
  • İstatistik erişimi: OpenLiteSpeed admin paneli üzerinden gerçek zamanlı PHP süreç izleme imkânı

Gerçek dünya testlerinde LSAPI, aynı donanımda PHP-FPM’e kıyasla %30 ila %50 arasında daha yüksek istek/saniye değerleri üretebilmektedir. WordPress gibi yoğun PHP kullanan uygulamalarda bu fark çok daha belirgin hale gelir.

Kurulum Öncesi Hazırlık

Önce sisteminizin güncel olduğundan ve gerekli bağımlılıkların kurulu olduğundan emin olun.

# Ubuntu/Debian için
apt update && apt upgrade -y
apt install -y build-essential libxml2-dev libssl-dev libcurl4-openssl-dev 
    libjpeg-dev libpng-dev libwebp-dev libfreetype6-dev libzip-dev 
    libonig-dev libsqlite3-dev

# CentOS/RHEL için
yum groupinstall "Development Tools" -y
yum install -y libxml2-devel openssl-devel curl-devel libjpeg-devel 
    libpng-devel freetype-devel libzip-devel oniguruma-devel sqlite-devel

OpenLiteSpeed reposunu sisteme ekleyin:

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

# PHP LSAPI modülü için (PHP 8.2 örneği)
apt install -y lsphp82 lsphp82-common lsphp82-mysql lsphp82-opcache 
    lsphp82-curl lsphp82-json lsphp82-xml lsphp82-zip lsphp82-mbstring 
    lsphp82-imagick lsphp82-redis lsphp82-memcached

LiteSpeed’in kendi PHP paketleri (lsphp) zaten LSAPI desteğiyle derlenmiş olarak gelir. Bu paketler, standart PHP derleme sürecine --with-litespeed bayrağı eklenerek oluşturulmuştur.

OpenLiteSpeed Admin Paneli Üzerinden PHP Yapılandırması

OpenLiteSpeed yönetim paneline erişim için varsayılan port 7080’dir:

# Admin şifresini sıfırlamak gerekirse
/usr/local/lsws/admin/misc/admpass.sh

# Servisi başlatın
systemctl start lsws
systemctl enable lsws

Panel üzerinden Server Configuration > External App bölümüne gidin. Burada “lsphp” adıyla bir external application tanımlanmış olmalıdır. Eğer yoksa yeni bir tane oluşturun:

  • Type: LiteSpeed SAPI App
  • Name: lsphp82
  • Address: uds://tmp/lshttpd/lsphp82.sock
  • Max Connections: 35
  • Environment: PHP_LSAPI_CHILDREN=35
  • Initial Request Timeout: 60
  • Retry Timeout: 0
  • Persistent Connection: Yes
  • Start By Server: Yes
  • Command: /usr/local/lsws/lsphp82/bin/lsphp
  • Back Log: 100
  • Instances: 1
  • Priority: 0
  • Memory Soft Limit: 2047M
  • Memory Hard Limit: 2047M
  • Process Soft Limit: 400
  • Process Hard Limit: 500

Konfigürasyon Dosyası ile İnce Ayar

Admin paneli her ne kadar kullanışlı olsa da production ortamlarda konfigürasyonu dosya tabanlı yönetmek daha güvenlidir. Ana konfigürasyon dosyası /usr/local/lsws/conf/httpd_config.conf konumundadır.

# Virtual host konfigürasyon dizinini inceleyin
ls -la /usr/local/lsws/conf/vhosts/

# Örnek bir virtual host için PHP handler ayarı
cat /usr/local/lsws/conf/vhosts/example.com/vhconf.conf

Virtual host konfigürasyonuna PHP script handler eklemek için:

# /usr/local/lsws/conf/vhosts/example.com/vhconf.conf
scripthandler {
  add lsapi:lsphp82 php
}

extprocessor lsphp82 {
  type                    lsapi
  address                 uds://tmp/lshttpd/lsphp82.sock
  maxConns                35
  env                     PHP_LSAPI_CHILDREN=35
  env                     PHP_LSAPI_MAX_REQUESTS=500
  initTimeout             60
  retryTimeout            0
  persistConn             1
  respBuffer              0
  autoStart               1
  path                    /usr/local/lsws/lsphp82/bin/lsphp
  backlog                 100
  instances               1
  priority                0
  memSoftLimit            2047M
  memHardLimit            2047M
  procSoftLimit           400
  procHardLimit           500
}

PHP_LSAPI Ortam Değişkenleri ile Performans Optimizasyonu

LSAPI’nin gücü, özel ortam değişkenleriyle detaylı şekilde kontrol edilebilmesinden gelir.

# Kritik LSAPI ortam değişkenleri için örnek yapılandırma
# /etc/profile.d/lsapi.sh veya doğrudan extprocessor bloğunda

# Worker child sayısı - CPU çekirdeği x 2 formülü genellikle iyi başlangıç noktasıdır
PHP_LSAPI_CHILDREN=35

# Her worker'ın işleyeceği maksimum istek sayısı
# Bellek sızıntısı yaşayan uygulamalarda düşürün
PHP_LSAPI_MAX_REQUESTS=500

# Boşta kalan child process'lerin ne kadar süre yaşayacağı (saniye)
PHP_LSAPI_IDLE_TIMEOUT=300

# PHP hata logları için
PHP_LSAPI_STDERR_LOG=1

PHP_LSAPI_CHILDREN değişkeni en kritik olandır. Yanlış ayarlanması durumunda ya kaynaklar boşa harcanır ya da istekler kuyrukta bekler. Genel kural:

  • PHP_LSAPI_CHILDREN: Sunucunuzun aynı anda kaç eşzamanlı PHP isteği işleyebileceğini belirler. 4 çekirdekli, 8GB RAM’li bir sunucu için 35-50 arası değerler makul başlangıç noktasıdır.
  • PHP_LSAPI_MAX_REQUESTS: Her worker kaç istek işledikten sonra yeniden başlayacak. WordPress gibi uygulamalarda 200-500 arası tutun.

OPcache ile LSAPI Entegrasyonu

LSAPI tek başına yeterli değildir. OPcache ile birlikte çalıştığında gerçek fark ortaya çıkar.

# /usr/local/lsws/lsphp82/etc/php.d/10-opcache.ini
# veya php.ini içinde

[opcache]
opcache.enable=1
opcache.enable_cli=0
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.revalidate_freq=0
opcache.validate_timestamps=0
opcache.save_comments=1
opcache.fast_shutdown=1
opcache.file_cache=/tmp/php-opcache
opcache.file_cache_consistency_checks=0

opcache.validate_timestamps=0 ayarı production ortamlar için kritiktir. Dosya değişikliklerini OPcache’e bildirmek için deployment scriptinize şunu ekleyin:

#!/bin/bash
# deploy.sh - Deployment sonrası OPcache temizleme

# PHP CLI üzerinden OPcache reset
/usr/local/lsws/lsphp82/bin/php -r "opcache_reset();"

# Veya OpenLiteSpeed graceful restart ile
kill -USR1 $(cat /usr/local/lsws/tmp/lshttpd.pid)

echo "OPcache temizlendi, OpenLiteSpeed graceful restart yapıldı."

Çoklu PHP Sürümü Yönetimi

Production ortamlarda farklı uygulamaların farklı PHP sürümleri gerektirdiği çok yaygın bir durumdur. LSAPI ile bu yönetim son derece temizdir.

# PHP 7.4 ve 8.2'yi birlikte kurun
apt install -y lsphp74 lsphp74-common lsphp74-mysql lsphp74-opcache
apt install -y lsphp82 lsphp82-common lsphp82-mysql lsphp82-opcache

# Sürümleri kontrol edin
/usr/local/lsws/lsphp74/bin/php -v
/usr/local/lsws/lsphp82/bin/php -v

Her virtual host için ayrı PHP sürümü tanımlamak için:

# /usr/local/lsws/conf/vhosts/eski-uygulama.com/vhconf.conf
scripthandler {
  add lsapi:lsphp74 php
}

# /usr/local/lsws/conf/vhosts/yeni-uygulama.com/vhconf.conf
scripthandler {
  add lsapi:lsphp82 php
}

Gerçek Dünya Senaryosu: WooCommerce Sitesi Optimizasyonu

Bir müşterinin WooCommerce mağazası, Black Friday döneminde saniyede 200 istek alıyordu ve yanıt süreleri 4-5 saniyeye çıkıyordu. İşte adım adım yapılan optimizasyon:

Başlangıç durumu tespiti:

# Mevcut PHP süreçlerini inceleyin
ps aux | grep lsphp | wc -l

# Sunucu yükünü kontrol edin
top -bn1 | grep "load average"

# OpenLiteSpeed real-time stats
curl -s http://localhost:7080/status | grep -i php

# Apache Bench ile baseline ölçümü
ab -n 1000 -c 50 https://magaza.example.com/ 2>&1 | tail -20

Optimizasyon adımları:

# 1. LSAPI child sayısını artırın
# extprocessor bloğunda:
# maxConns 35 --> 60
# env PHP_LSAPI_CHILDREN=35 --> PHP_LSAPI_CHILDREN=60

# 2. PHP memory limitini artırın
# /usr/local/lsws/lsphp82/etc/php.ini
sed -i 's/memory_limit = 128M/memory_limit = 512M/' 
    /usr/local/lsws/lsphp82/etc/php.ini

# 3. WooCommerce için özel OPcache ayarları
cat >> /usr/local/lsws/lsphp82/etc/php.d/10-opcache.ini << 'EOF'
opcache.memory_consumption=512
opcache.max_accelerated_files=20000
opcache.interned_strings_buffer=32
EOF

# 4. OpenLiteSpeed'i graceful restart edin
kill -USR1 $(cat /usr/local/lsws/tmp/lshttpd.pid)

Sonuç olarak yanıt süreleri 4-5 saniyeden 800 milisaniyenin altına indi. Bellek kullanımı ise PHP-FPM’e göre %25 daha az oldu.

Hata Ayıklama ve Log Yönetimi

LSAPI ile ilgili sorunları tespit etmek için log dosyalarını bilmek şarttır.

# OpenLiteSpeed ana error log
tail -f /usr/local/lsws/logs/error.log

# LSAPI'ye özel hatalar için
tail -f /usr/local/lsws/logs/stderr.log

# Virtual host access log
tail -f /usr/local/lsws/logs/example.com.access.log

# PHP error log (virtual host bazında ayarlayın)
# php.ini içinde:
# error_log = /usr/local/lsws/logs/php_errors.log

# LSAPI child process durumunu anlık izleyin
watch -n 2 'ps aux | grep lsphp | grep -v grep'

Yaygın karşılaşılan hatalar ve çözümleri:

  • “Can not connect to external application”: Socket dosyasını kontrol edin, /tmp/lshttpd/ dizininin izinlerini doğrulayın
  • “503 Service Unavailable”: PHP_LSAPI_CHILDREN değeri yetersiz olabilir, artırın
  • “PHP process crash”: PHP_LSAPI_MAX_REQUESTS değerini düşürün, bellek sızıntısı ihtimali var
  • “Permission denied on socket”: OpenLiteSpeed ve PHP worker’larının aynı kullanıcıyla çalıştığından emin olun
# Socket izinlerini kontrol edin
ls -la /tmp/lshttpd/
# nobody:nogroup olmalı, OpenLiteSpeed varsayılan olarak nobody kullanır

# PHP worker'ların hangi kullanıcıyla çalıştığını kontrol edin
ps aux | grep lsphp | awk '{print $1}' | sort | uniq

Güvenlik Yapılandırması

Performansın yanı sıra güvenlik de ihmal edilmemelidir.

# PHP disable_functions ayarı - tehlikeli fonksiyonları devre dışı bırakın
# /usr/local/lsws/lsphp82/etc/php.ini
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,
    curl_exec,curl_multi_exec,parse_ini_file,show_source,pcntl_exec,
    phpinfo

# expose_php kapatın - sürüm bilgisini gizleyin
expose_php = Off

# open_basedir ile dizin kısıtlaması
# Virtual host konfigürasyonunda PHP değerini override edin
# vhconf.conf içinde:
phpIniOverride {
  php_admin_value open_basedir /var/www/example.com:/tmp
  php_admin_value upload_tmp_dir /var/www/example.com/tmp
  php_admin_flag display_errors Off
}

Performans İzleme ve Kapasite Planlaması

Sistemin uzun vadeli sağlığı için izleme altyapısı kurun.

#!/bin/bash
# lsapi_monitor.sh - LSAPI performans izleme scripti

LOG_FILE="/var/log/lsapi_monitor.log"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')

# Aktif PHP worker sayısı
PHP_WORKERS=$(ps aux | grep lsphp | grep -v grep | wc -l)

# Ortalama CPU kullanımı
PHP_CPU=$(ps aux | grep lsphp | grep -v grep | 
    awk '{sum += $3} END {print sum}')

# Toplam bellek kullanımı (MB)
PHP_MEM=$(ps aux | grep lsphp | grep -v grep | 
    awk '{sum += $6} END {printf "%.0f", sum/1024}')

# OpenLiteSpeed uptime
OLS_PID=$(cat /usr/local/lsws/tmp/lshttpd.pid 2>/dev/null)
if [ -n "$OLS_PID" ]; then
    OLS_STATUS="running"
else
    OLS_STATUS="stopped"
fi

echo "$TIMESTAMP | Workers: $PHP_WORKERS | CPU: $PHP_CPU% | 
    Memory: ${PHP_MEM}MB | OLS: $OLS_STATUS" >> $LOG_FILE

# Kritik eşik kontrolü
if [ "$PHP_WORKERS" -gt 80 ]; then
    echo "$TIMESTAMP UYARI: PHP worker sayısı kritik seviyede: $PHP_WORKERS" | 
        mail -s "LSAPI Worker Alert" [email protected]
fi

Bu scripti cron ile çalıştırın:

# Crontab'a ekleyin
echo "*/5 * * * * /usr/local/sbin/lsapi_monitor.sh" | crontab -

Sonuç

OpenLiteSpeed ile LSAPI kombinasyonu, PHP uygulamaları için FastCGI tabanlı çözümlere kıyasla ciddi bir performans avantajı sunar. Süreç yönetiminin web sunucusu tarafından üstlenilmesi, daha az bellek tüketimi ve daha iyi eşzamanlı istek işleme kapasitesi, özellikle yoğun trafik alan sitelerde fark yaratır.

Yapılandırma sürecinde en çok dikkat edilmesi gereken noktalar şunlardır: PHP_LSAPI_CHILDREN değerini sunucu kaynaklarıyla orantılı tutmak, OPcache’i agresif ama güvenli biçimde yapılandırmak ve deployment süreçlerinde OPcache invalidation’ı ihmal etmemek.

PHP-FPM’den geçiş düşünüyorsanız, kademeli bir yaklaşım izleyin. Önce bir sanal host üzerinde test edin, performans metriklerini karşılaştırın, ardından tüm sunucuya yaygınlaştırın. Çoğu durumda bu geçiş, herhangi bir donanım yükseltmesi olmaksızın uygulamanızın kapasitesini belirgin biçimde artıracaktır.

Yorum yapın