发布时间:2026-09-09 09:25 更新时间:2026-09-09 09:25 阅读量:1
网站运行中难免遇到响应变慢、CPU飙升或某个接口被频繁调用的情况,很多站长第一反应是看监控、查后台,却忽略了服务器访问日志这个“黑匣子”。日志里其实记录着每一次请求的来源、路径和状态码,只要会看,往往能直接找出问题所在。本文不涉及复杂的日志平台搭建,只分享两种上手快、又足够实用的方法:用 goaccess 生成可视化报告,以及用 awk 做轻量级统计,帮你快速发现异常请求与疑似 CC 攻击的迹象。
goaccess 是一款开源的日志分析工具,能够解析 Nginx、Apache 等常见格式的访问日志,并生成交互式终端面板或 HTML 报告。它最大的优点是“一键总览”:请求量、流量来源、状态码分布、访问 IP 排名一目了然,适合第一次排查时快速建立整体印象。
安装 goaccess 很方便,多数 Linux 发行版自带软件源。以 CentOS 为例,可以执行 yum install goaccess;Ubuntu/Debian 使用 apt install goaccess。安装后,先确定你的访问日志路径,常见的有 /var/log/nginx/access.log、/var/log/apache2/access.log。接着直接运行:
goaccess /var/log/nginx/access.log --log-format=COMBINED --real-time-html --port=7890
上面命令中的 --log-format=COMBINED 对应 Nginx 默认的 combined 格式,如果你的日志格式做过修改,可以用 goaccess 的格式配置来适配,具体规则以官方文档为准。--real-time-html 会在 7890 端口启动一个实时页面,浏览器访问 http://你的服务器IP:7890 即可看到动态数据。如果只需要一次性分析,去掉 --real-time-html,直接加 -o 输出为 HTML 文件:
goaccess /var/log/nginx/access.log --log-format=COMBINED -o /usr/share/nginx/html/report.html
打开生成的 report.html,重点看几个栏目:请求最多的 IP、404 状态排行、请求资源 TOP。如果某个 IP 的请求数比第二名高出几个量级,这个 IP 就有较高嫌疑;404 大量集中出现,可能是扫描器在找后台路径或不存在文件。需要提醒的是,CC 攻击(Challenge Collapsar)本质上是大量高频请求耗尽服务器资源,所以从访问量分布异常入手,是识别它的第一步。
goaccess 适合看面,但当你知道“某个时段有问题”或想按特定模式筛选时,awk 这种命令行工具更灵活。Nginx 默认的日志每行包含客户端 IP、时间、请求方法、路径和状态码等字段,常见 combined 格式用空格分隔,IP 是第 1 个字段,状态码是第 9 个字段。用 awk 就能提取出你关心的列。
比如,统计访问量前 10 的 IP:
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
再比如,找出产生 404 的 IP 与请求路径,排除正常 404 页面:
awk '$9 == 404 {print $1, $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20
上面的命令中,$1 是客户端 IP,$7 是请求路径,$9 是状态码。如果你使用的日志格式不是默认 combined,字段位置会变化,可以用 head -1 access.log 先查看表头,再适当调整 $ 后面的数字。这段命令会列出“哪些 IP 在什么路径上产生 404”,如果某个 IP 反复访问不存在的 php 或 asp 文件,基本可以认定为扫描行为。
另一个常见特征是请求频次突增。先按分钟统计请求量,用如下方式:
awk '{print $4}' /var/log/nginx/access.log | cut -d: -f1-2 | uniq -c
其中 $4 是形如 [26/Sep/2026:14:35:23 的字段,cut -d: -f1-2 可以截取到“日期 小时:分钟”。如果某个分钟的请求量突然成倍增长,再结合上面的 IP 排名,基本能锁定攻击来源。
当你通过 goaccess 或 awk 发现一批异常 IP 后,不要急着封禁,先确认这些请求是不是你主动发起或来自内部安全扫描器。如果排除了误伤,建议按照下面两步处理。
第一步,用防火墙或 Web 服务器自身做限制。若你用的是 Nginx,可以在配置里针对单个 IP 设置并发连接数限制:
http {
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
server {
location / {
limit_conn conn_limit 20;
limit_req zone=req_limit burst=20;
}
}
}
这里的 rate=10r/s 表示每个 IP 每秒平均处理 10 个请求,burst=20 表示最多允许排队 20 个突发请求。具体参数需要根据你的网站实际流量调整,设置过小可能影响正常用户。
第二步,将高风险的 IP 加入黑名单或让 CDN 拦截。如果你使用了云盾、高防等产品,可以直接在控制台设置 IP 黑名单。如果是自建服务器,可以简单用 systemctl 操作 iptables(需以实际系统为准),例如临时拒绝某个 IP:
iptables -A INPUT -s 1.2.3.4 -j DROP
注意,iptables 规则重启后会失效,如果要持久化需要额外保存操作。同时,不要一次性封禁大批 IP,避免误伤电信或移动出口 IP,导致正常用户无法访问。
最后想说的是,日志分析不是一次性的工作,建议每隔一段时间定期跑一遍上述命令,把历史数据保存下来做对比。一旦发现请求模式明显偏离“日常”,再回到日志里细查。goaccess 适合做定期快照报告,awk 适合深入钻取,两者配合能帮你在没有专职运维的情况下,也能守住网站平稳运行的第一道防线。如果你还未开始记录 access 日志,请先确认 Nginx/Apache 的访问日志已开启,毕竟没有数据,任何分析都是空谈。
| 📑 | 📅 |
|---|---|
| Nginx伪静态规则从零配置:WordPress与ThinkPHP的rewrite写法详解 | 2026-09-09 |
| WordPress搬家进阶:用WP-CLI替换数据库不损害序列化数据 | 2026-09-09 |
| 网站搬家实战指南:换服务器时网站文件与数据库如何安全完整迁移 | 2026-09-07 |
| 网站全站启用HTTPS的完整路线:免费证书申请、自动续期与强制加密配置 | 2026-09-07 |
| 网站ICP备案不再一头雾水:材料清单、办理流程与常见驳回原因全梳理 | 2026-09-07 |
| WordPress被挂马后的排查与清理:从文件到数据库的完整路径 | 2026-09-10 |
| 带宽跑满找元凶:iftop、nethogs与tcpdump排查详解 | 2026-09-10 |
| 自建网站状态监控:Uptime Kuma部署与告警配置 | 2026-09-10 |
| MySQL慢查询日志开启与参数分析:用mysqldumpslow定位拖慢网站的SQL | 2026-09-10 |
| Nginx 502/504 排查:从错误日志到PHP-FPM进程池状态 | 2026-09-10 |