Zabbix监控本地服务:基于Agent2自定义脚本实现端口与HTTP健康检查
1. 项目概述为本地服务构建轻量级监控在运维和开发工作中我们经常会遇到一类特殊的服务它们只监听在本地回环地址如127.0.0.1或localhost上不对外部网络暴露端口。这类服务可能是某个应用的内部管理接口、一个本地代理网关或者像 OpenClaw 这样的内部数据处理组件。传统的监控方案比如 Zabbix 自带的 HTTP 监控项通常运行在 Zabbix Server 或 Proxy 上它们无法直接访问目标主机上的127.0.0.1地址这就形成了一个监控盲区。今天要分享的就是针对这类“本地服务”量身打造的一套 Zabbix 监控方案。它基于 Zabbix agent2通过自定义脚本和用户参数UserParameter实现了对服务端口状态、HTTP 健康状态以及响应延迟的全面监控。这套方案的核心思想是“让监控逻辑在数据源头上执行”即由部署在被监控主机上的 agent 主动收集数据并上报完美解决了服务器端无法直连本地服务的问题。整个方案设计得非常轻量、便携几乎不增加主机的额外负担模板化配置也使得批量部署和维护变得异常简单。无论你是运维工程师需要确保内部网关的稳定性还是开发者想为自己的本地服务添加一个“健康看板”这套方案都能提供一个清晰、可靠的实现路径。2. 监控方案的核心设计思路2.1 问题定义为什么标准 HTTP 监控项会失效在深入配置细节之前我们必须先理解问题的根源。Zabbix 的监控数据采集主要有两种模式被动检查和主动检查。对于 HTTP、ICMP Ping 这类网络检查Zabbix 通常提供内置的监控项类型例如 “HTTP 代理” 监控项。然而这些内置监控项有一个关键限制它们的执行地点是 Zabbix Server 或配置的 Zabbix Proxy。这意味着当你在 Zabbix Web 界面上创建一个 HTTP 监控项来检查http://127.0.0.1:18789/health时实际发出 HTTP 请求的是远端的 Zabbix Server而不是目标主机本身。从网络角度看Zabbix Server 试图访问目标主机的127.0.0.1这等同于访问它自己本机的回环地址显然无法到达真正运行 OpenClaw 服务的那台机器。即使服务监听了主机的实际 IP 地址出于安全考虑我们通常也不希望将内部健康检查端口暴露给整个监控网络。因此标准方案在此场景下是行不通的。我们需要一个能在被监控主机本地执行检查的机制。2.2 解决方案基于 Zabbix Agent2 的本地化检查Zabbix Agent2 的强大之处在于其灵活的可扩展性。它支持通过UserParameter功能自定义监控项。UserParameter 允许我们在 agent 的配置文件中定义一条规则当 Zabbix Server 请求某个特定的监控项键值时agent 会执行一个本地脚本或命令并将执行结果返回给 Server。我们的方案正是基于此构建数据采集本地化在运行 OpenClaw 的主机上部署两个 Shell 脚本。一个用于检查 HTTP 端点是否返回 200 OK另一个用于测量该请求的响应延迟。Agent 作为执行器通过 UserParameter 配置将自定义的监控项键值如openclaw.http.health与对应的本地脚本绑定。Server 负责调度与告警Zabbix Server 像请求其他监控项一样定期向 agent 请求这些自定义键值的数据。Server 只关心结果不关心采集过程从而实现了对本地服务的透明监控。这种架构不仅解决了网络可达性问题还带来了额外优势安全性健康检查端口无需对外暴露减少了攻击面。准确性延迟测量是在服务运行的同一台主机上进行的避免了网络抖动带来的误差更能真实反映服务本身的性能。低开销检查脚本非常轻量对主机资源消耗极小。2.3 监控指标设计我们主要关注三个核心指标它们构成了服务可用性的基本判断监控指标采集方式执行位置说明TCP 端口监听状态Zabbix Agent2 内置键值net.tcp.listen[]主机本地 Agent最基础的检查确认服务进程是否启动并绑定了指定端口。HTTP 健康状态自定义脚本openclaw_http_check.sh主机本地 Agent通过发起 HTTP GET 请求到健康端点判断应用逻辑是否正常。HTTP 响应延迟自定义脚本openclaw_http_latency_ms.sh主机本地 Agent测量从发起 HTTP 请求到收到完整响应的毫秒数反映服务处理速度。这三个指标层层递进端口存在只表示进程在运行HTTP 返回 200 OK表示服务能正常处理请求而延迟则在正常的基础上进一步衡量了服务的性能表现。任何一个指标异常都意味着服务出现了不同级别的问题。3. 实施前的准备工作与环境配置3.1 环境与工具清单在开始动手之前请确保你已具备以下环境。这套方案具有普适性只要满足基本条件在任何 Linux 发行版上都可以运行。被监控主机运行 OpenClaw 网关服务或其他需要监控的本地 HTTP 服务。已安装并运行Zabbix Agent2建议版本 5.0 或以上。你可以通过zabbix_agent2 -V命令查看版本。具备curl命令行工具用于脚本中的 HTTP 检查。具备bash环境。拥有 root 或 sudo 权限用于创建脚本和修改 agent 配置。Zabbix Server一个正常运行的 Zabbix Server版本 5.0 或以上与 Agent2 兼容。拥有导入模板、创建主机和配置监控项的权限。注意请确保 Zabbix Agent2 的Server或ServerActive参数已正确指向你的 Zabbix Server 地址并且防火墙规则允许 agent10050端口与 server 通信。这是数据能否上报的前提。3.2 理解默认配置与可定制性项目提供了一套开箱即用的默认配置但优秀的监控方案必须易于适配不同环境。以下是核心参数的默认值及其含义{$OPENCLOW_HOST}:127.0.0.1作用指定 HTTP 检查的目标主机。由于是本地检查通常就是127.0.0.1或localhost。如果你的服务监听了其他本地 IP如192.168.1.100可以修改此宏。{$OPENCLOW_PORT}:18789作用OpenClaw 网关服务的监听端口。{$OPENCLOW_HEALTH_PATH}:/health作用健康检查接口的 URL 路径。完整的健康检查 URL 将由这些宏自动拼接而成http://{$OPENCLOW_HOST}:{$OPENCLOW_PORT}{$OPENCLOW_HEALTH_PATH}。{$OPENCLOW_LATENCY_WARN_MS}:500作用HTTP 延迟的警告阈值单位毫秒。当延迟超过此值时监控项将触发警告状态。为什么使用宏在 Zabbix 模板中使用宏Macro而非硬编码值是提升模板复用性的关键。当我们将模板链接到不同的主机时可以为每台主机单独覆盖这些宏的值。例如主机 A 的 OpenClaw 运行在 18789 端口而主机 B 可能运行在 28789 端口。通过宏我们无需创建两个模板只需在主机层面修改{$OPENCLOW_PORT}的值即可。4. Zabbix 模板导入与配置详解4.1 获取并导入监控模板首先你需要获取项目提供的监控模板文件Template_OpenClaw_Gateway.yaml。这是一个 YAML 格式的模板文件包含了所有预定义的监控项、触发器、图形和仪表盘。在 Zabbix Web 前端进行导入登录到 Zabbix Server 的 Web 管理界面。导航至【配置】 - 【模板】。点击右上角的【导入】按钮。在导入页面点击【选择文件】上传你下载的Template_OpenClaw_Gateway.yaml文件。Zabbix 会自动解析文件内容。确认导入规则通常保持默认即可然后点击【导入】。导入成功后你可以在模板列表中找到名为“Template OpenClaw Gateway”的新模板。点击进入可以查看其详情。4.2 模板核心组件解析导入的模板不是一个黑盒理解其内部构造有助于后续的排错和自定义。让我们拆解一下它的核心部分监控项ItemsOpenClaw: Port listening on {$OPENCLOW_PORT}键值为net.tcp.listen[{$OPENCLOW_PORT}]直接使用 agent 内置键值检查端口。OpenClaw: HTTP health check键值为openclaw.http.health[http://{$OPENCLOW_HOST}:{$OPENCLOW_PORT}{$OPENCLOW_HEALTH_PATH}]调用我们即将部署的自定义脚本。OpenClaw: HTTP response time键值为openclaw.http.latency_ms[http://{$OPENCLOW_HOST}:{$OPENCLOW_PORT}{$OPENCLOW_HEALTH_PATH}]调用另一个自定义脚本测量延迟。这些监控项的数据更新间隔、历史数据存储周期等都已在模板中预设好。触发器Triggers模板预置了针对异常状态的触发器。例如“OpenClaw: Gateway port is down”当端口监听监控项返回 0端口未监听时触发问题。“OpenClaw: HTTP health check failed”当健康检查脚本返回非 1 值时触发问题。“OpenClaw: HTTP response time is too high”当延迟监控项的值超过{$OPENCLOW_LATENCY_WARN_MS}宏定义的阈值时触发警告。触发器的严重性灾难、严重、警告等也已设定你可以根据自身告警体系调整。图形Graphs与仪表盘Dashboards模板可能包含了将上述监控项数据可视化的图形方便在【监测】-【主机】页面查看趋势。还可能自动创建一个聚合仪表盘将多台主机的 OpenClaw 状态集中展示。4.3 将模板关联到主机模板本身不会产生数据它需要被应用到具体的主机上。进入【配置】 - 【主机】找到运行 OpenClaw 的那台主机。点击主机名称进入详情页切换到【模板】标签页。在 “链接新模板” 的输入框中搜索并选择“Template OpenClaw Gateway”。点击【添加】然后别忘了点击页面底部的【更新】按钮保存更改。链接后该主机将继承模板中的所有监控项、触发器等配置。接下来我们需要去主机上配置 agent让这些监控项“活”起来。5. Agent 端配置与脚本部署这是整个方案的核心实操部分所有操作都在被监控主机上执行。5.1 创建自定义用户参数UserParameterZabbix Agent2 的配置文件通常位于/etc/zabbix/zabbix_agent2.conf。为了保持配置的清晰和易于管理我们习惯将自定义的 UserParameter 放在独立的conf.d目录下。创建配置文件sudo vim /etc/zabbix/zabbix_agent2.d/openclaw.conf将以下内容写入该文件# OpenClaw Gateway Custom Monitoring UserParameteropenclaw.http.health[*],/etc/zabbix/scripts/openclaw_http_check.sh $1 UserParameteropenclaw.http.latency_ms[*],/etc/zabbix/scripts/openclaw_http_latency_ms.sh $1UserParameter这是固定的关键字。openclaw.http.health[*]这是我们定义的监控项键值。[*]表示这个键值可以接受参数。在模板中我们调用时传入了完整的 URL。/etc/zabbix/scripts/openclaw_http_check.sh $1这是 agent 收到该键值请求时要执行的命令。$1会被替换成调用时传入的第一个参数即我们的 URL。保存并退出编辑器。实操心得conf.d目录下的.conf文件会在 agent 启动时被自动包含。这种方式比直接修改主配置文件更安全升级 agent 时也不会被覆盖。确保文件权限正确如644通常属主是root:zabbix。5.2 部署监控脚本现在我们需要创建脚本文件并赋予其执行权限。脚本的逻辑很简单但健壮性很重要。创建脚本存放目录如果不存在sudo mkdir -p /etc/zabbix/scripts创建健康检查脚本/etc/zabbix/scripts/openclaw_http_check.sh#!/bin/bash # Script to check OpenClaw HTTP health endpoint. # Returns 1 if HTTP 200 OK, 0 otherwise. # Usage: openclaw_http_check.sh url URL$1 if [[ -z $URL ]]; then echo Usage: $0 url exit 1 fi # Use curl with timeout, follow redirects (-L), silent mode (-s), # output only HTTP status code (-o /dev/null -w %{http_code}) HTTP_CODE$(curl -L -s -o /dev/null -w %{http_code} --max-time 10 $URL 2/dev/null) # Check if curl succeeded and returned 200 if [[ $HTTP_CODE -eq 200 ]]; then echo 1 exit 0 else echo 0 exit 0 fi创建延迟测量脚本/etc/zabbix/scripts/openclaw_http_latency_ms.sh#!/bin/bash # Script to measure OpenClaw HTTP response latency in milliseconds. # Returns the total time in ms, or 0 on failure. # Usage: openclaw_http_latency_ms.sh url URL$1 if [[ -z $URL ]]; then echo Usage: $0 url exit 1 fi # Use curls time_total metric, which includes all phases (DNS, connect, transfer, etc.) # Format is floating-point seconds. We convert to integer milliseconds. # -w %{time_total} outputs the time. # 21 captures both stdout and stderr, grep extracts the time. TIME_SECONDS$(curl -L -s -o /dev/null -w %{time_total} --max-time 10 $URL 21 | grep -E ^[0-9]\.?[0-9]*$) # Check if we got a valid number if [[ -n $TIME_SECONDS ]]; then # Convert seconds to milliseconds and round to integer TIME_MS$(echo $TIME_SECONDS * 1000 / 1 | bc 2/dev/null || echo 0) echo ${TIME_MS:-0} else echo 0 fi exit 0设置正确的权限和所有权sudo chown root:zabbix /etc/zabbix/scripts/openclaw_http_*.sh sudo chmod 0755 /etc/zabbix/scripts/openclaw_http_*.shchown root:zabbix将文件所有者设为 root所属组设为 zabbix。Zabbix agent 进程通常以zabbix用户运行这允许该用户执行脚本。chmod 0755赋予所有者读写执行组和其他用户读执行的权限。重启 Zabbix Agent2 以加载新配置sudo systemctl restart zabbix-agent2使用sudo systemctl status zabbix-agent2检查服务状态确保重启成功。5.3 本地验证确保一切就绪在 Zabbix Server 开始拉取数据前强烈建议在本地手动测试这能快速定位是脚本问题、配置问题还是网络问题。在监控主机上执行以下命令测试端口监听使用内置键值zabbix_agent2 -t net.tcp.listen[18789]预期输出net.tcp.listen[18789] [t|1]。这里的1表示端口处于监听状态。如果是0则说明 OpenClaw 服务未启动或端口不对。测试自定义健康检查项zabbix_agent2 -t openclaw.http.health[http://127.0.0.1:18789/health]预期输出类似openclaw.http.health[http://127.0.0.1:18789/health] [s|1]。[s|1]表示返回类型为字符串或整数值为1。如果返回0请检查脚本路径、权限以及curl命令是否能正常访问该 URL。测试自定义延迟检查项zabbix_agent2 -t openclaw.http.latency_ms[http://127.0.0.1:18789/health]预期输出类似openclaw.http.latency_ms[http://127.0.0.1:18789/health] [s|12]。12表示本次请求耗时约 12 毫秒。这个值会因系统负载而变化。重要提示zabbix_agent2 -t命令是极其强大的调试工具。如果这里测试失败Zabbix Server 端也绝对无法获取到数据。务必确保所有测试命令都返回预期的、非错误的结果。6. 在 Zabbix Server 端进行最终校验当 Agent 端配置无误后数据就会开始上报到 Zabbix Server。我们需要在 Web 界面上进行最终确认。检查最新数据进入【监测】 - 【最新数据】。在过滤器中选择你配置好的主机或者直接搜索监控项关键字如openclaw。点击【应用】。你应该能看到名为 “OpenClaw: HTTP health check”、“OpenClaw: HTTP response time” 和 “OpenClaw: Port listening” 的监控项并且它们都有最近的时间戳和数值。如果状态列显示“不支持”通常意味着 Agent 端测试失败请返回上一步进行本地验证。验证触发器状态进入【监测】 - 【问题】。正常情况下不应该看到与 OpenClaw 相关的任何问题除非你故意停止服务进行测试。你可以尝试手动停止 OpenClaw 服务等待一个监控周期如 1 分钟观察是否正确地触发了“端口 down”和“健康检查失败”的告警。恢复服务后问题应自动变为“已解决”。调整宏值可选如果你某台主机的 OpenClaw 端口不是18789或者延迟阈值需要调整无需修改模板。进入【配置】 - 【主机】找到该主机在【宏】标签页下你可以覆盖模板中定义的宏。例如添加一个宏名称为{$OPENCLOW_PORT}值为28789。这样这台主机上的所有相关监控项都会自动使用新端口。7. 常见问题排查与实战技巧即使按照步骤操作也可能会遇到一些问题。这里汇总了一些常见坑点及其解决方法。7.1 问题排查清单现象可能原因排查步骤最新数据中显示“不支持”1. Agent 配置未生效。2. 脚本执行失败。3. 防火墙/网络问题。1. 在主机上执行sudo systemctl status zabbix-agent2确认服务运行正常。2. 使用zabbix_agent2 -t命令本地测试见5.3节这是最直接的诊断方法。3. 检查脚本路径、权限是否正确。尝试以zabbix用户身份手动运行脚本sudo -u zabbix /etc/zabbix/scripts/openclaw_http_check.sh http://127.0.0.1:18789/health。健康检查始终返回01. OpenClaw 服务未运行或端口错误。2. 健康端点路径 (/health) 不正确。3.curl命令超时或出错。1. 使用netstat -tlnp | grep :18789确认服务监听状态。2. 直接用curl -v http://127.0.0.1:18789/health测试观察详细输出和 HTTP 状态码。3. 检查脚本中的curl参数特别是--max-time超时时间对于慢的服务可以适当调大。延迟数值异常高或为01. 服务响应慢或网络有阻塞高延迟。2.curl测量失败脚本返回了0。3.bc命令未安装导致计算失败。1. 多次手动执行延迟脚本看是持续高还是偶发。结合系统负载判断。2. 检查脚本中grep提取时间是否准确。可以临时在脚本中echo调试信息。3. 运行which bc确认bc计算器已安装。如果未安装可以修改脚本用awk或其他方式进行浮点数计算。Zabbix Server 报错“Cannot connect to [host]”1. Agent 主机防火墙阻止了10050端口。2. Agent 配置中Server或ServerActive地址错误。3. 主机名或IP在Zabbix中配置错误。1. 从 Zabbix Server 使用telnet agent_ip 10050测试端口连通性。2. 检查 Agent 配置文件/etc/zabbix/zabbix_agent2.conf中的Server参数。3. 确认 Zabbix Web 中主机配置的“连接方式”DNS名称或IP与 Agent 端Hostname参数是否匹配。7.2 实战技巧与进阶建议脚本健壮性增强在生产环境中建议在脚本中添加更完善的日志记录记录检查失败的原因如连接拒绝、超时、非200状态码等重定向到特定日志文件便于后期审计。考虑在脚本开头设置set -euo pipefail使脚本在遇到未定义变量或命令失败时立即退出避免返回误导性的成功状态。监控项频率与超时设置模板中的监控项更新间隔是预设的。对于健康检查30秒或1分钟一次是常见频率。延迟检查可以稍长如1-2分钟一次。确保脚本中的curl --max-time参数和 Zabbix 监控项中的“超时”设置协调。脚本超时应小于监控项超时例如脚本超时10秒监控项超时设置为15秒。安全考虑脚本以zabbix用户权限运行。确保该用户没有不必要的特权并且脚本目录 (/etc/zabbix/scripts) 的权限严格控制防止恶意篡改。如果健康端点涉及敏感信息确保其访问权限受到控制。虽然它只在本地访问但仍需遵循最小权限原则。方案扩展这套模式不仅适用于 OpenClaw任何监听在本地、需要通过 HTTP/HTTPS 进行健康检查的服务都可以套用。你只需要修改脚本中的逻辑比如检查返回的 JSON 内容和模板中的宏定义。除了 HTTP对于其他本地服务如数据库、消息队列你也可以编写相应的检查脚本并通过 UserParameter 集成到 Zabbix 中构建统一的本地服务监控体系。