Apache Access Log Analizi ile Trafik Sorunlarını Tespit Etme

Web sunucunuzda bir şeyler ters gidiyor ama tam olarak ne olduğunu bilmiyorsunuz. Sayfalar yavaş yükleniyor, bazı kullanıcılar hata alıyor ya da sunucu kaynaklarınız beklenmedik şekilde tükeniyor. İşte tam bu noktada Apache access log dosyaları en iyi arkadaşınız oluyor. Ham haliyle bakıldığında anlamsız görünen bu log satırları, doğru araçlarla analiz edildiğinde trafik sorunlarınızın kökünü bulmanızı sağlıyor.

Apache Access Log Formatını Anlamak

Analize başlamadan önce neye baktığımızı anlamalıyız. Apache’nin varsayılan “combined” log formatında her satır şu yapıda görünür:

192.168.1.100 - frank [10/Oct/2023:13:55:36 -0700] "GET /index.html HTTP/1.1" 200 2326 "http://example.com/" "Mozilla/5.0"

Bu satırı parçalarsak:

  • IP adresi: İsteği yapan istemcinin adresi
  • İkinci alan (-): RFC 1413 kimliği, genellikle boş
  • Kullanıcı adı: HTTP auth varsa kullanıcı adı
  • Zaman damgası: İsteğin sunucuya ulaştığı an
  • İstek satırı: HTTP metodu, URI ve protokol versiyonu
  • HTTP durum kodu: 200, 404, 500 gibi
  • Yanıt boyutu: Byte cinsinden döndürülen içerik boyutu
  • Referer: İsteğin geldiği önceki sayfa
  • User-Agent: Tarayıcı veya istemci bilgisi

Log dosyalarınız genellikle /var/log/apache2/access.log (Debian/Ubuntu) ya da /var/log/httpd/access_log (CentOS/RHEL) konumunda bulunur.

Temel Log Analizi Komutları

En Çok İstek Yapan IP Adreslerini Bulmak

Bir DDoS saldırısı mı yaşıyorsunuz, yoksa belirli bir bot mu sunucunuzu eziyorbir? Bu soruyu cevaplamak için şu komutla başlayın:

awk '{print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -rn | head -20

Bu komut size en aktif 20 IP adresini ve her birinin kaç istek yaptığını gösterir. Çıktıda tek bir IP’nin binlerce isteğiyle karşılaşırsanız, bu bir bot ya da scraper olabilir.

Belirli bir IP adresinin hangi saatlerde aktif olduğunu görmek için:

grep "^85.92.110.45" /var/log/apache2/access.log | awk '{print $4}' | cut -d: -f2 | sort | uniq -c | sort -rn

Bu komut o IP’nin hangi saat dilimlerinde aktif olduğunu ortaya koyar. Gece 3’te pik yapan bir IP, muhtemelen otomatik bir süreçtir.

HTTP Durum Kodlarını Analiz Etmek

Sunucunuzdaki hata dağılımına bakmak için:

awk '{print $9}' /var/log/apache2/access.log | sort | uniq -c | sort -rn

Beklediğiniz çıktı büyük çoğunluğun 200 olmasıdır. Eğer 500 ya da 503 kodları çok fazla görünüyorsa, ciddi bir sorun var demektir. 404 sayısının aniden artması ise ya bir migration sonrası kırık linklere, ya da bir scraper’ın rastgele URL denediğine işaret eder.

Sadece 5xx hatalarını görmek ve hangi saatlerde yoğunlaştığını anlamak için:

grep '" 5[0-9][0-9] ' /var/log/apache2/access.log | awk '{print $4}' | cut -d: -f2 | sort | uniq -c | sort -rn

Gerçek Dünya Senaryosu: Ani Yavaşlama Sorununu Çözmek

Sabah 9’da ofise geldiniz ve monitörünüzde uyarılar var. Apache yanıt vermiyor ya da çok yavaş. Sunucuya bağlanıp şu adımları takip edin.

Adım 1: Son 5 dakikadaki istek sayısına bakın:

awk -v d="$(date -d '5 minutes ago' '+%d/%b/%Y:%H:%M')" '$4 > "["d' /var/log/apache2/access.log | wc -l

