apache反向代理核心是启用mod_proxy等模块并配置proxypass,通过virtualhost将请求精准转发至后端服务,需严格匹配路径斜杠、透传x-forwarded头以保留客户端ip与协议信息。

Apache 中配置 ProxyPass 实现反向代理,核心是让 Apache 充当“中间人”,把用户请求按域名或路径精准转给后端服务(如 Node.js、Java、Go 应用),同时保证重定向、静态资源、客户端 IP 和协议信息不出错。
必须先启用代理模块
Apache 默认不开启代理功能,缺一不可的模块有:
- mod_proxy.so:代理基础框架
- mod_proxy_http.so:处理 HTTP/HTTPS 后端通信(漏掉会导致 503 或 404)
- mod_proxy_wstunnel.so:如需转发 WebSocket(比如 Socket.IO、实时通知)
- mod_ssl.so:若处理 HTTPS 请求或代理 wss://
- mod_headers.so:用于注入 X-Forwarded-* 头(推荐启用)
Debian/Ubuntu 系统执行:sudo a2enmod proxy proxy_http ssl proxy_wstunnel headers
RHEL/CentOS 检查 /etc/httpd/conf.modules.d/ 下对应 LoadModule 行是否启用。
在虚拟主机中写 ProxyPass 规则
规则必须放在 <virtualhost></virtualhost> 块内,例如:
<virtualhost> ServerName api.example.com ProxyRequests Off ProxyPreserveHost On <p>ProxyPass / <a href="https://www.php.cn/link/307527f309aa633edcc5f228a5533f25">https://www.php.cn/link/307527f309aa633edcc5f228a5533f25</a> ProxyPassReverse / <a href="https://www.php.cn/link/307527f309aa633edcc5f228a5533f25">https://www.php.cn/link/307527f309aa633edcc5f228a5533f25</a> </p></virtualhost>
关键点:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- ProxyPreserveHost On:让后端收到原始 Host 头(如 api.example.com),避免重定向跳到 127.0.0.1:3000
- ProxyPass 和 ProxyPassReverse 的路径末尾斜杠必须严格一致:/ → http://x:3000/,不是 http://x:3000;/api/ → http://x:8080/api/,不能少斜杠
- ProxyRequests Off:禁用正向代理,生产环境强制要求
转发不同路径到不同后端
按从长到短顺序写,避免宽泛规则提前截断:
ProxyPass /admin/api/ http://svc-a:9000/api/ProxyPass /admin/ http://svc-b:8080/ProxyPass /api/ http://svc-c:3000/v1/ProxyPass / http://web:3001/
也可用 <location></location> 包裹提升可读性,语义不变:
<location> ProxyPass http://svc-c:3000/v1/ ProxyPassReverse http://svc-c:3000/v1/ </location>
透传真实请求上下文
后端常依赖客户端 IP、协议类型(HTTP/HTTPS)生成链接或记录日志。默认 Apache 不自动传递这些,需手动补全:
RequestHeader set X-Forwarded-For "%{REMOTE_ADDR}e"RequestHeader set X-Forwarded-Proto "https" env=HTTPSRequestHeader set X-Forwarded-Proto "http" !env=HTTPSRequestHeader set X-Forwarded-Port "443" env=HTTPS
如果 Apache 终结 HTTPS(即用户访问 https://,但转发给后端 http://),后端代码需显式信任这些头(如 Express 中设 app.set('trust proxy', true))。










