访问日志不会看?goaccess与awk帮你快速定位异常请求

    发布时间:2026-09-09 09:25 更新时间:2026-09-09 09:25 阅读量:1

    网站运行中难免遇到响应变慢、CPU飙升或某个接口被频繁调用的情况,很多站长第一反应是看监控、查后台,却忽略了服务器访问日志这个“黑匣子”。日志里其实记录着每一次请求的来源、路径和状态码,只要会看,往往能直接找出问题所在。本文不涉及复杂的日志平台搭建,只分享两种上手快、又足够实用的方法:用 goaccess 生成可视化报告,以及用 awk 做轻量级统计,帮你快速发现异常请求与疑似 CC 攻击的迹象。

    先用 goaccess 给访问日志“拍个快照”

    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)本质上是大量高频请求耗尽服务器资源,所以从访问量分布异常入手,是识别它的第一步。

    用 awk 精确统计,定位异常特征

    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 排名,基本能锁定攻击来源。

    识别疑似 CC 迹象后,先做这两步

    当你通过 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