apache反向代理转发java服务的核心是启用mod_proxy、mod_proxy_http等模块,配置proxypass/proxypassreverse路由,并通过x-forwarded头传递协议、ip等上下文,确保java应用正确识别https、真实客户端ip及会话保持。

Apache 反向代理转发 Java 服务,核心是让外部请求先抵达 Apache,再由它安全、可控地转给后端 Java 应用(如 Tomcat、Spring Boot 内嵌服务器等),同时隐藏真实端口和地址。这不是简单“端口映射”,而是协议级代理,需正确启用模块、配置路由、处理头信息与会话。
启用必要代理模块
确保 Apache 加载了关键模块,否则 ProxyPass 等指令无效:
- mod_proxy:代理基础支持
- mod_proxy_http:支持 HTTP/HTTPS 协议转发
- mod_proxy_balancer(可选):如需负载均衡多个 Java 实例
- mod_remoteip(推荐):用于准确识别真实客户端 IP
在 httpd.conf 或站点配置中确认这些行未被注释:
LoadModule proxy_module modules/mod_proxy.so<br>LoadModule proxy_http_module modules/mod_proxy_http.so
基础转发配置(单实例)
以 Java 服务运行在 http://127.0.0.1:8080 为例,在虚拟主机(VirtualHost)内添加:
<virtualhost><br> ServerName app.example.com<br> ProxyPreserveHost On<br> ProxyPass / http://127.0.0.1:8080/<br> ProxyPassReverse / http://127.0.0.1:8080/<br></virtualhost>
说明:
- ProxyPreserveHost On:把原始 Host 头透传给 Java 服务,避免 Spring Boot 等因 Host 不匹配返回 404 或重定向错误
- ProxyPassReverse:重写后端响应中的 Location、Redirect 等头,防止跳转暴露内网端口
- 路径末尾的 / 必须一致,否则可能造成子路径错乱
处理真实 IP 和安全头
Java 应用默认拿到的是 Apache 的本地地址(如 127.0.0.1),需通过 X-Forwarded-* 头还原用户信息:
- 在 Apache 中添加:RequestHeader set X-Forwarded-Proto "https"(若启用了 HTTPS)
- 清除客户端伪造的 X-Forwarded-For:RequestHeader unset X-Forwarded-For
- 再由 Apache 自动添加可信值(配合 mod_remoteip 或 ProxyAddHeaders)
- Java 侧应使用
request.getRemoteAddr()配合request.getHeader("X-Forwarded-For")安全提取,而非直接信任该头
多实例负载与会话保持
当后端是多个 Tomcat 实例时,需防止登录态丢失:
- 启用 mod_proxy_balancer,定义集群:
<proxy><br> BalancerMember http://192.168.1.10:8080 route=server1<br> BalancerMember http://192.168.1.11:8080 route=server2<br> ProxySet stickysession=JSESSIONID|jsessionid<br></proxy><br>ProxyPass / balancer://myjava/<br>ProxyPassReverse / balancer://myjava/
关键点:
- 每个 Tomcat 的 server.xml 中
<engine jvmroute="server1"></engine>必须与 route 值严格一致 - JSESSIONID Cookie 值形如
ABC123.server1,Apache 才能正确提取并绑定 - 生产环境建议搭配 Redis 存储 Session,避免单点故障
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











