shell脚本实时分析nginx错误码,核心是tail -f + awk流式读取、按分钟窗口聚合5xx/4xx状态码,超阈值(如5xx≥5次/分钟、单ip 404≥20次/60秒)即终端高亮、写日志或邮件告警,需以日志用户权限运行并加sleep防cpu飙高。

直接用 Shell 脚本实时分析 Nginx 错误状态码,关键在于“流式读取 + 按时间窗口聚合 + 动态触发判断”,不依赖外部服务,开箱即用。
明确要盯的错误码和统计粒度
不是所有 4xx/5xx 都需告警。先聚焦高频问题:
- 5xx 类(服务端故障):重点监控 500、502、503、504,尤其是每分钟 ≥5 个就值得介入
- 4xx 类(客户端异常):单 IP 在 60 秒内出现 ≥20 个 404,可能为路径爆破或配置错误
-
避免误报:用
awk '{print $9}' access.log | sort | uniq -c | sort -nr | head -10先看历史分布,再定阈值
用 tail -F + awk 实现实时计数
核心是让脚本持续消费新日志行,并在内存中维护滚动窗口计数器:
-
tail -F /var/log/nginx/access.log确保日志轮转后仍能续读(比-f更健壮) -
awk每读一行就提取状态码($9),并用数组按分钟+状态码双维度累计:count[strftime("%H:%M")][$9]++ - 每满一分钟,检查该分钟内各状态码是否超限,满足则打印告警并清空对应分钟数据
轻量告警触发方式
无需接入复杂系统,几行命令就能通知到位:
-
终端高亮输出:
echo -e "\033[1;31m[ALERT] 502 count=12 in 17:25\033[0m" -
写入独立告警日志:
echo "$(date '+%F %T') ERROR 502 x12" >> /var/log/nginx/alert.log -
发邮件或推送:检测到异常后执行
echo "5xx surge" | mail -s "Nginx Alert" admin@example.com或curl -X POST ...
注意权限与稳定性细节
生产环境跑得稳,靠的是这些小但关键的点:
- 脚本需以 nginx 日志所属用户(如
www-data或nginx)运行,否则读不到日志 - 加
sleep 0.1在循环末尾,防止 CPU 占用过高;用set -e确保出错退出 - 日志路径必须写绝对路径,避免因工作目录不同导致读取失败
- 建议配合
nohup ./status_alert.sh &后台运行,并用systemctl封装为服务更可靠











