Apache反向代理Tomcat需启用mod_proxy、mod_proxy_http、mod_proxy_wstunnel模块,配置ProxyPreserveHost、ProxyPass、ProxyPassReverse,并在HTTPS场景下设置Tomcat Connector的scheme="https"和secure="true"。

Apache 作为前端 Web 服务器,把请求转发给后端 Tomcat 运行 Java Web 应用,关键就是配置好 ProxyPass 和配套指令。核心不是简单写一行转发,而是确保请求能过去、响应能回来、Cookie 和跳转不乱、域名和协议保持一致。
启用必需的代理模块
Apache 默认不开启代理功能,必须手动加载以下模块:
-
mod_proxy:提供基础代理能力 -
mod_proxy_http:支持 HTTP/HTTPS 协议转发(Java Web 必需) -
mod_proxy_wstunnel:如果应用用到 WebSocket(如 Spring Boot 的 STOMP 或前端实时通信),必须加上
在 httpd.conf(Linux 常见路径:/etc/apache2/mods-enabled/ 或 /usr/local/apache/conf/httpd.conf;Windows 在 conf/httpd.conf)中,取消以下三行前的 #:
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
改完后重启 Apache,并执行 httpd -M | grep proxy(Linux/macOS)或 httpd -M | findstr proxy(Windows),确认三者状态均为 shared。
立即学习“Java免费学习笔记(深入)”;
配置虚拟主机与 ProxyPass 规则
在虚拟主机配置文件中(如 sites-available/000-default.conf 或 conf/extra/httpd-vhosts.conf)添加如下内容:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
<VirtualHost *:80>
ServerName yourapp.example.com
ProxyPreserveHost On
<pre class='brush:php;toolbar:false;'># 将所有请求转发到本地 Tomcat 8080
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
# 可选:静态资源由 Apache 直接服务(提升性能)
ProxyPass /static !
Alias /static /var/www/yourapp/static
<Directory "/var/www/yourapp/static">
Require all granted
</Directory></VirtualHost>
说明:
-
ProxyPreserveHost On:让 Tomcat 日志里记录的是原始域名(如yourapp.example.com),而不是localhost -
ProxyPass / http://localhost:8080/:把根路径请求全部转发过去 -
ProxyPassReverse / http://localhost:8080/:自动重写响应头中的Location、Set-Cookie、Content-Location等字段,避免登录跳转失败或 Cookie 作用域错误 -
ProxyPass /static !中的!表示“不代理”,配合Alias让 Apache 直接返回静态文件,减少 Tomcat 负担
适配 HTTPS 场景
若 Apache 做 SSL 终止(即浏览器访问 https://yourapp.example.com,但内部仍用 HTTP 转发给 Tomcat),只需保持 ProxyPass 指向 http://localhost:8080/ 即可,无需改成 https。
但需同步调整 Tomcat 的 conf/server.xml 中对应 Connector,加入以下参数,确保它知道前端用了 HTTPS:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
scheme="https"
secure="true"
proxyName="yourapp.example.com"
proxyPort="443" />其中 scheme="https" 和 secure="true" 告诉 Tomcat 当前是 HTTPS 上下文;proxyName 和 proxyPort 用于生成正确的绝对 URL(比如重定向地址、表单 action)。
验证与常见问题
配置完成后,检查并测试:
- 重启 Apache:
sudo systemctl restart apache2(Ubuntu/Debian)或apachectl restart - 访问
http://yourapp.example.com,应看到 Tomcat 部署的 Java Web 应用首页 - 查看 Tomcat 的
catalina.out或访问日志,确认remoteHost是真实 IP,serverName是你配置的域名 - 若出现 503 错误,先确认 Tomcat 是否正在运行(
curl http://localhost:8080) - 若登录后反复跳回登录页,大概率是
ProxyPassReverse缺失或secure="true"未设,导致 Cookie 的Secure属性不匹配

















