OpenLiteSpeed Access Log Analizi ve İzleme

Web sunucunuzda neler döndüğünü anlamak istiyorsanız, access log dosyaları sizin en iyi dostunuzdur. OpenLiteSpeed kullanıyorsanız bu loglar son derece zengin bilgi içerir; ancak ham haliyle bakmak yerine doğru araçları kullanarak analiz etmek gerekir. Bu yazıda OpenLiteSpeed access log yapısını, analiz yöntemlerini ve gerçek dünya senaryolarında nasıl kullanacağınızı ele alacağız.

OpenLiteSpeed Log Yapısını Tanımak

OpenLiteSpeed, varsayılan olarak loglarını /usr/local/lsws/logs/ dizininde tutar. Ana access log dosyası genellikle access.log adını taşır, ancak sanal hostlar için ayrı log dosyaları tanımlamak hem daha düzenli hem de analiz açısından çok daha pratiktir.

OpenLiteSpeed access logları Apache ile uyumlu Combined Log Format kullanır. Bir satır şu şekilde görünür:

192.168.1.100 - admin [15/Jan/2025:10:23:45 +0300] "GET /wp-admin/index.php HTTP/1.1" 200 4523 "https://example.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"

Bu satırdaki alanlar sırasıyla şunlardır:

  • IP adresi: İsteği yapan istemcinin IP’si
  • Kimlik: RFC 1413 kimliği (genellikle tire)
  • Kullanıcı adı: HTTP auth ile giriş yapıldıysa kullanıcı adı
  • Tarih/saat: İsteğin zamanı
  • İstek satırı: HTTP metodu, URL ve protokol
  • HTTP durum kodu: 200, 404, 500 gibi
  • Byte sayısı: Gönderilen veri miktarı
  • Referer: İsteğin geldiği sayfa
  • User-Agent: İstemci tarayıcı veya bot bilgisi

Log Format Özelleştirme

OpenLiteSpeed’in web arayüzünden (varsayılan port 7080) ya da httpd_config.conf dosyasından log formatını özelleştirebilirsiniz. Örneğin yanıt süresini de loglara eklemek için:

# /usr/local/lsws/conf/httpd_config.conf dosyasını düzenleyin
# logFormat satırını bulun veya ekleyin

logFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i" %D"

Burada %D mikrosaniye cinsinden yanıt süresini ekler. Bu bilgi, yavaş sayfaları tespit etmek için son derece değerlidir.

Temel Log Analiz Komutları

Önce en basit ve en sık kullanılan komutlarla başlayalım. Bunlar her gün işinize yarayacak araçlar.

En Fazla İstek Yapan IP Adresleri

# Son 10000 satırdan en aktif IP'leri bulun
tail -n 10000 /usr/local/lsws/logs/access.log | 
  awk '{print $1}' | 
  sort | uniq -c | 
  sort -rn | 
  head -20

Bu komut size DDoS saldırısı mı yoksa meşru yüksek trafik mi yaşandığını hızlıca gösterir. Tek bir IP’den binlerce istek geliyorsa alarm zilleri çalmaya başlamalıdır.

HTTP Durum Kodlarının Dağılımı

# Bugünün log dosyasında durum kodlarını say
grep "$(date +%d/%b/%Y)" /usr/local/lsws/logs/access.log | 
  awk '{print $9}' | 
  sort | uniq -c | 
  sort -rn

Çıktı şu şekilde görünür:

  8423 200
   342 304
   187 404
    23 500
     8 403

500 hataları yüksekse PHP veya uygulama katmanında bir sorun var demektir. 404 hataları çoksa kırık linkler veya tarama botu faaliyeti söz konusu olabilir.

Gerçek Dünya Senaryosu: Yoğun Trafik Analizi

Diyelim ki siteniz aniden yavaşladı. Sunucuya bağlandınız ve ne olduğunu anlamaya çalışıyorsunuz. İşte bu durumda izleyeceğiniz adımlar:

# Son 5 dakikadaki istek sayısını kontrol edin
awk -v d="$(date -d '5 minutes ago' +'%d/%b/%Y:%H:%M')" 
  '$4 > "[" d' /usr/local/lsws/logs/access.log | wc -l

# Hangi URL'lere istek geliyor?
tail -n 5000 /usr/local/lsws/logs/access.log | 
  awk '{print $7}' | 
  cut -d'?' -f1 | 
  sort | uniq -c | 
  sort -rn | 
  head -20

Bu analiz size hangi endpoint’in yük altında olduğunu gösterir. Eğer /xmlrpc.php veya /wp-login.php gibi belirli bir URL öne çıkıyorsa, bu muhtemelen bir brute-force saldırısıdır.

Gerçek Zamanlı Log İzleme

Anlık olarak neler olduğunu görmek için:

