一、监控进程状态
1. 使用内置监控项
进程数量监控(通过 proc.num):
# 监控所有名为 "nginx" 的进程
proc.num[nginx]
# 监控特定用户的进程
proc.num[nginx,,www-data]
# 监控指定命令参数的进程
proc.num[,,,mysql]
# 监控特定进程ID文件
proc.num[,,,pid,/var/run/nginx.pid]
2. 配置步骤
在 Zabbix Agent 配置文件中添加(zabbix_agentd.conf):
# 启用进程监控
EnableRemoteCommands=1
# 自定义监控项(可选)
UserParameter=process.check[*],ps aux | grep -v grep | grep $1 | wc -l
在 Zabbix Web 界面配置:
创建监控项:
- 名称:Nginx 进程状态
- 键值:
proc.num[nginx]
- 信息类型:数字(无正负)
- 更新间隔:30s
配置触发器:
# 当进程数为0时触发告警
{Template OS Linux:proc.num[nginx].last()}=0
# 进程数超过阈值
{Template OS Linux:proc.num[nginx].min(5m)}>50
二、监控端口状态
1. 使用 net.tcp.listen 监控项
# 监控TCP端口
net.tcp.listen[80]
net.tcp.listen[3306]
# 监控UDP端口
net.udp.listen[53]
# 指定IP地址监控
net.tcp.listen[127.0.0.1,80]
2. 使用自定义脚本监控
创建监控脚本 /etc/zabbix/scripts/check_port.sh:
#!/bin/bash
PORT=$1
TIMEOUT=3
# 检查端口是否监听
nc -z -w $TIMEOUT 127.0.0.1 $PORT > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo 1
else
echo 0
fi
配置 UserParameter:
UserParameter=port.status[*],/etc/zabbix/scripts/check_port.sh $1
3. 使用 ss 或 netstat 命令
UserParameter=tcp.port[*],ss -tln | grep :$1 | wc -l
UserParameter=port.process[*],netstat -tlnp | grep :$1 | awk '{print $7}' | cut -d'/' -f1
三、完整配置示例
1. Agent 端配置
/etc/zabbix/zabbix_agentd.d/process_port.conf:
# 进程监控
UserParameter=service.status[*],systemctl is-active $1
UserParameter=process.count[*],pgrep -c $1
# 端口监控
UserParameter=port.listen[*],netstat -tln | grep ":$1 " | wc -l
UserParameter=port.tcp.status[*],timeout 2 bash -c "echo > /dev/tcp/127.0.0.1/$1" && echo 1 || echo 0
# 获取进程详细信息
UserParameter=process.info[*],ps aux | grep $1 | grep -v grep | head -1
2. 监控模板配置
创建模板包含以下监控项:
进程监控项:
| 名称 | 键值 | 触发器条件 |
|------|------|------------|
| Nginx进程数 | proc.num[nginx] | {last()}=0 |
| MySQL进程状态 | proc.num[mysqld] | {last()}=0 |
| Java应用进程 | proc.num[java] | {max(5m)}>100 |
端口监控项:
| 名称 | 键值 | 触发器条件 |
|------|------|------------|
| SSH端口 | net.tcp.listen[22] | {last()}=0 |
| HTTP端口 | net.tcp.listen[80] | {last()}=0 |
| 数据库端口 | net.tcp.listen[3306] | {last()}=0 |
四、自动发现进程和端口
1. 自动发现监控的进程
创建发现规则:
{
"data": [
{
"{#PROCNAME}": "nginx",
"{#USER}": "www-data"
},
{
"{#PROCNAME}": "mysql",
"{#USER}": "mysql"
}
]
}
2. 端口自动发现脚本
/etc/zabbix/scripts/discover_ports.sh:
#!/bin/bash
echo '{"data":['
# 获取监听端口
netstat -tln | grep 'LISTEN' | awk '{print $4}' | cut -d':' -f2 | sort -nu | while read port
do
echo -n '{"{#PORT}":"'$port'"},'
done | sed 's/,$//'
echo ']}'
对应的 UserParameter:
UserParameter=discover.ports,/etc/zabbix/scripts/discover_ports.sh
五、高级监控配置
1. 进程资源监控
# 监控进程CPU使用率
UserParameter=process.cpu[*],ps aux | grep $1 | grep -v grep | awk '{print $3}' | head -1
# 监控进程内存使用
UserParameter=process.mem[*],ps aux | grep $1 | grep -v grep | awk '{print $4}' | head -1
2. 依赖服务监控
# 监控服务及其依赖端口
UserParameter=service.health[*],/etc/zabbix/scripts/service_health.sh $1
六、测试和验证
1. 手动测试监控项
# 在Agent端测试
zabbix_agentd -t "proc.num[nginx]"
zabbix_agentd -t "net.tcp.listen[80]"
# 从Server端测试
zabbix_get -s 客户端IP -k "proc.num[nginx]"
2. 调试日志
# 在agent配置中开启调试
DebugLevel=4
LogFile=/var/log/zabbix/zabbix_agentd.log
最佳实践建议
权限管理:
- Agent运行用户需要执行权限
- 敏感命令配置sudo权限
性能优化:
- 合理设置更新间隔
- 使用批量监控项
- 避免过于频繁的端口扫描
告警策略:
- 设置合理的告警阈值
- 配置告警恢复通知
- 使用依赖项避免级联告警
安全考虑:
- 限制可监控的进程列表
- 使用白名单机制
- 定期审计监控配置
这样的配置可以实现对进程和端口的全面监控,并能及时发现问题并告警。