apache反向代理隐藏java服务器真实ip需四步:一启用mod_proxy和mod_proxy_http模块并验证;二proxypass与proxypassreverse成对配置且路径斜杠一致;三设置proxypreservehost on并透传x-forwarded-*头,后端应用须解析这些头获取真实ip;四proxypass目标改用内部域名并在/etc/hosts绑定,避免dns泄露ip。

Apache mod_proxy_http 是实现后端 Java 应用反向代理的核心模块,但仅启用它远远不够——必须配合 mod_proxy、正确配置头信息透传、路径映射与后端协同解析,才能真正隐藏真实 IP、保障重定向正常、获取真实客户端地址。
必须启用的两个基础模块
若未加载 proxy_module 和 proxy_http_module,Apache 会直接报 500 错误,日志中常显示 Invalid command 'ProxyPass' 或无明确提示的内部错误。
- Linux(Debian/Ubuntu)执行:
sudo a2enmod proxy proxy_http - CentOS/RHEL 检查
/etc/httpd/conf.modules.d/00-proxy.conf,确保以下两行未被注释:LoadModule proxy_module modules/mod_proxy.soLoadModule proxy_http_module modules/mod_proxy_http.so - 修改后务必运行
apachectl configtest(或apache2ctl configtest)校验语法,再重启服务
ProxyPass 与 ProxyPassReverse 必须成对使用
单独配置 ProxyPass 会导致后端返回的 302 重定向(如 Spring Boot 登录跳转、OAuth 回调)暴露内网地址,例如跳转到 http://192.168.1.100:8080/callback,用户无法访问。
- 典型安全配置(Java 服务监听
127.0.0.1:8080,域名app.example.com):ProxyPreserveHost OnProxyPass / http://127.0.0.1:8080/ProxyPassReverse / http://127.0.0.1:8080/ -
ProxyPreserveHost On确保原始 Host 头(如app.example.com)透传给 Java 应用,避免其生成以127.0.0.1:8080开头的绝对 URL - 路径末尾斜杠必须严格一致:若写
ProxyPass /api/,后端地址也需为http://.../api/;否则请求路径拼接错乱(如/api/user变成/api//user)
真实客户端 IP 依赖 Apache + Java 双侧配合
Apache 默认不改写 X-Forwarded-For,即使添加了头设置,Java 应用若不主动解析,request.getRemoteAddr() 仍返回 127.0.0.1,IP 限流、白名单、审计日志全部失效。
- Apache 需添加标准转发头(放在 VirtualHost 内):
RequestHeader set X-Forwarded-Proto "https" env=HTTPSRequestHeader set X-Forwarded-For "%{REMOTE_ADDR}e" early - Java 后端必须主动读取:
优先取X-Forwarded-For中第一个非unknown的 IP(注意逗号分隔,多级代理时可能含多个)
备用检查X-Real-IP、Proxy-Client-IP等常见头 - Spring Boot 推荐方式:
配置server.forward-headers-strategy=framework,并显式信任代理段,例如:server.tomcat.remoteip.remote-ip-header=x-forwarded-forserver.tomcat.remoteip.protocol-header=x-forwarded-protoserver.tomcat.remoteip.internal-proxies=127\.0\.0\.1|10\.\d{1,3}\.\d{1,3}\.\d{1,3}
HTTPS 场景下的关键开关
当 Apache 接收 HTTPS 请求并转发至 HTTP 后端(最常见场景),或需转发至 HTTPS 后端时,SSL 代理引擎必须显式开启。
- 转发至 HTTPS 后端(如调用第三方 API):
在对应<virtualhost></virtualhost>块中添加:SSLProxyEngine onProxyPass / https://api.example.com/ProxyPassReverse / https://api.example.com/ - 若后端 HTTPS 证书不可信(如自签名),可加:
SSLProxyVerify noneSSLProxyCheckPeerCN off
(生产环境应避免,建议替换为可信证书) - 统一走 HTTP 后端时,
<virtualhost></virtualhost>中保持SSLProxyEngine off,并确保ProxyPass使用http://协议











