apache作为前端网关统一接管域名,通过virtualhost定义各业务域名,用proxypass转发至后端java实例,并透传host头;多实例需配置mod_proxy_balancer负载组及健康检查,路径代理须严格匹配末尾斜杠,websocket需mod_proxy_wstunnel支持。

Apache 本身不运行 Java Web 应用(如 Spring Boot、Tomcat 部署的 WAR),它只做反向代理或静态资源服务。要在分布式架构中实现 Java Web 应用的统一入口域名,核心是让 Apache 充当“前端网关”,把用户请求按域名或路径精准转发到后端多个 Java 实例,同时保证域名行为一致、可管理、可审计。
统一域名必须由前置层控制
Java 应用通常部署在 Tomcat、Jetty 或 Spring Boot 内嵌容器中,监听本地端口(如 8080、8081)。它们自身不处理多租户域名路由,也不感知集群拓扑。因此,统一域名不能靠每个 Java 实例自己配置 Host 头匹配,而必须由 Apache(或 Nginx)这类反向代理层统一接管:
- 所有对外暴露的域名(如 app.example.com、api.example.com)只在 Apache 的
<virtualhost></virtualhost>中定义 - Java 实例只需监听
127.0.0.1:8080等固定端口,不绑定任何域名 - Apache 使用
ProxyPass将请求转发过去,并通过ProxyPreserveHost On把原始 Host 头透传,确保 Java 应用能正确生成绝对链接(如重定向、静态资源 URL)
每个域名对应独立 VirtualHost + 标准化配置项
企业级规范要求每个业务域名有明确归属和最小合规要素,避免混用或泛解析:
-
文件隔离:每个域名配一个独立配置文件,如
/etc/apache2/sites-available/app.example.com.conf -
ServerName/ServerAlias 明确声明:至少包含主域名和 www 变体,禁用
*.example.com(除非安全评审通过) - 强制 HTTPS:HTTP 虚拟主机仅做 301 跳转,HTTPS 块内聚配置证书、TLS 版本、OCSP Stapling
-
日志路径唯一:如
/var/log/apache2/app.example.com/access.log,便于按域名聚合分析 - 禁止 .htaccess:所有权限与重写逻辑收口到 VirtualHost 内,不依赖目录级动态配置
多实例负载需配合 balancer 组 + 健康检查
当同一域名后端挂多个 Java 实例(如集群部署的订单服务),不能简单用多个 ProxyPass,而应使用 mod_proxy_balancer 构建负载组:
- 定义
<proxy balancer:></proxy>,列出全部 Java 实例地址(如http://192.168.5.10:8080、http://192.168.5.11:8080) - 启用健康检查:
hcmethod=GET hcinterval=15 hcfail=3 hcpass=2,探测/actuator/health等端点 - 会话保持可选:
route参数配合 Java 应用的 JSESSIONID 路由策略(如 sticky session) - 超时与容错:
ProxyTimeout 60+retry=60避免单点故障拖垮整条链路
路径级收敛与协议兼容要提前对齐
若多个 Java 服务共用同一域名但不同路径(如 app.example.com/user 和 app.example.com/order),需注意后端适配细节:
- ProxyPass 路径末尾的
/必须严格匹配:例如ProxyPass /user/ http://backend:8080/user/,否则可能造成重定向跳转错误 - Java 应用若未配置 context-path(如 Spring Boot 的
server.servlet.context-path=/user),则需在 Apache 层用ProxyPassMatch或RewriteRule重写路径 - WebSocket 支持需额外加载
mod_proxy_wstunnel,并用ws://协议代理,不能复用 HTTP 规则 - 若 Java 应用依赖 X-Forwarded-* 头获取真实 IP 或协议,Apache 必须开启
RemoteIPInternalProxy并设置可信段
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











