Apache反向代理通过域名或路径隔离不同版本后端服务,需启用mod_proxy、mod_proxy_http等模块,配置ProxyPass/ProxyPassReverse实现分发,并支持WebSocket、HTTPS上游及健康检查。

Apache 代理本身不直接管理“后端应用版本”,而是通过反向代理把不同请求路径或域名分发到运行着不同版本应用的独立服务进程上。关键不是让一个应用“多版本并存”,而是让多个已部署的版本实例(如 Node.js v18 和 v20、Go 1.21 和 1.23、Java Spring Boot 2.x 和 3.x)各自独立运行,再由 Apache 统一入口调度。
启用必需的代理模块
Apache 默认不开启代理功能,必须手动加载对应模块:
- 打开 XAMPP\apache\conf\httpd.conf(或 Linux 的 /etc/httpd/conf/httpd.conf)
- 确保以下三行未被注释:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so - 若后端含 WebSocket(如新版 Socket.IO)或需转发 HTTPS 请求,额外启用:
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so - 保存后,用命令验证:
Windows: httpd -M | findstr proxy
Linux/macOS: httpd -M | grep proxy
输出中应同时看到 proxy_module 和 proxy_http_module,且状态为 (shared)
按域名或路径隔离不同版本服务
推荐在 httpd-vhosts.conf 中配置虚拟主机,避免污染主配置。每个 <VirtualHost> 对应一个应用版本:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 为 Node.js v18 启动服务:node server.js --port 3000
- 为 Node.js v20 启动另一实例:node server.js --port 3001
- 在 httpd-vhosts.conf 中添加:
ServerName app-v18.local
ProxyPreserveHost On
ProxyPass / http://localhost:3000/
ProxyPassReverse / http://localhost:3000/
</VirtualHost>
<VirtualHost *:80>
ServerName app-v20.local
ProxyPreserveHost On
ProxyPass / http://localhost:3001/
ProxyPassReverse / http://localhost:3001/
</VirtualHost>
然后将 app-v18.local 和 app-v20.local 加入系统 hosts 文件(Windows 在 C:\Windows\System32\drivers\etc\hosts,Linux/macOS 在 /etc/hosts),指向 127.0.0.1。访问这两个域名即可分别进入不同 Node 版本的服务。
支持 WebSocket 和长连接的细节
如果某个版本依赖实时通信(如聊天、通知),需额外处理协议升级:
- 在对应 VirtualHost 内增加:
ProxyPass /ws/ ws://localhost:3001/ws/
或更通用写法:
ProxyPass /socket.io/ ws://localhost:3001/socket.io/ - 确保后端服务已启用 WebSocket 支持,并监听相同路径前缀
- 若上游是 HTTPS(如 Go 程序启用了 TLS),改用:
ProxyPass / https://localhost:8443/
并确保 Apache 已加载mod_ssl,且配置了SSLProxyEngine on
健康检查与超时控制(可选增强)
生产级部署建议加入基础容错能力:
- 设置超时避免挂起:
ProxyTimeout 30
ProxyBadHeader ignore - 启用简单健康检查(需 Apache 2.4.37+):
ProxySet lbmethod=byrequests
ProxySet retry=60
(配合多个同版本实例时更有效) - 记录代理日志便于排查:
ProxyErrorOverride off
ErrorLog "logs/proxy-appv20-error.log"
CustomLog "logs/proxy-appv20-access.log" combined

