Adım 2: Eğer sayı normalden çok yüksekse, bu isteklerin nereden geldiğini kontrol edin:

awk -v d="$(date -d '5 minutes ago' '+%d/%b/%Y:%H:%M')" '$4 > "["d {print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -rn | head -10

Adım 3: Hangi URL’lerin en çok istek aldığını görün:

awk '{print $7}' /var/log/apache2/access.log | sort | uniq -c | sort -rn | head -20

Belirli bir endpoint’in binlerce kez çağrıldığını görüyorsanız, bu ya bir scraping saldırısıdır ya da uygulamanızda bir döngü oluşmuştur.

Response Time Analizi

Apache’nin yanıt sürelerini loglamak için önce log formatını güncellemeniz gerekir. /etc/apache2/apache2.conf veya virtual host konfigürasyonunuza şunu ekleyin:

LogFormat "%h %l %u %t "%r" %>s %b %D" timing
CustomLog /var/log/apache2/access_timing.log timing

Burada %D mikrosaniye cinsinden işlem süresini verir. Bu logu aktive ettikten sonra yavaş istekleri bulmak için:

awk '{if ($NF > 2000000) print $0}' /var/log/apache2/access_timing.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -20

Bu komut 2 saniyeden uzun süren isteklerin URL’lerini listeler. Eğer belirli bir URL sürekli yavaş yanıt veriyorsa, orada bir performans sorunu var demektir. Veritabanı sorgusu mu yavaş, dosya okuma mı ağır, bunu araştırmanız gerekiyor.

Bot ve Scraper Tespiti

Meşru arama motoru botları ile zararlı scraperları ayırt etmek önemlidir. Googlebot gibi gerçek botlar kendilerini tanıtır ve bant genişliğinizi nazikçe kullanır. Ama kötü niyetli scraperlar ya User-Agent’larını gizler ya da meşru görünmeye çalışır.

Şüpheli User-Agent’ları bulmak için:

awk -F'"' '{print $6}' /var/log/apache2/access.log | sort | uniq -c | sort -rn | head -30

Normal bir User-Agent “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit…” gibi görünür. Eğer sadece “python-requests/2.28.0” ya da “curl/7.68.0” görüyorsanız, bu otomatik araçlardır. Bağlam önemli; bir API sunucusuysa bu normal, bir e-ticaret sitesiyse şüphelidir.

Saniyede çok fazla istek yapan IP’leri tespit etmek için daha gelişmiş bir yaklaşım:

awk '{print $1, $4}' /var/log/apache2/access.log | sed 's/[//' | awk '{print $1, substr($2,1,17)}' | sort | uniq -c | awk '$1 > 60 {print $0}' | sort -rn

Bu komut bir dakika içinde 60’tan fazla istek yapan IP-zaman kombinasyonlarını bulur.

404 Hata Analizi ile Kırık Link Tespiti

Site migration yaptıktan sonra ya da URL yapısını değiştirdiğinizde 404 hataları patlayabilir. Bu hataları analiz etmek hem SEO açısından hem de kullanıcı deneyimi açısından kritiktir.

grep '" 404 ' /var/log/apache2/access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -30

Bu liste size en çok 404 alan URL’leri verir. Eğer eski URL yapınızdan gelen linkler varsa, .htaccess veya Apache konfigürasyonunuza redirect eklemeniz gerekir.

Hangi sayfalarda bulunan linklerden 404’e düşüldüğünü anlamak için referer bilgisine bakın:

grep '" 404 ' /var/log/apache2/access.log | awk -F'"' '{print $4, $2}' | sort | uniq -c | sort -rn | head -20

Eğer referer’lar kendi sitenizden geliyorsa, iç linklerde sorun var demektir. Dış sitelerden geliyorsa, o sitelerdeki backlink’leriniz artık geçersiz.

Gerçek Dünya Senaryosu: Bant Genişliği Tükenmesi

Bir müşteri sunucunuza baktığınızı düşünün. Aylık bant genişlikleri dolmuş ama trafik sayıları normal görünüyor. Bu durumda sorun istek sayısında değil, döndürülen veri boyutundadır.

En büyük yanıtları döndüren istekleri bulmak için:

awk '{print $10, $7}' /var/log/apache2/access.log | sort -rn | head -20

