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

2)独立 IP 数

awk '{print $1}' access.log | sort -u | wc -l

3)PV(页面浏览量)

grep -c "GET" access.log
# 或排除静态资源
grep -vE "\.(jpg|png|css|js|ico|woff)" access.log | wc -l

4)UV(独立访客)

awk '{print $1}' access.log | sort -u | wc -l

5)某时间段的请求

# 某小时
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 -20

3)访问最多的 URL(去掉参数)

awk '{print $7}' access.log | cut -d'?' -f1 | sort | uniq -c | sort -nr | head -20

4)来源 Top

awk -F'"' '{print $4}' access.log | sort | uniq -c | sort -nr | head -20

5)User-Agent Top

awk -F'"' '{print $6}' access.log | sort | uniq -c | sort -nr | head -20

6)状态码分布

awk '{print $9}' access.log | sort | uniq -c | sort -nr
  15234 200
    832 404
    121 301
     45 500

404 多说明有死链或有人在扫目录;500 多说明程序有错误。

7)流量最大的资源

awk '{print $7, $10}' access.log | sort -k2 -rn | head -20

8)总流量

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 -20

2)超过 1 秒的请求数

awk -F'rt=' '{print $2}' access.log | awk '$1 > 1' | wc -l

3)平均响应时间

awk -F'rt=' '{sum += $2; n++} END {print "平均:", sum/n "s"}' access.log

4)慢请求集中在哪些接口

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 -20

2)扫敏感路径

grep -iE "(\.env|\.git|wp-login|xmlrpc|phpmyadmin|admin|\.sql|\.bak|shell\.php)" access.log | head -30

3)SQL 注入尝试

grep -iE "(union.*select|or 1=1|information_schema|sleep\(|benchmark\()" access.log | head -20

4)XSS 尝试

grep -iE "(<script|alert\(|onerror=|javascript:)" access.log | head -20

5)路径穿越

grep "\.\./" access.log | head -20

6)可疑 UA

grep -iE "(sqlmap|nikto|nmap|masscan|scrapy|wpscan|dirbuster)" access.log | head -20

7)短时间高频请求(CC)

# 统计当前小时每个 IP 的请求数
grep "$(date +'%d/%b/%Y:%H')" access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -20

8)盗链检测

# 看图片请求的 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 -c

2)移动端 vs PC

grep -icE "(iphone|android|mobile)" access.log
grep -icE "(windows|macintosh)" access.log

3)浏览器分布

awk -F'"' '{print $6}' access.log | grep -oE "(Chrome|Firefox|Safari|Edge|MSIE)" | sort | uniq -c | sort -nr

4)入口页面

awk -F'"' '$4 == "-" || $4 == "" {print $2}' access.log | sort | uniq -c | sort -nr | head -20

5)跳出最多的页面(单页访问)

较复杂,通常需要专门工具。简单近似:某页面被访问但没有后续请求。


七、按天/小时的报表脚本

#!/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-html

HTML 报告有图表,直观看到趋势、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 攻击怎么办》
  • 《服务器被入侵应急排查与处置》
延伸阅读
  1. 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
  2. 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
  3. 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
  4. 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
  5. 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
  6. RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
  7. 短链接服务搭建:Shlink 自托管,链接数据自己掌握
  8. 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道
更多阅读
  1. 上一篇:服务器安全基线检查清单:上线前必做的 30 项
  2. 下一篇:DDoS 攻击基础认知与防护:带宽被打满时该怎么应对
发表评论 3

取消回复