Apache反向代理配合虚拟主机的核心是用VirtualHost按域名区分请求,并在各块中通过ProxyPass将流量转发至后端服务;必须启用mod_proxy、mod_proxy_http等模块,配置ProxyPreserveHost、ProxyPass/ProxyPassReverse及X-Forwarded头以透传真实客户端信息。

Apache 反向代理配合虚拟主机,核心就是用 VirtualHost 按域名区分请求,再在每个虚拟主机里用 ProxyPass 把流量转发给对应后端服务。不是把文件放在 Apache 本地,而是让它当“中间人”,把用户访问 api.example.com 的请求,原样转给 127.0.0.1:3000,返回结果也原路带回。
必须启用的模块不能少
缺一个模块,ProxyPass 就不生效,页面直接报 500 或 404。确认以下模块已加载:
-
mod_proxy:代理功能主引擎 -
mod_proxy_http:支持 HTTP/HTTPS 后端通信(绝大多数场景必需) -
mod_ssl:如果要处理 HTTPS 域名或代理 wss://(WebSocket 安全连接) -
mod_proxy_wstunnel:后端用 WebSocket(如 Socket.IO、Vue DevServer)时必须启用
Debian/Ubuntu 执行:sudo a2enmod proxy proxy_http ssl proxy_wstunnel && sudo systemctl restart apache2
CentOS/RHEL 检查 /etc/httpd/conf.modules.d/ 下对应 LoadModule 行是否启用,或手动取消注释后重启 httpd。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
每个域名一个 VirtualHost 块
不要堆在一个配置里,每个 <VirtualHost> 对应一个独立域名,结构清晰、互不干扰:
-
ServerName必须写准确(如admin.example.com),这是 Apache 匹配请求的关键 -
ProxyPreserveHost On让后端收到的Host头仍是用户访问的原始域名,避免跳转链接出错 -
ProxyPass / http://127.0.0.1:8080/和ProxyPassReverse / http://127.0.0.1:8080/的末尾斜杠必须一致——都带或都不带,否则路径错乱 - 路径级代理更灵活,比如
ProxyPass /api/ http://localhost:3000/api/,只代理/api/开头的请求
透传真实客户端信息
后端服务常需知道用户真实 IP 和协议类型(HTTP 还是 HTTPS),Apache 默认会覆盖这些,需手动补全:
- 关闭自动添加的转发头:
ProxyAddHeaders Off - 注入真实 IP:
RequestHeader set X-Forwarded-For "%{REMOTE_ADDR}e" - 注入协议:
RequestHeader set X-Forwarded-Proto "https"(仅 HTTPS 虚拟主机中加;HTTP 站点用"http") - 若后端是 Node.js/Java 等,务必在代码里读取
X-Forwarded-For和X-Forwarded-Proto,而不是直接信任req.ip或req.protocol
日志与调试建议
别等出问题才查,提前配好定位手段:
- 为每个虚拟主机单独设日志:
ErrorLog "/var/log/apache2/admin.example.com-error.log"、CustomLog "/var/log/apache2/admin.example.com-access.log" combined - 开启代理调试日志(临时):
LogLevel alert proxy:debug,查看转发细节(注意别长期开启,影响性能) - 用
curl -v http://admin.example.com检查响应头是否含X-Forwarded-For、Location是否被ProxyPassReverse正确重写 - 后端返回 302 跳转时,若地址没变成本地域名,说明
ProxyPassReverse路径不匹配或没生效

















