Apache的mod_watchdog不支持监控任意进程,仅管理模块注册的内部任务;替代方案是用mod_proxy_hcheck检测健康端点,或用systemd托管进程并配合mod_status监控。

mod_watchdog 本身不支持进程存活监控
Apache 的 mod_watchdog 并非设计用于监控任意子进程(比如你自定义的守护进程、Python 后台任务等)的存活状态。它只负责管理 Apache 自身模块注册的“watchdog tasks”——即由其他模块(如 mod_proxy_hcheck、mod_slotmem_shm 相关组件)显式注册的周期性回调任务,底层依赖 Apache 的定时器调度机制(ap_run_timer),和系统级进程树无关。
常见误解是以为配置个 WatchdogProcess 就能盯住 /usr/bin/my-worker,实际会直接报错或静默忽略。
真正可行的替代方案:用 mod_proxy_hcheck + 自建健康端点
如果你的目标是“当某个后端服务挂掉时让 Apache 快速感知并调整路由”,应转向 mod_proxy_hcheck(Apache 2.4.41+),它通过 HTTP/TCP 探针实现外部服务可用性检测,并联动 mod_proxy 的故障转移逻辑。
实操要点:
- 确保已启用
mod_proxy、mod_proxy_http、mod_proxy_hcheck - 为被监控服务暴露一个轻量健康端点(例如
/healthz返回 200 OK) - 在
ProxyPass中绑定健康检查:ProxyPass /app http://127.0.0.1:8000/app hcheck=hc1 HCheck hc1 type=http uri=/healthz timeout=2 interval=5 fail=3
-
fail=3表示连续 3 次失败才标记节点为 down;interval=5是探测间隔(秒)
注意:mod_proxy_hcheck 不杀进程,只影响代理路由决策;若需自动拉起进程,得配合 systemd 或 supervisor 等外部工具。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
想监控任意本地进程?用 systemd + mod_status 配合更可靠
Linux 下最稳定的做法是把目标进程交由 systemd 托管,再通过 Apache 的 mod_status(配合自定义脚本)间接反映状态。
例如,假设你的关键进程叫 myworker.service:
- 确认它已启用:运行
systemctl is-active myworker.service应返回active - 写一个简单 CGI 或 PHP 脚本(如
/var/www/html/check-worker.php):<?php $state = trim(shell_exec('systemctl is-active myworker.service 2>/dev/null')); http_response_code($state === 'active' ? 200 : 503); echo $state; ?> - 在 Apache 中开放该路径,并用外部监控轮询它(如 Zabbix、curl 定时检查)
这样比硬塞进 Apache 模块更解耦,也避免因 Apache 重启导致看护逻辑中断。
为什么别自己写 watchdog 模块?
有人尝试用 mod_lua 或 mod_python 在 Apache 进程内轮询 ps 或 kill -0,但存在几个硬伤:
- Apache 多进程模型下,每个 worker 都会执行该检查,造成重复 fork 和资源竞争
- 无法跨进程同步状态,A 进程发现进程死了,B 进程可能还在转发请求
- 超时控制难:HTTP 请求处理有
Timeout限制,但后台轮询没标准生命周期管理 - Apache 2.4+ 已弃用
mod_python,mod_lua的os.execute在生产环境常被禁用(安全策略)
真正的进程看护必须脱离 Web 服务器生命周期——这是运维边界问题,不是配置问题。

















