Apache Log Analizi: Trafik Raporlama ve Hata Tespiti
Sunucu yönetiminde en çok ihmal edilen konulardan biri log analizidir. “Her şey çalışıyor, neden bakayım ki?” mantığı, bir gün karşınıza büyük bir sürprizle çıkabilir. Apache log dosyaları aslında sunucunuzun sesli olmayan bir günlüğüdür ve bu günlüğü okumayı öğrendiğinizde hem performans sorunlarını erkenden yakalar hem de güvenlik tehditlerini fark edersiniz. Bu yazıda, Apache log analizini pratik bir şekilde ele alacağız.
Apache Log Dosyaları Nerede ve Ne İçerir?
Apache, varsayılan olarak iki ana log dosyası tutar:
- /var/log/apache2/access.log (Debian/Ubuntu) veya /var/log/httpd/access_log (CentOS/RHEL): Her HTTP isteğini kaydeder.
- /var/log/apache2/error.log veya /var/log/httpd/error_log: Hataları ve uyarıları kaydeder.
Bir access.log satırı tipik olarak şöyle görünür:
192.168.1.105 - admin [12/Mar/2024:14:32:10 +0300] "GET /panel/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 adresi
- İkinci alan (tire): RFC 1413 kimliği, genellikle boş
- Kullanıcı adı: HTTP auth kullanılıyorsa gösterir
- Tarih/saat: İsteğin yapıldığı zaman
- HTTP metodu ve yol: Hangi kaynak istendi
- HTTP durum kodu: 200, 404, 500 gibi
- Yanıt boyutu: Byte cinsinden
- Referer: İsteğin nereden geldiği
- User-Agent: Tarayıcı veya bot bilgisi
Bu formatı anlamak, analiz komutlarını çok daha mantıklı hale getirir.
Temel Log Analizi Komutları
Şimdi işe yarar komutlara geçelim. Grafik araç kurmadan, sadece terminal ile neler yapabileceğinize bakın.
En Çok İstek Gönderen IP’leri Bulmak
Bir sunucuda yavaşlama veya yüksek CPU kullanımı fark ettiğinizde ilk yapmanız gereken şeylerden biri, kimin ne kadar istek gönderdiğini görmektir.
awk '{print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -rn | head -20
Bu komut, access.log dosyasındaki ilk sütunu (IP adresi) alır, sıralar, tekrar eden satırları sayar ve en yüksekten aşağıya doğru ilk 20 IP’yi listeler. Eğer bir IP binlerce istek atmışsa, o IP’yi daha detaylı incelemeniz gerekir.
Belirli Bir IP’nin Trafiğini İzlemek
Şüpheli bir IP buldunuz diyelim, o IP’nin hangi sayfalara eriştiğini görmek istersiniz:
grep "^203.0.113.42" /var/log/apache2/access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -30
Bu komutla o IP’nin hangi URL’lere ne kadar istek attığını görebilirsiniz. Eğer /admin, /wp-admin, /phpmyadmin gibi yollara onlarca deneme yapmışsa, bu bir kaba kuvvet saldırısının işareti olabilir.
HTTP Durum Kodlarına Göre Analiz
Siteyi ziyaret edenlerin ne kadarı hata alıyor? 500 hatası veya 404 sayısı aniden arttıysa bir şeyler yanlış gidiyor demektir.
awk '{print $9}' /var/log/apache2/access.log | sort | uniq -c | sort -rn
Tipik bir çıktı şöyle olabilir:
45823 200
3241 304
892 404
234 301
87 500
12 403
500 hatası sayısı beklenmedik şekilde artmışsa, PHP hatası veya veritabanı bağlantı sorunu olabilir. 404 sayısı yüksekse ya silinen sayfalar var ya da biri kötü niyetli tarama yapıyor olabilir.
Trafik Raporlama: Zaman Bazlı Analiz
Anlık veri görmek yerine zaman dilimlerine göre analiz yapmak çok daha değerli bilgiler verir. Hangi saatlerde trafik pik yapıyor, hafta sonları nasıl bir durum var gibi soruların cevaplarını buradan alırsınız.
Saatlik Trafik Dağılımı
awk '{print $4}' /var/log/apache2/access.log | cut -d: -f2 | sort | uniq -c | sort -k2n
Bu komut gün içindeki saatlere göre istek sayısını gösterir. Eğer gece 3’te ani bir trafik artışı görüyorsanız ve bu normal değilse, botlar veya otomatik saldırı araçları devrede olabilir.
Belirli Bir Güne Ait İstatistikler
Büyük bir kampanya yaptınız veya bir blog yazısı viral oldu ve o güne ait trafiği analiz etmek istiyorsunuz:
grep "12/Mar/2024" /var/log/apache2/access.log | awk '{print $1}' | sort -u | wc -l
Bu komut, belirtilen tarihteki tekil IP sayısını verir. Bu sayı size o gün kaç farklı ziyaretçinin geldiğini gösterir. Tabından dikkat: Aynı kullanıcı birden fazla IP’den bağlanabilir ve bir IP’nin arkasında birden fazla kullanıcı olabilir (NAT gibi), ama genel fikir için işe yarar.
En Çok İndirilen Dosyalar ve Sayfalar
awk '$9 == 200 {print $7}' /var/log/apache2/access.log | sort | uniq -c | sort -rn | head -20
Burada sadece 200 (başarılı) isteklere baktık. Bu sayede en çok talep gören sayfaları veya dosyaları görürsünüz. Büyük bir görüntü veya video dosyası binlerce kez indiriliyorsa ve CDN kullanmıyorsanız, bant genişliği maliyetleriniz artıyor olabilir.
Hata Tespiti ve Sorun Giderme
Hata log dosyaları, access log kadar sık incelenmez ama aslında daha kritik bilgiler içerebilir.
Error Log’u Takip Etmek
Canlı ortamda hataları gerçek zamanlı izlemek için:
tail -f /var/log/apache2/error.log | grep -E "error|crit|alert|emerg"
Bu komut error log’u canlı takip eder ve sadece ciddi seviyedeki mesajları gösterir. Bir deployment yaptıktan sonra bu komutu açık bırakmak, olası hataları anında yakalamanızı sağlar.
500 Hatalarının Kaynağını Bulmak
grep " 500 " /var/log/apache2/access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -20
Hangi URL’nin 500 hatası ürettiğini görmek, sorunu çok hızlı lokalize etmenizi sağlar. Eğer tek bir PHP dosyası tekrar tekrar 500 veriyorsa, sorun oradadır.
Yavaş İstekleri Tespit Etmek
Apache’de %D log formatı, isteğin mikrosaniye cinsinden ne kadar sürdüğünü kaydeder. Önce Apache log formatınızı kontrol edin:
grep "LogFormat" /etc/apache2/apache2.conf
Eğer yanıt süresini loga eklememişseniz, VirtualHost konfigürasyonunuza şunu ekleyebilirsiniz:
LogFormat "%h %l %u %t "%r" %>s %b %D" performance
CustomLog /var/log/apache2/performance.log performance
Ardından yavaş istekleri şöyle bulabilirsiniz (1 saniyeden uzun sürenler, yani 1.000.000 mikrosaniye):
awk '$NF > 1000000 {print $NF, $7}' /var/log/apache2/performance.log | sort -rn | head -20
Bu listedeki URL’ler, optimize etmeniz gereken sayfalardır.
GoAccess ile Görsel Log Analizi
Komut satırı araçları güçlüdür ama bazen görsel bir rapor daha anlaşılır olur. GoAccess, terminal üzerinde çalışan hızlı ve etkili bir log analiz aracıdır.
Kurulum:
# Debian/Ubuntu
apt install goaccess
# CentOS/RHEL
yum install goaccess
Temel kullanım:
goaccess /var/log/apache2/access.log --log-format=COMBINED -o /var/www/html/report.html --real-time-html
Bu komut, interaktif bir HTML raporu oluşturur. --real-time-html parametresiyle rapor canlı olarak güncellenir. Tarayıcınızdan /report.html adresine girdiğinizde trafik istatistiklerini, en çok ziyaret edilen sayfaları, tarayıcı dağılımını ve çok daha fazlasını görsel olarak görebilirsiniz.
GoAccess’i cron job olarak çalıştırarak günlük raporlar da oluşturabilirsiniz:
0 6 * * * goaccess /var/log/apache2/access.log --log-format=COMBINED -o /var/www/html/daily-report.html > /dev/null 2>&1
Gerçek Dünya Senaryosu: DDoS veya Bot Saldırısı Tespiti
Sabah işe geldiniz, sunucu yavaş çalışıyor. Ekip “site çok yavaş” diye şikayet ediyor. Hemen log analizine başlayın.
Adım 1: Anlık trafik miktarını kontrol edin.
tail -n 10000 /var/log/apache2/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -10
Eğer bir IP adresi binlerce istek atmışsa, o IP’yi geçici olarak engelleyin:
iptables -I INPUT -s 203.0.113.99 -j DROP
Adım 2: User-Agent analizine bakın.
awk -F'"' '{print $6}' /var/log/apache2/access.log | sort | uniq -c | sort -rn | head -20
Eğer çıktıda “sqlmap”, “nikto”, “masscan”, “curl” gibi otomatik tarama araçlarının adları görünüyorsa, saldırı altındasınız demektir. Ayrıca boş User-Agent değerleri de şüphelidir.
Adım 3: Bant genişliği tüketimini hesaplayın.
awk '{sum += $10} END {print sum/1024/1024 " MB"}' /var/log/apache2/access.log
Bu komut, log dosyasındaki toplam transfer miktarını MB cinsinden verir. Beklenmedik yüksek bir değer görüyorsanız, büyük dosyalarınız kötü niyetli kişilerce tekrar tekrar indiriliyor olabilir.
Log Rotasyonu ve Arşivleme
Analiz yapabilmek için önce log dosyalarının düzgün yönetilmesi gerekir. Büyük log dosyaları hem disk dolmasına neden olur hem de analizi zorlaştırır.
Apache, logrotate ile birlikte çalışır. Konfigürasyon dosyasına bakın:
cat /etc/logrotate.d/apache2
Tipik bir logrotate konfigürasyonu şöyle görünmelidir:
/var/log/apache2/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 640 root adm
sharedscripts
postrotate
if invoke-rc.d apache2 status > /dev/null 2>&1; then
invoke-rc.d apache2 reload > /dev/null 2>&1
fi
endscript
}
Bu konfigürasyon şu anlama gelir:
- daily: Log’lar her gün döndürülür
- rotate 14: 14 günlük log saklanır
- compress: Eski loglar gzip ile sıkıştırılır
- delaycompress: En son döndürülen log hemen sıkıştırılmaz
Eğer 14 günden fazla saklamak istiyorsanız rotate değerini artırın, ancak disk alanınıza dikkat edin.
Otomatik Uyarı Sistemi Kurmak
Sadece manuel analiz yapmak yetmez, kritik durumlar oluştuğunda otomatik olarak haberdar olmak istersiniz. Basit bir bash scriptiyle bu mümkün:
#!/bin/bash
# apache-alert.sh - Apache hata monitörü
LOG_FILE="/var/log/apache2/access.log"
ERROR_LOG="/var/log/apache2/error.log"
THRESHOLD_500=50
THRESHOLD_IP=500
EMAIL="[email protected]"
# Son 5 dakikadaki 500 hatalarını say
RECENT_500=$(tail -n 5000 "$LOG_FILE" | grep " 500 " | wc -l)
if [ "$RECENT_500" -gt "$THRESHOLD_500" ]; then
echo "UYARI: Son 5000 istekte $RECENT_500 adet 500 hatası tespit edildi!" |
mail -s "[ALARM] Apache 500 Hata Eşiği Aşıldı" "$EMAIL"
fi
# En aktif IP'yi kontrol et
TOP_IP_COUNT=$(tail -n 10000 "$LOG_FILE" | awk '{print $1}' | sort | uniq -c | sort -rn | head -1 | awk '{print $1}')
if [ "$TOP_IP_COUNT" -gt "$THRESHOLD_IP" ]; then
TOP_IP=$(tail -n 10000 "$LOG_FILE" | awk '{print $1}' | sort | uniq -c | sort -rn | head -1 | awk '{print $2}')
echo "UYARI: $TOP_IP adresi son 10000 istekte $TOP_IP_COUNT istek gönderdi!" |
mail -s "[ALARM] Olası Bot/DDoS Aktivitesi" "$EMAIL"
fi
Bu scripti cron’a ekleyin:
*/5 * * * * /usr/local/bin/apache-alert.sh
Her 5 dakikada bir çalışır ve belirlediğiniz eşikler aşılırsa size e-posta gönderir.
Logları Merkezi Sisteme Göndermek
Birden fazla sunucunuz varsa, her birinde ayrı ayrı log analizi yapmak çok zahmetlidir. Rsyslog kullanarak Apache loglarını merkezi bir sisteme yönlendirebilirsiniz.
Sunucu tarafında Apache’nin rsyslog’a log göndermesi için:
# /etc/apache2/conf-available/logging.conf
CustomLog "| /usr/bin/logger -t apache-access -p local1.info" combined
ErrorLog "| /usr/bin/logger -t apache-error -p local1.error"
Rsyslog konfigürasyonunda log sunucusuna yönlendirme:
# /etc/rsyslog.d/apache-remote.conf
local1.* @192.168.1.10:514
Bu sayede tüm Apache logları merkezi log sunucusunda toplanır ve tek bir noktadan analiz yapabilirsiniz. ELK Stack (Elasticsearch, Logstash, Kibana) veya Grafana Loki gibi araçlarla görsel raporlama ekleyebilirsiniz, ancak bu ayrı bir yazı konusu.
Önemli İpuçları ve Sık Yapılan Hatalar
- Log dosyalarının boyutunu düzenli kontrol edin. Rotasyon çalışmıyorsa diskler dolabilir ve bu Apache’nin durmasına neden olur.
- Analiz yaparken production loglarını kopyalayarak çalışın.
cp /var/log/apache2/access.log /tmp/access_backup.loggibi bir kopya üzerinde işlem yapın, özellikle uzun sürecek komutlar için. - Zaman dilimlerine dikkat edin. Sunucu loklarındaki zaman dilimi (UTC veya local) ile sizin beklentiniz farklı olabilir.
datekomutuyla sunucu saatini kontrol edin. - Her 404 hatasını kötü sanmayın. Tarayıcılar favicon.ico veya robots.txt gibi dosyaları otomatik ister, bunlar normalde 404 üretebilir. Önemli olan sistemin gerçek sayfalarına gelen 404’lerdir.
- User-Agent değerlerine körü körüne güvenmeyin. User-Agent bilgisi kolayca taklit edilebilir. Bunu kara listelemek için bir temel oluşturabilir ama kesin çözüm değildir.
Sonuç
Apache log analizi, reaktif değil proaktif bir yönetim anlayışının temel taşlarından biridir. Basit grep ve awk komutlarından GoAccess gibi görsel araçlara, otomatik uyarı scriptlerinden merkezi log sistemlerine kadar geniş bir araç seti mevcut. Önemli olan bu araçları düzenli kullanmak ve log okumayı alışkanlık haline getirmektir.
Sunucunuzu gerçek anlamda tanımak için loglarını tanımalısınız. Bir anomali gördüğünüzde ne anlama geldiğini bilmek, hem gece uykunuzu kaçıracak olayları önceden engeller hem de sorun çıktığında çok daha hızlı müdahale etmenizi sağlar. Bu yazıdaki komutları kendi sunucunuzda deneyin, çıktıları yorumlamayı pratik yaparak öğrenin. Zamanla logları okumak size doğal gelmeye başlayacak ve sunucunuzu çok daha iyi anlayacaksınız.
