تحلیل لاگ nginx با awk و GoAccess
لاگ دسترسی nginx گنجینهای از اطلاعات است: چه کسی چه چیزی را چقدر سریع دریافت کرد. با چند دستور آماده میتوانید حمله، رباتها و صفحات کند را پیدا کنید.
۱فرمت لاگ همراه با زمان پاسخ
فرمت پیشفرض (combined) زمان پاسخ را ندارد. یک فرمت سفارشی بسازید و در server block استفاده کنید. $request_time زمان کل و $upstream_response_time زمان پاسخ برنامه است.
# در بلوک http
log_format timed '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" rt=$request_time urt=$upstream_response_time';
# در server block
access_log /var/log/nginx/example.com.access.log timed;۲پرترافیکترین IP ها
ده IP ای که بیشترین درخواست را داشتهاند. اگر یک IP ناشناس هزاران درخواست دارد ممکن است ربات باشد.
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10۳پربازدیدترین آدرسها
ستون هفتم آدرس درخواست است.
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -15۴توزیع کدهای وضعیت
نسبت 200، 404، 500 و ... را ببینید. افزایش ناگهانی 5xx یعنی مشکل برنامه است.
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn۵آدرسهایی که 404 میدهند
برای پیدا کردن لینکهای شکسته و اسکن حملهکنندهها (مثل درخواست wp-login.php روی سایتی که وردپرس نیست).
awk '$9 == 404 {print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20۶کندترین درخواستها (با فرمت timed)
درخواستهایی که بیش از ۲ ثانیه طول کشیدهاند.
grep -oP 'rt=\K[0-9.]+' /var/log/nginx/example.com.access.log | sort -rn | head
awk -F'rt=' '{split($2,a," "); if (a[1] > 2) print $0}' /var/log/nginx/example.com.access.log | head۷ترافیک یک ساعت مشخص و رباتهای موتور جستجو
برای بررسی حملهٔ مشخص یا رفتار Googlebot.
grep '29/Sep/2026:10:' /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head
grep -i googlebot /var/log/nginx/access.log | awk '{print $9}' | sort | uniq -cبرای مطمئن شدن از اینکه یک IP واقعاً Googlebot است، reverse DNS آن را با host <ip> بررسی کنید؛ User-Agent بهراحتی جعل میشود.
۸گزارش گرافیکی با GoAccess
GoAccess لاگ را به گزارش HTML تبدیل میکند. برای لاگهای فشردهٔ قدیمی هم zcat میدهید.
sudo apt install -y goaccess
sudo goaccess /var/log/nginx/access.log --log-format=COMBINED -o /var/www/report.html
# لاگهای فشرده هم
zcat /var/log/nginx/access.log.*.gz | goaccess - --log-format=COMBINEDگزارش HTML را با رمز (Basic Auth) محافظت کنید تا عمومی نشود.
۹چرخش لاگها
logrotate همراه nginx نصب میشود. تنظیم پیشفرض را ببینید و در صورت نیاز تعداد نگهداری را تغییر دهید.
cat /etc/logrotate.d/nginx
sudo logrotate -d /etc/logrotate.d/nginxپرسشهای پرتکرار دربارهٔ تحلیل لاگ nginx با awk و GoAccess
لاگ nginx خیلی بزرگ شده، چه کنم؟
اول مطمئن شوید logrotate کار میکند. سپس برای فایلهای استاتیک access_log off بگذارید و در صورت نیاز لاگ را فقط برای درخواستهای مهم نگه دارید.