apache可作为稳定边缘代理,通过mod_rewrite判断请求特征、mod_proxy反向代理、mod_proxy_balancer负载分发,并支持健康检查与会话保持,实现灰度发布、多版本共存及微服务统一负载。

Apache 本身不负责服务发现或动态注册,但能作为稳定可靠的边缘代理层,把进来的请求按规则重定向、转发或分发到后端集群节点。关键在于组合使用 mod_rewrite(路由判断)、mod_proxy(反向代理)和 mod_proxy_balancer(负载分发),再辅以健康检查与会话保持能力。
基于路径或域名的条件重定向
用 RewriteCond + RewriteRule 判断请求特征,再决定跳转或代理目标。适合灰度发布、多版本共存或租户隔离场景。
- 匹配特定路径前缀,重定向到新域名:
RewriteCond %{REQUEST_URI} ^/v2/RewriteRule ^(.*)$ https://api-v2.example.com$1 [R=302,L] - 识别子域名,转发至对应后端集群:
RewriteCond %{HTTP_HOST} ^tenantA\.example\.com$ [NC]RewriteRule ^/(.*)$ http://backend-tenant-a:8080/$1 [P,L] - 注意:加
[P]标志表示代理而非跳转;若需保留原始 Host 头,要配ProxyPreserveHost On
统一流量分发到已知微服务实例
当后端 Java 微服务地址固定(如注册在 Consul/Eureka 但由运维同步到 Apache 配置),可用 mod_proxy_balancer 实现轮询、权重或按请求数分发。
- 启用必要模块:
mod_proxy、mod_proxy_http、mod_proxy_balancer - 定义集群并指定成员:
<proxy balancer:></proxy>BalancerMember http://192.168.1.10:8080 loadfactor=3BalancerMember http://192.168.1.11:8080 loadfactor=1ProxySet lbmethod=byrequests stickysession=JSESSIONID - 对外暴露路径:
ProxyPass /api/ balancer://ms-cluster/api/ProxyPassReverse /api/ balancer://ms-cluster/api/
结合健康检查提升可用性
Apache 不主动探测服务状态,但可通过 hcmethod 和 hcuri 参数让 mod_proxy_balancer 定期发起探针,自动剔除不可用节点。
- 在
BalancerMember行中添加健康检查参数:BalancerMember http://192.168.1.10:8080 hcmethod=GET hcuri=/health timeout=5 retries=3 -
hcmethod指定 HTTP 方法,hcuri是后端暴露的健康端点,返回 2xx 即视为存活 - 需确保后端服务提供轻量级健康接口,且响应快、无副作用
处理重定向与代理中的头信息一致性
外部请求经 Apache 转发后,后端服务可能收不到真实客户端 IP 或原始 Host,导致重定向错误或日志失真。
- 保留原始 Host:
ProxyPreserveHost On - 传递真实客户端 IP:
RequestHeader set X-Forwarded-For %{REMOTE_ADDR}s(配合后端读取该 Header) - 修正重定向 Location 响应头:
ProxyPassReverse必须与ProxyPass成对出现,否则 302 响应里的跳转地址仍是后端内部地址









