Apache mod_status需先启用模块、再用Require ip设IP白名单(禁用Require local及Order/Allow旧语法),最后通过/server-status?auto获取机器可读数据;生产环境还应隐藏默认路径以防扫描。

Apache 的 mod_status 默认不开放访问,直接配置却常因权限语法错误返回 403 或空白页。关键不是“能不能开”,而是“谁能在什么条件下安全地看”。生产环境必须用明确的 IP 白名单,禁用过时语法,且避免依赖 Require local——它在容器、反向代理或 IPv6 场景下极易失效。
确认模块已启用并验证加载
先确保模块真正就位,而非仅配置存在:
- Debian/Ubuntu:运行
sudo a2enmod status && sudo systemctl restart apache2,再执行apache2ctl -M | grep status,应输出status_module (shared) - RHEL/CentOS:检查
/etc/httpd/conf.modules.d/00-base.conf或主配置中是否有未注释的LoadModule status_module modules/mod_status.so,修改后执行sudo httpd -t && sudo systemctl reload httpd - 若无输出,说明模块未编译进当前 Apache,需重装带 mod_status 的包或重新编译
用 Require ip 设置可信来源访问
别用 Require local 或 Require all granted。前者只认 127.0.0.1 和 ::1,后者等于裸奔;两者在真实生产中都不可靠。
- 编辑配置文件(如
/etc/apache2/mods-enabled/status.conf或主配置中的<IfModule mod_status.c>块) - 写明具体网段或单 IP,例如运维主机和监控服务器:
<Location "/server-status">
SetHandler server-status
Require ip 10.10.0.0/16
Require ip 192.168.5.101
</Location>
- 若经 Nginx 或云 WAF 转发,
X-Forwarded-For不可信,必须以真实源 IP 段为准 - Apache 2.4+ 已废弃
Order/Allow语法,继续使用会导致静默拒绝,错误日志仅显示 “client denied”
检查配置生效与常见 403 原因
重启服务后仍 403?别急着改权限,先排查硬性前提:
-
SetHandler 缺失:
<Location>块内必须有SetHandler server-status,否则 Apache 不知道该用哪个处理器 -
上下文错误:
Require指令不能写在.htaccess中,只能出现在主配置、虚拟主机或<Location>等有效上下文里 -
模块未加载成功:再次运行
httpd -M | grep status或apache2ctl -M | grep status确认输出 - 查错误日志:
tail -n 20 /var/log/apache2/error.log(Debian)或/var/log/httpd/error_log(RHEL),典型提示是 “client denied by server configuration”
额外提醒:路径可自定义,但别暴露默认名
/server-status 是默认路径,但你可以改成更隐蔽的名字,比如 /sysmon-7a2f,降低被扫描发现的概率:
- 只需把
<Location "/server-status">改成<Location "/sysmon-7a2f"> - 之后访问
http://your-server/sysmon-7a2f?auto同样有效 - 注意:路径名不影响功能,但需同步更新监控脚本或 Prometheus 抓取地址


