# Canlı log takibi - sadece 500 hatalarını göster
tail -f /usr/local/lsws/logs/access.log | grep ' 500 '

# Canlı log takibi - belirli bir IP'yi filtrele
tail -f /usr/local/lsws/logs/access.log | grep '192.168.1.100'

# Canlı log takibi - POST isteklerini izle
tail -f /usr/local/lsws/logs/access.log | grep '"POST '

GoAccess ile Görsel Analiz

Komut satırı araçları işlevsel olsa da GoAccess, terminal üzerinde güzel bir dashboard sunar. OpenLiteSpeed loglarıyla mükemmel uyum sağlar.

# GoAccess kurulumu (Ubuntu/Debian)
apt-get install goaccess

# GoAccess kurulumu (CentOS/RHEL)
yum install goaccess

# Terminal dashboard ile canlı analiz
goaccess /usr/local/lsws/logs/access.log 
  --log-format=COMBINED 
  -o /var/www/html/report.html 
  --real-time-html

# Sadece terminal çıktısı için
goaccess /usr/local/lsws/logs/access.log 
  --log-format=COMBINED

GoAccess’in ürettiği HTML raporu şunları içerir: benzersiz ziyaretçi sayısı, en çok istenen sayfalar, 404 hataları, tarayıcı dağılımı, ülke bazında trafik ve çok daha fazlası. Bu raporu periyodik olarak üretip bir cron job ile saklarsanız tarihsel trend analizi de yapabilirsiniz.

Saldırı Tespiti ve Güvenlik Analizi

Access logları güvenlik açısından da son derece değerlidir. SQL injection, XSS ve tarama saldırılarını tespit etmek için:

# SQL injection girişimlerini tespit et
grep -i "union.*select|select.*from|insert.*into|drop.*table|--|1=1|' OR " 
  /usr/local/lsws/logs/access.log | 
  awk '{print $1}' | 
  sort | uniq -c | 
  sort -rn | 
  head -10

# XSS denemelerini ara
grep -i "<script|javascript:|onerror=|onload=" 
  /usr/local/lsws/logs/access.log | 
  awk '{print $1, $7}' | 
  head -20

# Dizin tarama denemelerini bul (çok sayıda 404)
awk '$9 == "404" {print $1}' /usr/local/lsws/logs/access.log | 
  sort | uniq -c | 
  sort -rn | 
  awk '$1 > 50 {print "Supheli IP:", $2, "- 404 sayisi:", $1}'

Bu analizleri düzenli çalıştırıp çıktıları bir dosyaya kaydederseniz, otomatik IP engelleme sistemine temel oluşturabilirsiniz.

Fail2Ban ile Otomatik Engelleme

OpenLiteSpeed loglarını Fail2Ban ile entegre etmek için özel bir filtre oluşturmanız gerekir:

# /etc/fail2ban/filter.d/openlitespeed-auth.conf dosyası oluşturun
cat > /etc/fail2ban/filter.d/openlitespeed-auth.conf << 'EOF'
[Definition]
failregex = ^<HOST> .* "(GET|POST|HEAD) .*" (401|403) .*$
ignoreregex =
EOF

# /etc/fail2ban/jail.d/openlitespeed.conf dosyası oluşturun
cat > /etc/fail2ban/jail.d/openlitespeed.conf << 'EOF'
[openlitespeed-auth]
enabled = true
port = http,https
filter = openlitespeed-auth
logpath = /usr/local/lsws/logs/access.log
maxretry = 20
findtime = 300
bantime = 3600
EOF

# Fail2Ban'i yeniden başlatın
systemctl restart fail2ban

Log Rotasyonu ve Yönetimi

Loglar zamanla devasa boyutlara ulaşabilir. OpenLiteSpeed kendi log rotasyon mekanizmasına sahiptir, ancak bunu doğru yapılandırmak gerekir.

# OpenLiteSpeed'in yerleşik log rotasyonunu kullan
# Web admin panelinden Log Settings > Access Log bölümünden ayarlayın
# veya httpd_config.conf içine ekleyin:

# Logrotate ile harici rotasyon
cat > /etc/logrotate.d/openlitespeed << 'EOF'
/usr/local/lsws/logs/access.log {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    sharedscripts
    postrotate
        /usr/local/lsws/bin/lswsctrl restart > /dev/null 2>&1 || true
    endscript
}
EOF

Dikkat: OpenLiteSpeed’in graceful restart ile log dosyasını yeniden açması gerekir. postrotate bölümündeki komut bunu sağlar.

Sıkıştırılmış Log Dosyalarını Analiz Etme

# .gz uzantılı eski logları doğrudan analiz edin
zcat /usr/local/lsws/logs/access.log.1.gz | 
  awk '{print $9}' | 
  sort | uniq -c | 
  sort -rn

