Nginx erişim günlüğünü okuma: en çok istek yapan IP'ler, hatalar ve botlar

Nginx ve Web Sunucusu 72 görüntülenme Markdown

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 | head hangi 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

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.

Faydalı oldu mu?

Geri bildiriminiz için teşekkürler!

Hâlâ Yardıma mı İhtiyacınız Var?

Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.