SNMP可实现无Agent的Nginx远程监控,通过snmpd的extend机制注册自定义脚本(如采集进程数或stub_status数据),分配私有OID,Zabbix直接读取对应OID数值完成监控。

在没有 Zabbix Agent 或其他本地采集组件的环境中,SNMP 是实现 Nginx 远程监控的可靠方案。它不依赖于 Nginx 主进程的主动暴露接口(如 stub_status),而是通过系统级扩展机制间接获取状态,适合安全受限、Agent 不可部署的场景。
启用 SNMP 服务并预留自定义 OID 空间
SNMP 代理(snmpd)默认只提供标准系统指标,要监控 Nginx,需为其分配未被占用的私有 OID 分支,通常选用 .1.3.6.1.4.1.XXXX 格式(X 为私有企业编号)。操作要点:
- 用
snmpwalk -v2c -c <community> <host> .1.3.6.1.4.1.2021.5000测试目标 OID 是否返回 No Such Object,确认未被占用 - 推荐使用 UCD-SNMP-MIB 的 extend 扩展区(如
.1.3.6.1.4.1.2021.8或自定义高位如.1.3.6.1.4.1.2021.5000),避免与已有 MIB 冲突 - 确保 snmpd 配置中已启用 exec/extend 支持:
agentAddress udp:161和rocommunity <your_community> default
编写轻量脚本采集 Nginx 状态
脚本应输出单一、可解析的数值或字符串,避免多行、空格或非 ASCII 字符。以进程存活为例:
- 保存为
/usr/local/bin/nginx_proc_count.sh,内容为:
#!/bin/bash<br>/usr/bin/pgrep -f "nginx: master process" | wc -l
- 赋予执行权限:
chmod +x /usr/local/bin/nginx_proc_count.sh - 关键细节:必须使用绝对路径调用命令(
/usr/bin/pgrep而非pgrep),因 snmpd 通常以最小环境运行,PATH 极简
注册脚本为 SNMP 扩展项
编辑 /etc/snmp/snmpd.conf,追加一行:
extend .1.3.6.1.4.1.2021.5000 nginx_status /usr/local/bin/nginx_proc_count.sh
重启 snmpd 后,执行 snmpwalk -v2c -c public localhost .1.3.6.1.4.1.2021.5000,应看到类似输出:
UCD-SNMP-MIB::ucdavis.5000.1.0 = INTEGER: 1UCD-SNMP-MIB::ucdavis.5000.2.1.2.12.110.103.105.110.120.95.115.116.97.116.117.115 = STRING: "/usr/local/bin/nginx_proc_count.sh"UCD-SNMP-MIB::ucdavis.5000.3.1.1.12.110.103.105.110.120.95.115.116.97.116.117.115 = STRING: "1"
最后一行即实际采集值(此处为 master 进程数),对应 OID 为 .1.3.6.1.4.1.2021.5000.3.1.1.12.110.103.105.110.120.95.115.116.97.116.117.115,Zabbix 中直接填入该完整 OID 即可。
在 Zabbix 中配置 SNMP 监控项
Zabbix 不需要安装 Agent,只需正确配置主机的 SNMP 接口和监控项:
- 主机【Interfaces】中添加 SNMP 类型,IP 填服务器地址,端口 161,SNMP 版本选 v2c,Community 填与 snmpd.conf 一致的值(如
public) - 链接模板 Template OS Linux SNMP(内置支持 extend OID 解析)或手动创建监控项
- 新建监控项,类型选 SNMPv2 agent,Key 可自定义(如
nginx.process.count),SNMP OID 填上一步获得的完整 OID(如.1.3.6.1.4.1.2021.5000.3.1.1.12.110.103.105.110.120.95.115.116.97.116.117.115) - 数据类型建议设为 Numeric (unsigned),更新间隔按需设为 30s–5m
若需更细粒度指标(如请求计数、连接数),可扩展脚本:例如用 curl -s http://127.0.0.1/nginx_status(需提前启用 ngx_http_stub_status_module)并解析输出;或结合 req_status 模块+自定义脚本提取 JSON 数据。核心逻辑不变:脚本输出 → SNMP 扩展 → Zabbix 采集。


