# Birden fazla log dosyasını birlikte analiz edin
zcat /usr/local/lsws/logs/access.log.*.gz | 
  grep '"GET ' | 
  awk '{print $7}' | 
  cut -d'?' -f1 | 
  sort | uniq -c | 
  sort -rn | 
  head -20

Performans Analizi: Yavaş İstekleri Bulun

Eğer log formatına yanıt süresini eklediyseniz (yukarıda %D ile anlattık), hangi sayfaların yavaş çalıştığını tespit edebilirsiniz:

# 3 saniyeden uzun süren istekleri bul (mikrosaniye cinsinden 3000000)
awk '{if ($NF > 3000000) print $0}' /usr/local/lsws/logs/access.log | 
  awk '{print $7, $NF}' | 
  sort -k2 -rn | 
  head -20

# Ortalama yanıt süresini URL bazında hesapla
awk '{
  url = $7
  time = $NF
  sum[url] += time
  count[url]++
}
END {
  for (url in sum) {
    avg = sum[url] / count[url]
    if (avg > 1000000) printf "%.0f mst%sn", avg/1000, url
  }
}' /usr/local/lsws/logs/access.log | sort -rn | head -20

Bu çıktı size hangi sayfaların optimize edilmesi gerektiğini doğrudan söyler. Özellikle e-ticaret sitelerinde belirli ürün sayfaları veya arama fonksiyonu bu analizde öne çıkabilir.

Sanal Host Bazında Log Yönetimi

Birden fazla site barındırıyorsanız her site için ayrı log dosyası tutmak çok daha sağlıklıdır. OpenLiteSpeed’de sanal host konfigürasyonuna şunu ekleyin:

# /usr/local/lsws/conf/vhosts/example.com/vhconf.conf
# accessLog bölümünü düzenleyin

accessLog {
  fileName                /usr/local/lsws/logs/example.com/access.log
  logFormat               "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i" %D"
  logHeaders              5
  rollingSize             100M
  keepDays                30
  compressArchive         1
}

Bu yapılandırma ile her site kendi logunu tutar, 100MB’a ulaştığında rotate edilir ve 30 gün boyunca sıkıştırılmış olarak saklanır.

Otomasyon: Log Analiz Script’i

Aşağıdaki script’i cron job olarak çalıştırarak günlük özet raporlar alabilirsiniz:

#!/bin/bash
# /usr/local/bin/ols-log-report.sh

LOG_FILE="/usr/local/lsws/logs/access.log"
REPORT_FILE="/var/reports/ols-daily-$(date +%Y%m%d).txt"
YESTERDAY=$(date -d yesterday +%d/%b/%Y)

mkdir -p /var/reports

echo "=== OpenLiteSpeed Gunluk Rapor: $(date +%d/%m/%Y) ===" > $REPORT_FILE
echo "" >> $REPORT_FILE

echo "--- Toplam Istek Sayisi ---" >> $REPORT_FILE
grep "$YESTERDAY" $LOG_FILE | wc -l >> $REPORT_FILE

echo "" >> $REPORT_FILE
echo "--- HTTP Durum Kodu Dagilimi ---" >> $REPORT_FILE
grep "$YESTERDAY" $LOG_FILE | 
  awk '{print $9}' | 
  sort | uniq -c | 
  sort -rn >> $REPORT_FILE

echo "" >> $REPORT_FILE
echo "--- En Aktif 10 IP ---" >> $REPORT_FILE
grep "$YESTERDAY" $LOG_FILE | 
  awk '{print $1}' | 
  sort | uniq -c | 
  sort -rn | 
  head -10 >> $REPORT_FILE

echo "" >> $REPORT_FILE
echo "--- En Cok Ziyaret Edilen 10 Sayfa ---" >> $REPORT_FILE
grep "$YESTERDAY" $LOG_FILE | 
  awk '{print $7}' | 
  cut -d'?' -f1 | 
  sort | uniq -c | 
  sort -rn | 
  head -10 >> $REPORT_FILE

echo "" >> $REPORT_FILE
echo "--- 500 Hatasi Veren URL'ler ---" >> $REPORT_FILE
grep "$YESTERDAY" $LOG_FILE | 
  awk '$9 == "500" {print $7}' | 
  sort | uniq -c | 
  sort -rn | 
  head -10 >> $REPORT_FILE

# Raporu mail ile gonder (mailutils kurulu olmasi gerekir)
if command -v mail &> /dev/null; then
  mail -s "OLS Gunluk Log Raporu - $(date +%d/%m/%Y)" [email protected] < $REPORT_FILE
fi

echo "Rapor olusturuldu: $REPORT_FILE"

Script’i çalıştırılabilir yapın ve cron’a ekleyin:

