تحلیل لاگ nginx با awk و GoAccess

لاگ دسترسی nginx گنجینه‌ای از اطلاعات است: چه کسی چه چیزی را چقدر سریع دریافت کرد. با چند دستور آماده می‌توانید حمله، ربات‌ها و صفحات کند را پیدا کنید.

وب‌سرور و SSLمتوسط8 دقیقه

۱فرمت لاگ همراه با زمان پاسخ

فرمت پیش‌فرض (combined) زمان پاسخ را ندارد. یک فرمت سفارشی بسازید و در server block استفاده کنید. $request_time زمان کل و $upstream_response_time زمان پاسخ برنامه است.

nginx
# در بلوک 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 ناشناس هزاران درخواست دارد ممکن است ربات باشد.

bash
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

۳پربازدیدترین آدرس‌ها

ستون هفتم آدرس درخواست است.

bash
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -15

۴توزیع کدهای وضعیت

نسبت 200، 404، 500 و ... را ببینید. افزایش ناگهانی 5xx یعنی مشکل برنامه است.

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

۵آدرس‌هایی که 404 می‌دهند

برای پیدا کردن لینک‌های شکسته و اسکن حمله‌کننده‌ها (مثل درخواست wp-login.php روی سایتی که وردپرس نیست).

bash
awk '$9 == 404 {print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20

۶کندترین درخواست‌ها (با فرمت timed)

درخواست‌هایی که بیش از ۲ ثانیه طول کشیده‌اند.

bash
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.

bash
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 می‌دهید.

bash
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 نصب می‌شود. تنظیم پیش‌فرض را ببینید و در صورت نیاز تعداد نگه‌داری را تغییر دهید.

bash
cat /etc/logrotate.d/nginx
sudo logrotate -d /etc/logrotate.d/nginx

پرسش‌های پرتکرار دربارهٔ تحلیل لاگ nginx با awk و GoAccess

لاگ nginx خیلی بزرگ شده، چه کنم؟

اول مطمئن شوید logrotate کار می‌کند. سپس برای فایل‌های استاتیک access_log off بگذارید و در صورت نیاز لاگ را فقط برای درخواست‌های مهم نگه دارید.