apache可通过virtualhost按域名区分并结合proxypass实现反向代理,需启用mod_proxy、mod_proxy_http、mod_ssl(https时)和mod_proxy_wstunnel(websocket时),各virtualhost中配置proxypreservehost on及路径一致的proxypass/proxypassreverse规则。

Apache 可以同时实现虚拟主机(按域名区分网站)和反向代理(把请求转发给后端服务),二者结合就能做到:用户访问不同域名时,Apache 不是返回本地文件,而是将整个请求代理到对应后端服务。关键在于用 VirtualHost 区分域名,再在每个虚拟主机内配置 ProxyPass 规则。
启用必要模块
确保以下模块已启用,缺一不可:
-
mod_proxy:代理主引擎 -
mod_proxy_http:支持 HTTP/HTTPS 后端通信 - (可选但推荐)
mod_ssl:如需 HTTPS 终结或代理 wss:// - (WebSocket 必需)
mod_proxy_wstunnel:处理Upgrade: websocket请求
Debian/Ubuntu 系统执行:
sudo a2enmod proxy proxy_http ssl proxy_wstunnel
CentOS/RHEL 系统检查 /etc/httpd/conf.modules.d/ 下是否加载对应 LoadModule 行,或手动添加并重启。
为每个域名定义独立虚拟主机
每个 <virtualhost></virtualhost> 块绑定一个 ServerName(如 api.example.com 或 admin.example.com),并在其中配置反向代理规则。例如:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
<virtualhost> ServerName api.example.com ProxyPreserveHost On ProxyRequests Off ProxyPass / http://127.0.0.1:3000/ ProxyPassReverse / http://127.0.0.1:3000/ </virtualhost><virtualhost> ServerName admin.example.com ProxyPreserveHost On ProxyRequests Off ProxyPass / http://192.168.1.50:8080/ ProxyPassReverse / http://192.168.1.50:8080/ </virtualhost>
注意:ProxyPass 和 ProxyPassReverse 的路径末尾斜杠必须严格一致;ProxyPreserveHost On 保证后端收到的 Host 头仍是原始域名,避免生成错误跳转链接。
正确透传客户端信息与协议
后端服务常需知道真实客户端 IP 和访问协议(HTTP/HTTPS)。默认情况下 Apache 会覆盖这些信息,需显式设置:
- 禁用自动添加
X-Forwarded-*头:ProxyAddHeaders Off - 手动注入真实 IP:
RequestHeader set X-Forwarded-For "%{REMOTE_ADDR}e" - 注入协议类型(尤其 HTTPS 终结场景):
RequestHeader set X-Forwarded-Proto "https" - 若使用 SSL,还需在 HTTPS 虚拟主机中配置证书,并将
ProxyPass指向http://或https://后端
特殊协议支持:WebSocket 长连接
若某个域名需代理 WebSocket(如 /ws 路径),不能复用 http:// 协议前缀:
- 必须启用
mod_proxy_wstunnel并确认已加载 - 使用
ws://或wss://前缀:ProxyPass /ws ws://127.0.0.1:8080/ws - 同步延长超时:
Timeout 3600和ProxyTimeout 3600 - 路径前后斜杠严格一致,否则浏览器拒绝连接
不配 mod_proxy_wstunnel 或误写成 http://,会导致握手成功后秒断。










