日志分析是高级站长的核心竞争力。Nginx访问日志中隐藏着网站运营的全部真相——搜索引擎蜘蛛的抓取频率、用户的真实行为路径、恶意爬虫的攻击模式、页面的性能瓶颈。不懂日志分析的站长,等于在黑暗中摸索。本文将系统讲解Nginx日志的分析方法,从基础命令到自动化方案。
一、Nginx日志格式配置
默认的combined格式信息量不够,需要自定义日志格式:

log_format detailed '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time $upstream_response_time '
'$upstream_addr $upstream_status '
'"$http_x_forwarded_for"';
access_log /www/wwwlogs/yoursite.log detailed;
新增的关键字段:
- $request_time:请求总耗时(从接收到返回的完整时间)
- $upstream_response_time:PHP-FPM处理耗时
- $upstream_addr:后端服务器地址
- $http_x_forwarded_for:CDN代理下的真实IP
二、搜索引擎蜘蛛分析
1. 百度蜘蛛抓取统计
# 今日百度蜘蛛请求数
cat /www/wwwlogs/yoursite.log | grep "12/May/2026" | grep -i "Baiduspider" | wc -l
# 百度蜘蛛抓取的URL分布
cat /www/wwwlogs/yoursite.log | grep -i "Baiduspider" | \
awk '{print $7}' | sort | uniq -c | sort -rn | head -20
# 百度蜘蛛抓取状态码分布
cat /www/wwwlogs/yoursite.log | grep -i "Baiduspider" | \
awk '{print $9}' | sort | uniq -c | sort -rn
# 百度蜘蛛抓取频率(按小时统计)
cat /www/wwwlogs/yoursite.log | grep -i "Baiduspider" | \
awk -F: '{print $2":00"}' | sort | uniq -c
2. Google蜘蛛分析
# Googlebot请求
grep -i "Googlebot" /www/wwwlogs/yoursite.log | wc -l
# 注意区分真假Googlebot
# 真实Googlebot的IP可以通过反向DNS验证
for ip in $(grep -i "Googlebot" /www/wwwlogs/yoursite.log | awk '{print $1}' | sort -u); do
host $ip | grep "googlebot.com" && echo "$ip is REAL" || echo "$ip is FAKE"
done
3. 蜘蛛抓取异常诊断
# 查找百度蜘蛛的404错误
grep -i "Baiduspider" /www/wwwlogs/yoursite.log | awk '$9 == "404"' | \
awk '{print $7}' | sort | uniq -c | sort -rn | head -20
# 查找蜘蛛抓取超时的页面(>5秒)
grep -i "Baiduspider" /www/wwwlogs/yoursite.log | \
awk '$10 > 5 {print $7, $10"秒"}' | sort -k2 -rn | head -20
# 分析蜘蛛抓取的无效页面(应被robots.txt屏蔽)
grep -i "Baiduspider" /www/wwwlogs/yoursite.log | \
awk '$7 ~ /\/wp-admin|\/\?s=|\/feed/' | awk '{print $7}' | sort -u
大量404意味着存在死链,需要及时修复或提交死链文件。蜘蛛抓取超时说明页面渲染慢,需要优化。
三、用户行为分析
1. 流量趋势
# 按天统计PV
awk '{print $4}' /www/wwwlogs/yoursite.log | cut -d: -f1 | sort | uniq -c
# 按小时统计PV(分析流量高峰)
awk -F: '{print $2":00"}' /www/wwwlogs/yoursite.log | sort | uniq -c
# UV统计(独立IP数)
awk '{print $1}' /www/wwwlogs/yoursite.log | sort -u | wc -l
2. 热门页面分析
# 访问量最高的20个页面
awk '{print $7}' /www/wwwlogs/yoursite.log | sort | uniq -c | sort -rn | head -20
# 只统计HTML页面(排除静态资源)
awk '$7 !~ /\.(css|js|jpg|png|gif|ico|woff|svg)/ {print $7}' /www/wwwlogs/yoursite.log | \
sort | uniq -c | sort -rn | head -20
# 入口页面分析(从搜索引擎进来的用户看到的第一页)
awk '$11 ~ /baidu|google|bing|sogou/ {print $7}' /www/wwwlogs/yoursite.log | \
sort | uniq -c | sort -rn | head -20
3. 搜索词分析
# 百度来源的搜索词
awk -F'"' '{print $4}' /www/wwwlogs/yoursite.log | \
grep "baidu.com" | \
sed 's/.*wd=\([^&]*\).*/\1/;s/.*word=\([^&]*\).*/\1/' | \
python3 -c "import sys,urllib.parse;[print(urllib.parse.unquote(line.strip())) for line in sys.stdin]" | \
sort | uniq -c | sort -rn | head -30
四、恶意流量识别与防御
1. 识别恶意爬虫
# 请求量最高的IP Top20
awk '{print $1}' /www/wwwlogs/yoursite.log | sort | uniq -c | sort -rn | head -20
# 单IP每分钟请求超过100次的可疑IP
awk -F: '{ip=$1; minute=$2":"$3; key=ip" "minute; count[key]++} END {for(k in count) if(count[k]>100) print count[k], k}' /www/wwwlogs/yoursite.log | sort -rn
# 扫描型攻击检测(大量404的IP)
awk '$9 == "404" {print $1}' /www/wwwlogs/yoursite.log | sort | uniq -c | sort -rn | head -20
# SQL注入尝试检测
grep -iE "union|select|insert|drop|delete|update.*set|1=1|or.1=1" /www/wwwlogs/yoursite.log | \
awk '{print $1, $7}' | sort -u
2. 自动封禁脚本
#!/bin/bash
# /root/ban_abusers.sh
LOG=/www/wwwlogs/yoursite.log
BANNED=/root/banned_ips.txt
# 封禁1分钟内请求超过200次的IP
for ip in $(awk -F: '{ip=$1; minute=$2":"$3; key=ip" "minute; count[key]++} END {for(k in count) if(count[k]>200) print k}' $LOG | awk '{print $1}' | sort -u); do
if ! grep -q "$ip" $BANNED; then
iptables -I INPUT -s $ip -j DROP
echo "$ip $(date)" >> $BANNED
echo "Banned $ip"
fi
done
五、性能分析
1. 慢请求统计
# 响应时间超过3秒的请求
awk '$10 > 3 {print $7, $10"秒", $9}' /www/wwwlogs/yoursite.log | \
sort -k2 -rn | head -30
# PHP-FPM处理慢的请求
awk '$11 > 2 && $11 != "-" {print $7, "upstream:"$11"秒", "total:"$10"秒"}' /www/wwwlogs/yoursite.log | \
sort -k3 -rn | head -30
# 按URL分组的平均响应时间
awk '{url=$7; time=$10; sum[url]+=time; count[url]++} END {for(u in sum) printf "%s %.3f秒 %d次\n", u, sum[u]/count[u], count[u]}' /www/wwwlogs/yoursite.log | \
sort -k2 -rn | head -20
2. 状态码分布
awk '{print $9}' /www/wwwlogs/yoursite.log | sort | uniq -c | sort -rn
# 正常分布参考:
# 200: 85%-95%
# 301/302: 2%-5%
# 304: 5%-10%
# 404: <3%
# 500: <0.1%
500状态码突然增多说明程序有Bug。404超过5%需要排查死链。304比例高说明缓存策略有效。
六、日志分析工具推荐
1. GoAccess — 实时终端分析
yum install goaccess -y goaccess /www/wwwlogs/yoursite.log -o /www/wwwroot/report.html --log-format=COMBINED --real-time-html
生成实时更新的HTML分析报告,包含流量趋势、访客地理分布、热门页面、状态码分布等。
2. AWStats — 传统日志分析
老牌日志分析工具,生成详细的统计报告。适合不需要实时性、需要深度历史分析的场景。
3. ELK Stack — 企业级方案
Elasticsearch + Logstash + Kibana,日志收集、存储、分析一体化。适合多台服务器、大规模日志分析场景。
4. 百度统计/Google Analytics
JS埋码的统计分析,与服务器日志互补。日志能记录所有请求(包括蜘蛛),统计工具只记录有JS执行的用户访问。
七、自动化日志巡检
#!/bin/bash
# /root/log_check.sh — 每日日志巡检
DATE=$(date -d yesterday +%d/%b/%Y)
LOG=/www/wwwlogs/yoursite.log
REPORT=/root/log_report_$(date +%Y%m%d).txt
echo "=== 日志巡检报告 $(date -d yesterday +%Y-%m-%d) ===" > $REPORT
echo -e "\n[状态码分布]" >> $REPORT
grep "$DATE" $LOG | awk '{print $9}' | sort | uniq -c | sort -rn >> $REPORT
echo -e "\n[百度蜘蛛抓取量]" >> $REPORT
grep "$DATE" $LOG | grep -ic "Baiduspider" >> $REPORT
echo -e "\n[百度蜘蛛404页面]" >> $REPORT
grep "$DATE" $LOG | grep -i "Baiduspider" | awk '$9=="404" {print $7}' | sort -u >> $REPORT
echo -e "\n[慢请求TOP10]" >> $REPORT
grep "$DATE" $LOG | awk '$10>3 {print $7, $10"秒"}' | sort -k2 -rn | head -10 >> $REPORT
echo -e "\n[可疑IP]" >> $REPORT
grep "$DATE" $LOG | awk '{print $1}' | sort | uniq -c | sort -rn | head -10 >> $REPORT
mail -s "Daily Log Report" admin@yoursite.com < $REPORT
八、总结
Nginx日志是一座数据金矿,关键在于你有没有去挖掘。建议每位站长至少掌握基础的awk/grep命令行分析能力,配合GoAccess生成可视化报告。日常重点关注:蜘蛛抓取量和404率、慢请求TOP10、可疑IP和攻击模式。日志分析不是一次性工作,而是持续的运营手段——每天花5分钟看巡检报告,很多问题可以在恶化前被发现和解决。
关注西数资源网,获取更多日志分析、服务器运维和站长资源技术干货!
相关文章
发表评论
评论列表