chmod +x /usr/local/bin/ols-log-report.sh

# Her gece 06:00'da çalıştır
echo "0 6 * * * root /usr/local/bin/ols-log-report.sh" >> /etc/crontab

Bot Trafiğini Ayırt Etme

Her web sitesinde meşru bot trafiği (Googlebot, Bingbot gibi) ile zararlı botlar bir arada bulunur. Bunları ayırt etmek hem SEO hem de güvenlik açısından önemlidir:

# Tüm bot trafiğini listele
awk -F'"' '{print $6}' /usr/local/lsws/logs/access.log | 
  grep -i "bot|crawler|spider" | 
  sort | uniq -c | 
  sort -rn | 
  head -20

# Googlebot aktivitesini kontrol et
grep -i "googlebot" /usr/local/lsws/logs/access.log | 
  awk '{print $1}' | 
  sort -u

# Sahte Googlebot tespiti (gerçek Googlebot Google IP'lerinden gelir)
# Gerçek değil gibi görünen Googlebot IP'lerini işaretle
grep -i "googlebot" /usr/local/lsws/logs/access.log | 
  awk '{print $1}' | 
  sort -u | 
  while read ip; do
    host $ip | grep -q "googlebot|google.com" || echo "Sahte Googlebot: $ip"
  done

OpenLiteSpeed Admin Panel ile Log İzleme

OpenLiteSpeed’in web admin paneli (https://sunucu-ip:7080) üzerinden de log izleme yapabilirsiniz. Panel üzerinden:

  • Actions > View Error Log: Hata loglarını görüntüleyin
  • Server Status: Anlık bağlantı ve istek istatistiklerini takip edin
  • Virtual Hosts: Her sitenin log ayarlarını ayrı ayrı düzenleyin

Panel kullanışlı olsa da ciddi analiz için komut satırı araçları çok daha güçlüdür. Özellikle büyük log dosyalarında panel yavaş kalabilir.

Disk Alanı Yönetimi

Log dosyaları diskinizi doldurmaya başladığında ne yapacaksınız? Önce durumu değerlendirin:

# Log dizininin boyutunu kontrol et
du -sh /usr/local/lsws/logs/
du -sh /usr/local/lsws/logs/* | sort -rh

# En büyük log dosyalarını bul
find /usr/local/lsws/logs/ -name "*.log*" -exec ls -lh {} ; | 
  sort -k5 -rh | head -10

# Belirli tarihten eski logları temizle (30 günden eski)
find /usr/local/lsws/logs/ -name "*.log.*.gz" -mtime +30 -delete

Önemli not: Log dosyalarını silmeden önce yedeklemenizi öneririm. Özellikle yasal yükümlülükleriniz varsa belirli süre logları saklamak zorunda olabilirsiniz.

AWK ile İleri Düzey Analiz

AWK, log analizi için vazgeçilmez bir araçtır. İşte birkaç gelişmiş kullanım örneği:

# Saatlik trafik dağılımını göster
awk '{
  split($4, a, ":")
  hour = substr(a[2], 1, 2)
  count[hour]++
}
END {
  for (h in count) printf "%s:00 - %d istekn", h, count[h]
}' /usr/local/lsws/logs/access.log | sort

# Belirli bir saatteki yoğunluğu analiz et
awk -v hour="10" '
$4 ~ /:10:/ {
  count++
  if ($9 >= 500) errors++
  bytes += $10
}
END {
  printf "Toplam istek: %dn", count
  printf "Hata orani: %.2f%%n", (errors/count)*100
  printf "Toplam veri: %.2f MBn", bytes/1024/1024
}' /usr/local/lsws/logs/access.log

Sonuç

OpenLiteSpeed access logları, sunucunuzda neler olup bittiğine dair inanılmaz zengin bir bilgi kaynağıdır. Bu yazıda anlattıklarımı günlük rutininize entegre ettiğinizde, sorunları ortaya çıkmadan önce tespit etme, saldırıları erken fark etme ve performans sorunlarını kök nedenlerine kadar izleme kapasitesi kazanırsınız.

Başlangıç için şunları yapmanızı öneririm: önce log formatına yanıt süresini ekleyin, GoAccess kurarak görsel bir dashboard hazırlayın, günlük rapor script’ini cron’a alın ve Fail2Ban entegrasyonunu tamamlayın. Bu dört adım, log yönetiminizi ciddi ölçüde iyileştirecektir.

Logları düzenli olarak analiz etmek bir alışkanlık meselesidir. Her sabah beş dakika ayırarak dünün raporuna bakmak, uzun vadede ciddi sorunları çok erken yakalamanızı sağlar. Sunucunuz size her zaman konuşuyor; iyi bir sysadmin onu dinlemeyi bilir.

Yorum yapın