Nginx erişim günlüğünü okuma: en çok istek yapan IP'ler, hatalar ve botlar
Sitenizin yavaşladığını ya da beklenmedik şekilde yoğunlaştığını fark ettiğinizde ilk bakılacak yer Nginx günlükleridir. İki dosya vardır: /var/log/nginx/access.log (her istek bir satır) ve /var/log/nginx/error.log (sunucu hataları). Aşağıdaki komutlar özel bir araç kurmadan size özet çıkarır.
Satırın yapısı
Varsayılan biçimde bir satır şuna benzer:
203.0.113.7 - - [20/Oct/2026:11:57:06 +0300] "GET /urun?id=5 HTTP/1.1" 200 5123 "-" "Mozilla/5.0 ..."
Sırasıyla: ziyaretçi IP'si (1. sütun), zaman, istek (yöntem, yol, protokol), durum kodu (9. sütun), gönderilen bayt (10. sütun), yönlendiren sayfa ve tarayıcı bilgisi. Aşağıdaki komutlar sütun numaralarına dayanır; günlük biçimini değiştirdiyseniz numaraları ona göre ayarlayın.
En çok istek yapan IP'ler
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
Çıktıda sol sütun istek sayısı, sağ sütun adrestir. Bir adres diğerlerinden çok fazla istek yapıyorsa bot ya da tarayıcı olabilir. Tek başına şüpheli saymayın: arama motoru botları (Googlebot) çok istek yapar; adresin kime ait olduğunu whois ya da ters DNS ile kontrol edin.
Durum kodlarına göre dağılım
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn
- 200 başarı, 301/302 yönlendirme.
- Çok sayıda 404 bot taraması ya da kırık bağlantı demektir:
awk '$9==404 {print $7}' ... | sort | uniq -c | sort -rn | headhangi adreslerin bulunmadığını gösterir. - 499 istemcinin yanıtı beklemeden bağlantıyı kapattığını, 5xx sunucu hatalarını gösterir: 502.
En çok istenen sayfalar
awk '{print $7}' /var/log/nginx/access.log | cut -d'?' -f1 | sort | uniq -c | sort -rn | head -10
WordPress sitelerinde /wp-login.php ve /xmlrpc.php en üstte çıkıyorsa giriş saldırısı vardır: saldırıları engelleme.
Belirli bir saat ya da gün
grep "20/Oct/2026:11:" /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head
Yavaşlığın başladığı saati bulup o saate odaklanmak, sorunun nedenini hızla gösterir. Eski günlükler access.log.1 ve access.log.2.gz gibi saklanır; sıkıştırılmışları zcat access.log.2.gz | awk ... ile okuyun.
Canlı izleme
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log
Siteyi tarayıcıdan açıp isteğin günlüğe düşüp düşmediğine bakmak, isteğin Nginx'e ulaşıp ulaşmadığını gösterir. Düşmüyorsa sorun daha önce (DNS, güvenlik duvarı, CDN) demektir.
Botları kısıtlamak
Zararlı bir adresi engellemek için ayarınıza deny 198.51.100.7; ekleyebilir ya da tekrar eden başarısız girişleri otomatik engelleyen fail2ban kullanabilirsiniz: brute force koruması. İstek sınırlama için: istek sınırlama. Günlük dosyaları büyürse: logrotate. Yetkisiz erişim şüphesi varsa: kontrol listesi.
Sık sorulanlar
Günlükteki IP adresleri hep aynı (127.0.0.1), neden?
Nginx bir ters proxy ya da Cloudflare arkasındaysa görünen adres proxy'nin adresidir. Gerçek adres için X-Forwarded-For başlığını kullanın (real_ip modülü ya da günlük biçimine $http_x_forwarded_for eklemek).
Günlükleri kapatabilir miyim?
Erişim günlüğünü yoğun bir sitede kapatmak (access_log off;) disk kullanımını azaltır ama sorun çıktığında gözünüz kör olur. Kapatmak yerine saklama süresini kısaltın.
Günlük dosyası çok büyük, awk yavaş.
Önce son satırlarla sınırlayın: tail -n 100000 access.log | awk .... Büyük analizler için GoAccess gibi bir araç kurabilirsiniz.
İlgili makaleler
- WordPress giriş sayfası ve xmlrpc.php saldırılarını engelleme
- Sunucuma saldırı yapılıyor mu? Nasıl anlarım?
- Sitem çok yavaş açılıyor, ne yapabilirim?
Sorununuz çözülmediyse destek talebi açın. Hangi adımı denediğinizi ve ekranda ne gördüğünüzü yazarsanız çözüm çok daha hızlı olur.
Geri bildiriminiz için teşekkürler!