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

Apache 反向代理的核心是把外部请求“转手”给后端服务,再把响应原路送回——它不暴露真实服务器地址,还能统一处理 HTTPS、头信息和路径路由。关键不在装多少模块,而在启用对、配得准、传得全。
必须启用的两个基础模块
Apache 默认关闭所有代理功能,缺一不可:
- mod_proxy:代理引擎主模块,没它 ProxyPass 指令直接报错(500 或 Invalid command)
- mod_proxy_http:专用于 HTTP/HTTPS 后端通信,Node.js、Go、Java 都靠它转发
Linux/macOS 下检查是否加载:httpd -M | grep proxy;Windows 用 httpd -M | findstr proxy。若未出现 proxy_module (shared) 和 proxy_http_module (shared),需在 httpd.conf 中取消这两行注释:
LoadModule proxy_http_module modules/mod_proxy_http.so
配置 ProxyPass 和 ProxyPassReverse 成对使用
只写 ProxyPass 是常见陷阱——后端返回 302 重定向时,会暴露 http://127.0.0.1:8080/login 这类内网地址,用户点开就失败。
正确写法(以 Java 应用为例):
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
ServerName app.example.com
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
</VirtualHost>
- ProxyPreserveHost On:让原始 Host 头(如 app.example.com)透传,避免后端生成错误绝对 URL
- 前后斜杠必须一致:ProxyPass /api/ → 后端地址也得是 /api/,否则路径拼接错乱
真实客户端 IP 要前后端配合才能拿到
Apache 单方面加 X-Forwarded-For 头不够,Java 或 Spring Boot 不主动解析,request.getRemoteAddr() 永远是 127.0.0.1。
Apache 端需添加:
RequestHeader set X-Forwarded-For "%{REMOTE_ADDR}e" earlyRequestHeader set X-Forwarded-Proto "http" env=!HTTPS
RequestHeader set X-Forwarded-Proto "https" env=HTTPS
Java 端必须响应:
- Spring Boot 推荐配置:
server.forward-headers-strategy=framework - Tomcat 场景下,还需指定信任的代理段:
server.tomcat.remoteip.remote-ip-header=x-forwarded-for - 手动解析时,取
X-Forwarded-For第一个非 unknown 的 IP(注意逗号分隔)
按路径或域名隔离多语言后端
不同服务(Node.js、Go、Java)可共存于一台 Apache,靠虚拟主机 + 路径前缀区分:
<VirtualHost *:80>ServerName node.local
ProxyPass /api/ http://localhost:3000/api/
ProxyPassReverse /api/ http://localhost:3000/api/
</VirtualHost>
<VirtualHost *:80>
ServerName go.local
ProxyPass /service/ http://localhost:8080/service/
ProxyPassReverse /service/ http://localhost:8080/service/
</VirtualHost>
- 规则写在
httpd-vhosts.conf更清晰,避免污染主配置 - WebSocket 支持需额外启用
mod_proxy_wstunnel - HTTPS 上游(如 Go 启用了 TLS)同样依赖
mod_proxy_wstunnel

















