Apache的mod_proxy本身不支持毫秒级延迟或故障注入,需借助后端服务(如WireMock、Spring Boot)或前置网关(如HAProxy/Envoy)协同实现,Apache仅作透明代理。
apache 的 mod_proxy 本身不支持在虚拟主机层级直接注入毫秒级延迟或模拟故障响应。它只负责请求转发、连接管理与基础超时控制,没有内置的延迟注入、错误码伪造或响应篡改能力。要达成“对后端响应的毫秒级故障延迟注入测试”,必须借助分层协作机制——核心思路是:**把延迟/故障逻辑下沉到后端服务侧,或前置到更合适的网关层,再让 apache 作为透明代理接入。**
推荐方案:在后端服务侧实现可控延迟
这是最稳定、可复现、易关闭的方式,无需修改 Apache 配置,也避免引入额外组件风险。
- 使用 WireMock 或 MockServer 独立部署一个 mock 服务,配置任意响应延迟(如
fixedDelay: 200)和状态码(如随机返回503),再让 Apache 的ProxyPass指向该 mock 服务 - Spring Boot 应用可在关键接口加
Thread.sleep(150),配合 Actuator + Resilience4j 的TimeLimiter实现带熔断的慢响应 - 若不能改代码,可用 JVM Agent(如 Byteman)在运行时注入延迟,例如匹配
HttpClient.execute()方法后 sleep 300ms
可行但需谨慎:用 HAProxy / Envoy 做前置故障注入层
Apache 放在它们之后,由 HAProxy 或 Envoy 承担延迟与错误注入职责,Apache 仅做最终反向代理。这种方式更符合生产级混沌工程实践。
- HAProxy 支持
http-request delay(单位毫秒)和http-response set-status,可精准控制每类请求的延迟与失败概率 - Envoy 的
fault injection filter原生支持延迟、abort、rate limiting,且可通过 xDS 动态调整策略 - 注意:不要尝试用 Apache 的
mod_rewrite+ CGI 脚本 sleep 来模拟延迟——性能差、线程阻塞、不可靠,仅限本地调试
Apache 可配合做的“感知”优化(非注入,但能加速故障识别)
虽然不能主动加 delay,但可调低探测阈值,让 Apache 更快发现后端异常并记录日志,辅助你验证故障注入是否生效。
- 启用
mod_proxy_balancer,即使单节点也定义为balancer://集群 - 在
BalancerMember中设置ping=100,HEAD,/health timeout=200,要求后端/health接口必须在 100ms 内返回 2xx - 配合
failonstatus=500-599和retry=5,确保一次失败就标记节点为 ERR,并 5 秒后重试 - 这样当你的 mock 服务按设定返回 503 或延迟超 100ms,Apache 日志会立即体现
proxy_balancer: member http://mock:8080 failed
不建议尝试的路径
以下方式要么无效、要么违背设计原则、要么仅限实验环境:
-
ProxyPass指令本身不支持delay、inject或类似参数;写进去会被忽略 -
mod_proxy_hcheck是健康检查模块,只读取响应,不能修改或延迟响应 - 用
ErrorDocument 503返回静态页是错误捕获,不是响应延迟注入;它发生在代理失败之后,而非模拟慢响应过程


















