Apache反向代理核心在于模块启用正确、路径映射精准、头部处理到位、后端感知真实请求;必须启用proxy_module和proxy_http_module,配对使用ProxyPass/ProxyPassReverse,设置ProxyPreserveHost On及X-Forwarded-*头,并确保后端应用解析这些头。

Apache 用 mod_proxy 搭建高性能反向代理网关,核心不在“堆模块”,而在于模块启用正确、路径映射精准、头部处理到位、后端感知真实请求。它不追求极致并发,但足够稳定、可控、易审计,特别适合已有 Apache 运维体系的企业场景。
一、必须启用的模块与验证方法
只开 mod_proxy 和 mod_proxy_http 是最低要求;若需负载均衡或 HTTPS 后端,则补全对应模块:
-
proxy_module(主代理逻辑) -
proxy_http_module(HTTP/1.1 协议支持,必选) -
proxy_balancer_module+lbmethod_byrequests(多节点轮询) -
headers_module(用于注入 X-Forwarded-* 头) -
ssl_module(如后端是 HTTPS 或需 TLS 终止)
验证是否生效:apache2ctl -M | grep proxy(Debian/Ubuntu)httpd -M | grep proxy(RHEL/CentOS)
看到 proxy_module (shared) 和 proxy_http_module (shared) 表示已加载。
二、基础反向代理配置要点
写在 <VirtualHost> 内,不是全局配置更安全:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
-
ProxyPreserveHost On:把原始 Host 头传给后端,避免 Java/Spring Boot 生成错误的绝对链接(如http://127.0.0.1:8080/login) -
ProxyPass / http://127.0.0.1:8080/:注意末尾斜杠——前后必须一致,否则路径拼接出错(如/api/v1可能变成/api/v1/127.0.0.1:8080) -
ProxyPassReverse / http://127.0.0.1:8080/:重写响应头中的Location、Content-Location、Set-Cookie的域名和路径,否则登录跳转、图片加载全失败 -
ProxyRequests Off:禁用正向代理功能,防止被滥用为开放代理
三、让后端真正“看见”用户
默认情况下,Java 应用调用 request.getRemoteAddr() 得到的是 127.0.0.1,IP 白名单、限流、日志统计全部失效。需两步配合:
- Apache 主动加头:
RequestHeader set X-Forwarded-For "%{REMOTE_ADDR}e" env=REDIRECT_REMOTE_ADDRRequestHeader set X-Forwarded-Proto "http" early
(HTTPS 站点改"https",并确保 SSL 终止在 Apache 层) - 后端应用显式读取这些头:
Spring Boot 需配置server.forward-headers-strategy=framework;
Tomcat 需在server.xml的Connector中设remoteIpHeader="x-forwarded-for"和protocolHeader="x-forwarded-proto"
四、进阶:轻量级负载均衡与健康检查
不用额外装 HAProxy,Apache 自带能力即可支撑中小规模集群:
- 定义集群:
<Proxy balancer://myapp>BalancerMember http://192.168.1.10:8080 route=node1 loadfactor=2BalancerMember http://192.168.1.11:8080 route=node2 loadfactor=1</Proxy> - 绑定代理规则:
ProxyPass / balancer://myapp/ stickysession=JSESSIONID|jsessionid
(开启会话粘性,适用于有状态 Java 应用) - 增强容错:
ProxySet lbmethod=bybusyness(按当前请求数分发,防长连接堆积)ProxySet failonstatus=500,502,503,504ProxySet retry=60(失败后 60 秒再试)
不复杂但容易忽略。关键不是写得多,而是每行都清楚它解决什么问题、漏了会怎样。


