Burada $10 yanıt boyutunu byte cinsinden verir. Eğer tek bir video dosyası ya da büyük bir PDF binlerce kez indiriliyorsa, bant genişliğinizi bu tüketiyor demektir.

Belirli bir dosya türünün toplam bant genişliği tüketimini hesaplamak için:

grep '.mp4' /var/log/apache2/access.log | awk '{sum += $10} END {print sum/1024/1024 " MB"}' 

Bu komut .mp4 dosyaları için toplam transfer edilen veriyi MB cinsinden gösterir. Aynı mantıkla .zip, .iso ya da diğer büyük dosyalar için de kullanabilirsiniz.

Saatlik ve Günlük Trafik Analizi

Trafik desenlerini anlamak, kapasite planlaması için kritiktir. Hangi saatlerde pik yapıyorsunuz, hangi günler daha yoğun?

Saatlik trafik dağılımı için:

awk '{print $4}' /var/log/apache2/access.log | cut -d: -f2 | sort | uniq -c

Günlük trafik analizi için:

awk '{print $4}' /var/log/apache2/access.log | cut -d[ -f2 | cut -d: -f1 | sort | uniq -c | sort -k2 -t/ -k3 -k1

Bu analiz size sunucunuzun ne zaman ölçeklenmesi gerektiğini söyler. Sabah 9-11 ve öğleden sonra 14-16 arası pik yapıyorsa, otoscaling kurallarınızı buna göre ayarlayabilirsiniz.

GoAccess ile Görsel Log Analizi

Komut satırı işlemleri güçlüdür ama bazen görsel bir özet daha pratik olur. GoAccess bu iş için mükemmel bir araçtır.

Ubuntu/Debian’da kurulum:

sudo apt-get install goaccess

Terminal tabanlı gerçek zamanlı analiz için:

goaccess /var/log/apache2/access.log --log-format=COMBINED

HTML rapor oluşturmak için:

goaccess /var/log/apache2/access.log -o /var/www/html/report.html --log-format=COMBINED --real-time-html

Bu komut /var/www/html/report.html adresinde güzel bir dashboard oluşturur. Tarayıcıdan bu sayfayı açtığınızda trafik istatistiklerinizi görsel olarak inceleyebilirsiniz. Tabii bu sayfayı herkese açık bırakmayın, mutlaka kimlik doğrulama ekleyin.

Birden fazla log dosyasını birleştirerek analiz etmek için:

goaccess /var/log/apache2/access.log /var/log/apache2/access.log.1 -o report.html --log-format=COMBINED

Güvenlik Açığı Taramalarını Tespit Etmek

Sunucunuz sürekli SQL injection, XSS ya da directory traversal denemeleriyle karşılaşıyor olabilir. Bu denemeleri loglardan yakalamak için:

grep -E "(union|select|insert|drop|;|<script>|../)" /var/log/apache2/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -20

WordPress tabanlı sitelerde yaygın olan /wp-admin ve /wp-login.php brute force denemelerini bulmak için:

grep "wp-login.php" /var/log/apache2/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -10

Eğer tek bir IP’den yüzlerce wp-login.php isteği görüyorsanız, bu bir brute force saldırısıdır. Bu IP’yi fail2ban ile ya da doğrudan .htaccess veya iptables kuralıyla bloklayabilirsiniz.

Şüpheli bir IP’nin tüm aktivitesini detaylı incelemek için:

grep "^45.142.120.81 " /var/log/apache2/access.log | awk '{print $7, $9}' | sort | uniq -c | sort -rn

Bu komut o IP’nin hangi URL’lere, hangi sonuçlarla eriştiğini gösterir. Sistem dosyalarına, admin panellerine ya da olmayan endpoint’lere sürekli istek atıyorsa, bu IP’yi bloklamanız gerekir.

Log Rotasyonu ve Eski Logları Analiz Etmek

Apache logları logrotate ile döndürülür ve eski dosyalar .gz formatında sıkıştırılır. Sıkıştırılmış loglarda arama yapmak için zgrep ve zcat kullanın:

zgrep "500" /var/log/apache2/access.log.2.gz | awk '{print $7}' | sort | uniq -c | sort -rn

Birden fazla dönemin logunu birleştirerek analiz etmek için:

zcat /var/log/apache2/access.log.*.gz | cat - /var/log/apache2/access.log | grep '" 500 ' | awk '{print $7}' | sort | uniq -c | sort -rn

Bu yaklaşım özellikle “geçen hafta ne oldu?” sorusunu cevaplamak için kullanışlıdır.

Otomatik Uyarı Script’i Yazmak

Manuel analiz yerine otomatik bir monitoring script’i yazmak daha sürdürülebilirdir. Aşağıdaki script belirli eşikleri aşınca uyarı verir:

#!/bin/bash

LOG_FILE="/var/log/apache2/access.log"
ALERT_EMAIL="[email protected]"
ERROR_THRESHOLD=100
IP_THRESHOLD=500

# Son 5 dakikadaki 5xx hatalarını say
RECENT_ERRORS=$(awk -v d="$(date -d '5 minutes ago' '+%d/%b/%Y:%H:%M')" 
    '$4 > "["d && $9 ~ /^5/' $LOG_FILE | wc -l)

if [ "$RECENT_ERRORS" -gt "$ERROR_THRESHOLD" ]; then
    echo "UYARI: Son 5 dakikada $RECENT_ERRORS adet 5xx hatası tespit edildi" | 
    mail -s "Apache Hata Uyarisi" $ALERT_EMAIL
fi

# Tek IP'den gelen yüksek istek sayısını kontrol et
HIGH_TRAFFIC_IP=$(awk -v d="$(date -d '5 minutes ago' '+%d/%b/%Y:%H:%M')" 
    '$4 > "["d {print $1}' $LOG_FILE | 
    sort | uniq -c | sort -rn | 
    awk -v threshold="$IP_THRESHOLD" '$1 > threshold {print $2, $1}' | head -5)

if [ -n "$HIGH_TRAFFIC_IP" ]; then
    echo "UYARI: Yuksek trafik IP'leri tespit edildi:n$HIGH_TRAFFIC_IP" | 
    mail -s "Apache Yuksek Trafik Uyarisi" $ALERT_EMAIL
fi

Bu script’i cron’a ekleyin:

*/5 * * * * /usr/local/bin/apache-monitor.sh

Her 5 dakikada bir çalışarak anormal durumları size bildirecektir.

Logları Daha Anlamlı Hale Getirmek

Analizi kolaylaştırmak için Apache log formatınıza birkaç ekleme yapabilirsiniz. Virtual host konfigürasyonunuza ekleyin:

LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i" %D %{X-Forwarded-For}i" detailed
CustomLog /var/log/apache2/access_detailed.log detailed

Burada:

  • %D: Yanıt süresi mikrosaniye cinsinden
  • %{X-Forwarded-For}i: Load balancer veya proxy arkasındaki gerçek IP

Eğer load balancer kullanıyorsanız $1 (ilk alan) her zaman load balancer’ın IP’si olur ve gerçek kullanıcı IP’sini göremezsiniz. X-Forwarded-For başlığını loglamak bu sorunu çözer.

Sonuç

Apache access logları, sunucunuzda olan bitenin en detaylı kaydıdır. Doğru komutlarla bu logları analiz etmek; performans sorunlarını, güvenlik tehditlerini, kırık linkleri ve anormal trafik desenlerini hızla ortaya çıkarmanızı sağlar.

Günlük rutininize birkaç temel analiz ekleyin: En çok hata veren URL’lere bakın, anormal IP aktivitelerini kontrol edin ve yanıt sürelerini izleyin. Bir sorun olduğunda logları okumaya başlamak yerine, logları düzenli okuduğunuzda “normal”in ne olduğunu öğrenirsiniz. Normal’i bilince, anormal’i hemen fark edersiniz.

GoAccess gibi araçlarla görsel dashboard’lar oluşturmak, teknik olmayan paydaşlara trafik durumunu aktarmayı da kolaylaştırır. Ve elbette, otomatik monitoring script’leri ile siz uyurken bile sunucunuz kendi kendini izler.

Log analizi reaktif bir iş olmak zorunda değil. Proaktif bir yaklaşımla, sorunlar büyümeden önce yakalayabilirsiniz.

Benzer Konular

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir