要让Nginx被Zabbix真正监控,需打通状态暴露、数据采集、指标建模、异常识别、精准触达五环节;全程基于Zabbix原生能力与标准Linux工具,无需外部插件。

要让 Nginx 真正被 Zabbix “看得见、管得住、告得准”,关键不在装几个模板,而在于打通“状态暴露→数据采集→指标建模→异常识别→精准触达”这五个环节。整个过程不依赖外部插件,全部基于 Zabbix 原生能力+标准 Linux 工具即可落地。
一、Nginx 端:安全暴露基础状态接口
Nginx 自带 ngx_http_stub_status_module,但默认不启用,也不开放访问。必须手动配置并严格限制来源:
- 编辑
/usr/local/nginx/conf/nginx.conf(或发行版路径如/etc/nginx/nginx.conf),在 server 块内添加:
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
allow ::1;
deny all;
}注意:不要用 /status 这类通用路径,避免与业务冲突;生产环境建议绑定专用监听端口(如 listen 127.0.0.1:8080),进一步隔离。
验证是否生效:curl -s http://127.0.0.1/nginx_status 应返回类似:
Active connections: 5 server accepts handled requests 12345 12345 98765 Reading: 0 Writing: 1 Waiting: 4
若报 403 或 404,检查 Nginx 是否重载(nginx -s reload)、模块是否编译进内核(nginx -V 2>&1 | grep stub_status)。
二、Zabbix Agent 端:轻量脚本统一采集指标
Zabbix 不自带 Nginx 监控项,需通过自定义 UserParameter 调用 Shell 脚本提取字段。推荐一个脚本覆盖全部核心指标:
- 新建脚本
/etc/zabbix/zabbix_agentd.d/nginx_status.sh,内容如下:
#!/bin/bash
URL="http://127.0.0.1/nginx_status"
case $1 in
active) curl -s "$URL" 2>/dev/null | awk '/Active/ {print $3}' ;;
accepts) curl -s "$URL" 2>/dev/null | awk 'NR==3 {print $1}' ;;
handled) curl -s "$URL" 2>/dev/null | awk 'NR==3 {print $2}' ;;
requests) curl -s "$URL" 2>/dev/null | awk 'NR==3 {print $3}' ;;
reading) curl -s "$URL" 2>/dev/null | awk '/Reading/ {print $2}' ;;
writing) curl -s "$URL" 2>/dev/null | awk '/Writing/ {print $4}' ;;
waiting) curl -s "$URL" 2>/dev/null | awk '/Waiting/ {print $6}' ;;
*) echo "usage: $0 {active|accepts|handled|requests|reading|writing|waiting}" ;;
esac- 赋予执行权限:
chmod +x /etc/zabbix/zabbix_agentd.d/nginx_status.sh - 注册为 UserParameter,在
/etc/zabbix/zabbix_agentd.d/userparameter_nginx.conf中写入:
UserParameter=nginx.status[*],/etc/zabbix/zabbix_agentd.d/nginx_status.sh "$1"
- 重启 agent:
systemctl restart zabbix-agent - 服务端测试采集:
zabbix_get -s 192.168.2.58 -k "nginx.status[active]"(替换为实际 agent IP)
三、Zabbix Server 端:模板化配置与图形化呈现
避免为每台 Nginx 主机重复添加监控项,应封装为可复用模板:
- 进入 Web 界面 → 配置 → 模板 → 创建模板,名称如
Template App Nginx Custom - 添加监控项,键值示例:
名称:Nginx active connections 键值:nginx.status[active] 更新间隔:30s 应用集:Nginx Status 名称:Nginx total requests 键值:nginx.status[requests] 更新间隔:60s 应用集:Nginx Stats
- 创建图形,将
active、reading、writing、waiting四项合并为一张连接状态趋势图 - 将该模板链接到所有 Nginx 主机(配置 → 主机 → 对应主机 → 模板 → 添加)
字体乱码?替换 /usr/share/zabbix/fonts/graphfont.ttf 为 simkai.ttf 并重建软链接即可。
四、触发器与告警:从“有数据”到“会判断”
监控不是堆指标,而是定义“什么算出问题”。以连接数为例:
- 触发器表达式(非简单阈值):
{Template App Nginx Custom:nginx.status[active].last()} > 1000
&&
{Template App Nginx Custom:nginx.status[active].avg(5m)} > 800含义:当前活跃连接超 1000 且过去 5 分钟均值持续高于 800,排除瞬时毛刺。
- 更实用的组合判断(防误报):
{Template App Nginx Custom:nginx.status[active].last()} > 1500
&&
{Template App Nginx Custom:nginx.status[waiting].last()} 100说明:高连接 + 低等待 + 高 writing → 极可能是后端响应慢导致连接积压,值得立即介入。
- 动作配置中,关联该触发器,设置恢复通知、告警升级(如 5 分钟未恢复发短信)、告警抑制(避免同一故障反复刷屏)
五、微信告警:零开发对接企业微信机器人
不用写复杂脚本,利用企业微信「群机器人」Webhook 即可快速上线:
- 在企业微信后台创建群机器人,获取 Webhook 地址(形如
https://qyapi.weixin.qq.com/...&key=xxx) - 将推送脚本放在
/usr/lib/zabbix/alertscripts/wechat.sh:
#!/bin/bash
WECHAT_URL="https://qyapi.weixin.qq.com/...&key=xxx"
ALERT_MSG=$(echo "$3" | sed 's/\n/
/g')
curl -X POST "$WECHAT_URL"
-H 'Content-Type: application/json'
-d "{"msgtype": "text", "text": {"content": "【Zabbix告警】
主机:$1
触发器:$2
详情:$ALERT_MSG"}}" > /dev/null 2>&1- 配置告警媒介类型为“脚本”,脚本名填
wechat.sh,参数依次为{ALERT.SENDTO}、{ALERT.SUBJECT}、{ALERT.MESSAGE} - 给运维用户分配该媒介,并在动作中启用
测试时关停 Nginx,确认微信收到结构清晰、含主机名和触发器名的告警消息——这才是真正可用的告警。











