apache http server 通过启用 proxy 和 proxy_http 模块,结合 proxypass/proxypassreverse 实现路径级反向代理,将外部请求转发至本地或内网不同端口服务,并需注意尾斜杠一致性、proxypreservehost、proxyrequests 安全设置及 websocket 等特殊协议支持。
apache http server 配置内部代理端口转发,本质是启用反向代理功能,把外部进来的 http/https 请求,按规则转给同一台机器或内网其他机器上不同端口的服务(比如 tomcat 的 8080、node.js 的 3000、spring boot 的 8081 等),对外仍统一走 apache 的 80 或 443 端口。
关键不是“端口转发”本身,而是用 ProxyPass + ProxyPassReverse 实现路径级的反向代理,同时确保模块启用、头信息正确、超时合理。
启用必需的代理模块
Apache 默认不加载代理模块,必须显式启用,否则配置会报 500 错误或被忽略:
-
Linux(Debian/Ubuntu):
sudo a2enmod proxy proxy_http sudo systemctl restart apache2
-
Linux(CentOS/RHEL):
编辑/etc/httpd/conf/httpd.conf,取消以下两行前的#:LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so
然后重启:
sudo systemctl restart httpd -
Windows:
打开httpd.conf,去掉这两行的注释:LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so
✅ 检查是否生效:
apachectl -M | grep proxy应输出proxy_module,proxy_http_module
在虚拟主机中配置转发规则
以将 http://example.com/app 转发到本机 http://localhost:8080/app 为例(Tomcat 常见场景):
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
<virtualhost>
ServerName example.com
ProxyRequests Off
ProxyPreserveHost On
# 转发 /app 开头的所有请求
ProxyPass /app http://localhost:8080/app/
ProxyPassReverse /app http://localhost:8080/app/
# 可选:根路径也转发(如整个站点由后端提供)
# ProxyPass / http://localhost:8080/
# ProxyPassReverse / http://localhost:8080/
</virtualhost>
⚠️ 注意点:
-
ProxyPass /app http://localhost:8080/app/中,末尾斜杠必须一致:左边/app不带尾/,右边http://.../app/必须带,否则路径拼接错乱; -
ProxyPreserveHost On让后端看到原始Host: example.com,对 Spring Boot、Nextcloud 等依赖 Host 头的服务很关键; -
ProxyRequests Off是安全必须项,禁用正向代理,防止 Apache 被滥用为开放代理。
处理常见后端服务类型
✅ Tomcat(HTTP)
照上面配置即可。若 Tomcat 启用了 AJP,也可用 mod_proxy_ajp(需额外启用模块),但 http://localhost:8080 更通用。
✅ WebSocket(如前端 Vue/React 连接后端 ws://)
需额外启用 mod_proxy_wstunnel,并加 Rewrite 规则识别 Upgrade 请求:
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
# …在 VirtualHost 内…
ProxyPreserveHost On
RewriteEngine On
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /(.*) ws://localhost:8080/$1 [P,L]
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
ProxyTimeout 3600
Timeout 3600
✅ 多路径分发(如 API 走 Java,管理后台走 PHP)
可按路径精细控制,注意从长到短写,避免 /api 被 / 先截获:
ProxyPass /api/ http://localhost:8080/api/ ProxyPassReverse /api/ http://localhost:8080/api/ ProxyPass /admin/ http://localhost:8000/admin/ ProxyPassReverse /admin/ http://localhost:8000/admin/ ProxyPass / http://localhost:3000/ # 默认前端 ProxyPassReverse / http://localhost:3000/
验证与排错要点
- 浏览器访问
http://example.com/app,应得到后端响应,且地址栏不跳转; - 查看 Apache 错误日志:
tail -f /var/log/apache2/error.log(Debian)或/var/log/httpd/error_log(RHEL); - 常见错误:
-
502 Bad Gateway→ 后端服务没起来,或地址/端口写错,或防火墙拦截(检查curl -v http://localhost:8080是否通); -
503 Service Unavailable→ 后端响应超时,调大ProxyTimeout和Timeout; - 返回 404 但后端明明能访问 →
ProxyPassReverse缺失,导致重定向 Location 头里的 URL 仍是:8080,浏览器跳转失败; - WebSocket 连接立即关闭 →
Upgrade头未透传,确认RewriteCond %{HTTP:Upgrade}规则存在且模块已启。
-
不复杂但容易忽略










