13
10
月
2026
访问日志不只是记录,它是免费的"业务分析工具":能看出谁在攻击你、哪个页面最慢、用户从哪来、哪些资源被疯狂盗链。
这篇讲怎么用命令行分析 Nginx/Apache 日志,挖掘出有用的信息。
日志分析能发现很多你不知道的问题。财富云计算 的云服务器完整记录访问日志;内网服务、游戏服务端可选 NAT 型(无独立公网 IP,价格比带独立 IP 机型省一半以上)。
一、日志格式
Nginx 默认格式(combined)
1.2.3.4 - - [13/Oct/2026:02:50:39 +0800] "GET /index.html HTTP/1.1" 200 1234 "https://google.com" "Mozilla/5.0 ..."字段拆解:
$remote_addr 1.2.3.4 客户端 IP
$remote_user - 认证用户(通常为 -)
$time_local [13/Oct/2026:...] 时间
$request "GET /index.html HTTP/1.1" 请求行
$status 200 状态码
$body_bytes_sent 1234 响应大小
$http_referer "https://google.com" 来源页
$http_user_agent "Mozilla/5.0 ..." 客户端标识推荐加上耗时字段
改 /etc/nginx/nginx.conf:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'rt=$request_time urt=$upstream_response_time';
access_log /var/log/nginx/access.log main;加 rt(总耗时)和 urt(后端耗时)后,能直接分析慢请求。
nginx -t && systemctl reload nginx二、基础统计
1)总请求数
wc -l /var/log/nginx/access.log2)独立 IP 数
awk '{print $1}' access.log | sort -u | wc -l3)PV(页面浏览量)
grep -c "GET" access.log
# 或排除静态资源
grep -vE "\.(jpg|png|css|js|ico|woff)" access.log | wc -l4)UV(独立访客)
awk '{print $1}' access.log | sort -u | wc -l5)某时间段的请求
# 某小时
grep "13/Oct/2026:02:" access.log | wc -l
# 某天
grep "13/Oct/2026" access.log | wc -l
# 最近 100 条
tail -100 access.log三、Top N 分析
1)访问最多的 IP
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -20输出:
15234 1.2.3.4
8321 5.6.7.8
421 9.10.11.12某个 IP 请求量远超其他 → 可能是攻击或爬虫。
2)访问最多的页面
awk '{print $7}' access.log | sort | uniq -c | sort -nr | head -203)访问最多的 URL(去掉参数)
awk '{print $7}' access.log | cut -d'?' -f1 | sort | uniq -c | sort -nr | head -204)来源 Top
awk -F'"' '{print $4}' access.log | sort | uniq -c | sort -nr | head -205)User-Agent Top
awk -F'"' '{print $6}' access.log | sort | uniq -c | sort -nr | head -206)状态码分布
awk '{print $9}' access.log | sort | uniq -c | sort -nr 15234 200
832 404
121 301
45 500404 多说明有死链或有人在扫目录;500 多说明程序有错误。
7)流量最大的资源
awk '{print $7, $10}' access.log | sort -k2 -rn | head -208)总流量
awk '{sum += $10} END {print sum/1024/1024 " MB"}' access.log四、慢请求分析(需要 rt 字段)
假设日志最后是 rt=0.523:
1)找出最慢的 20 个请求
awk '{print $NF, $7}' access.log | sort -rn | head -202)超过 1 秒的请求数
awk -F'rt=' '{print $2}' access.log | awk '$1 > 1' | wc -l3)平均响应时间
awk -F'rt=' '{sum += $2; n++} END {print "平均:", sum/n "s"}' access.log4)慢请求集中在哪些接口
awk -F'rt=' '$2 > 1 {print $0}' access.log | awk '{print $7}' | sort | uniq -c | sort -nr | head这里就能找到需要优化的接口。
五、发现攻击和异常
1)扫描器特征
# 大量 404 的 IP
awk '$9 == 404 {print $1}' access.log | sort | uniq -c | sort -nr | head -202)扫敏感路径
grep -iE "(\.env|\.git|wp-login|xmlrpc|phpmyadmin|admin|\.sql|\.bak|shell\.php)" access.log | head -303)SQL 注入尝试
grep -iE "(union.*select|or 1=1|information_schema|sleep\(|benchmark\()" access.log | head -204)XSS 尝试
grep -iE "(<script|alert\(|onerror=|javascript:)" access.log | head -205)路径穿越
grep "\.\./" access.log | head -206)可疑 UA
grep -iE "(sqlmap|nikto|nmap|masscan|scrapy|wpscan|dirbuster)" access.log | head -207)短时间高频请求(CC)
# 统计当前小时每个 IP 的请求数
grep "$(date +'%d/%b/%Y:%H')" access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -208)盗链检测
# 看图片请求的 referer 分布
grep -E "\.(jpg|png|gif)" access.log | awk -F'"' '{print $4}' | sort | uniq -c | sort -nr | head -20如果发现大量来自陌生站点的引用 → 被盗链了,加防盗链规则。
六、用户行为分析
1)搜索引擎来访
grep -iE "(googlebot|bingbot|baiduspider|sogou|360spider|yandex)" access.log | wc -l看哪个搜索引擎来得多,以及抓取是否正常(404 太多会影响收录)。
grep -i "googlebot" access.log | awk '{print $9}' | sort | uniq -c2)移动端 vs PC
grep -icE "(iphone|android|mobile)" access.log
grep -icE "(windows|macintosh)" access.log3)浏览器分布
awk -F'"' '{print $6}' access.log | grep -oE "(Chrome|Firefox|Safari|Edge|MSIE)" | sort | uniq -c | sort -nr4)入口页面
awk -F'"' '$4 == "-" || $4 == "" {print $2}' access.log | sort | uniq -c | sort -nr | head -205)跳出最多的页面(单页访问)
较复杂,通常需要专门工具。简单近似:某页面被访问但没有后续请求。
七、按天/小时的报表脚本
#!/bin/bash
# /usr/local/bin/log-report.sh
LOG=${1:-/var/log/nginx/access.log}
echo "===== 日志分析报告 ====="
echo "日志文件: $LOG"
echo "生成时间: $(date)"
echo
echo "--- 总量 ---"
echo "总请求数: $(wc -l < $LOG)"
echo "独立 IP: $(awk '{print $1}' $LOG | sort -u | wc -l)"
echo "总流量: $(awk '{s+=$10} END {printf "%.2f MB", s/1048576}' $LOG)"
echo
echo "--- 状态码分布 ---"
awk '{print $9}' $LOG | sort | uniq -c | sort -nr
echo
echo "--- Top 10 IP ---"
awk '{print $1}' $LOG | sort | uniq -c | sort -nr | head -10
echo
echo "--- Top 10 页面 ---"
awk '{print $7}' $LOG | sort | uniq -c | sort -nr | head -10
echo
echo "--- Top 10 来源 ---"
awk -F'"' '{print $4}' $LOG | sort | uniq -c | sort -nr | head -10
echo
echo "--- 404 页面 Top 10 ---"
awk '$9==404 {print $7}' $LOG | sort | uniq -c | sort -nr | head -10
echo
echo "--- 疑似攻击 ---"
echo "扫描敏感路径: $(grep -icE "(\.env|\.git|wp-login|phpmyadmin)" $LOG)"
echo "SQL 注入尝试: $(grep -icE "(union.*select|or 1=1|information_schema)" $LOG)"
echo "XSS 尝试: $(grep -icE "(<script|alert\()" $LOG)"chmod +x /usr/local/bin/log-report.sh
log-report.sh /var/log/nginx/access.log每天自动生成报告:
0 1 * * * /usr/local/bin/log-report.sh > /var/log/daily-report-$(date +\%F).txt 2>&1八、专业工具
命令行够用但不够直观,量大时考虑专业工具:
| 工具 | 特点 |
|---|---|
| GoAccess | 实时终端/HTML 报表,一行命令,轻量(推荐) |
| AWStats | 老牌,功能全 |
| Matomo | 自建的 Google Analytics 替代,功能强 |
| Umami | 现代、轻量、隐私友好 |
| Plausible | 轻量分析 |
| ELK / Loki | 日志集中分析,适合多机 |
GoAccess(最推荐)
apt install goaccess -y
# 终端实时查看
goaccess /var/log/nginx/access.log --log-format=COMBINED
# 生成 HTML 报告
goaccess /var/log/nginx/access.log --log-format=COMBINED \
-o /var/www/html/report.html --real-time-htmlHTML 报告有图表,直观看到趋势、Top 页面、访客分布等。
九、日志保留与分析建议
1)保留多久
| 用途 | 保留期 |
|---|---|
| 故障排查 | 7~30 天 |
| 安全审计 | 90 天以上 |
| 业务分析 | 按需(可单独归档统计结果) |
2)不要只看不分析
建议:
- 每周看一次 Top IP 和 404
- 每月看一次慢请求和流量趋势
- 有异常时立即查(流量突增、5xx 增多)
3)配告警
#!/bin/bash
# 5xx 告警
COUNT=$(tail -1000 /var/log/nginx/access.log | awk '$9 >= 500' | wc -l)
if [ "$COUNT" -gt 50 ]; then
echo "$(date) 5xx 异常: $COUNT" >> /var/log/alert.log
fi十、隐私与合规
日志里有用户 IP,属于个人信息:
- 不要公开分享原始日志
- 按需脱敏(分析时可把 IP 后两段置零)
- 明确保留期限,到期删除
- 只用于安全和运维目的
脱敏示例:
sed 's/\([0-9]\+\.[0-9]\+\.\)\([0-9]\+\.[0-9]\+\)/\10.0/' access.log > anonymized.log十一、速查表
# 访问最多的 IP
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -20
# 访问最多的页面
awk '{print $7}' access.log | sort | uniq -c | sort -nr | head -20
# 状态码分布
awk '{print $9}' access.log | sort | uniq -c | sort -nr
# 404 页面
awk '$9==404 {print $7}' access.log | sort | uniq -c | sort -nr | head
# 某时间段
grep "13/Oct/2026:02:" access.log | wc -l
# 总流量
awk '{s+=$10} END {print s/1048576 " MB"}' access.log
# 慢请求(rt= 字段)
awk '{print $NF, $7}' access.log | sort -rn | head -20
# 攻击特征
grep -iE "(\.env|\.git|wp-login|union.*select|<script)" access.log | head日志是排查和分析的基础,别等出问题才发现没开。财富云计算 的云服务器完整支持日志配置与分析工具安装;内网服务、游戏服务端可选 NAT 型(无独立公网 IP,价格比带独立 IP 机型省一半以上),同样具备完整的日志能力。
相关阅读:
- 《Linux 日志管理与 logrotate 配置》
- 《网站被 CC 攻击怎么办》
- 《服务器被入侵应急排查与处置》
延伸阅读
- 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
- 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
- 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
- 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
- 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
- RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
- 短链接服务搭建:Shlink 自托管,链接数据自己掌握
- 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道

[...]journalctl -k | grep -i "killed process"更复杂的分析(Web 日志安全分析)见Web 日志分析实战。七、常见问题Q:journalctl 输出是二进制乱码?用 journalctl 看,不要 cat /var/log/journal/xxx.journal。想转文本:journalctl -o export > backup.jou[...]
2026-10-13 回复
[...]awk '$9==404 {print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10日志分析方法见Web 日志分析实战。二、第一层:fail2ban 自动封禁扫描和爆破的主力防御,装完即生效:sudo apt-get install fail2ban[...]
2026-10-15 回复
[...]netsh advfirewall firewall add rule name="GameRange" dir=in action=allow protocol=UDP localport=26901-26903完整的 Windows 环境准备(远程桌面连接、运行库安装、SteamCMD 用法、开机自启、8 个常见坑)见:《Windows 云服务器开服通用前置教程》→ htt[...]
2026-10-18 回复