apache反向代理必须启用mod_proxy和mod_proxy_http两个模块,缺一不可;配置需在内成对使用proxypass/proxypassreverse(斜杠严格一致),并设置proxypreservehost on及透传x-forwarded头以保障后端上下文正确。
启用 mod_proxy 和 mod_proxy_http 是 apache 反向代理的起点,缺一不可。只开一个模块,apache 会报错或静默返回 500,配置也根本不会生效。
启用两个模块(系统差异处理)
这两个模块必须同时加载,否则 ProxyPass 指令无法识别。
-
Debian/Ubuntu 系统:运行命令一次性启用
sudo a2enmod proxy proxy_http
然后重启服务:sudo systemctl restart apache2 -
RHEL/CentOS 系统:编辑
/etc/httpd/conf/httpd.conf,取消以下两行注释:LoadModule proxy_module modules/mod_proxy.soLoadModule proxy_http_module modules/mod_proxy_http.so -
验证是否成功:执行
httpd -M | grep proxy(RHEL)或apache2ctl -M | grep proxy(Debian),输出中必须同时出现proxy_module (shared)和proxy_http_module (shared)
基础反向代理配置(写在 VirtualHost 内)
所有代理指令必须放在 <virtualhost></virtualhost> 块里,避免污染全局。路径斜杠必须严格一致,这是最容易出错的地方。
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 完整代理根路径示例:
ProxyPass / http://127.0.0.1:8080/ProxyPassReverse / http://127.0.0.1:8080/
注意:前后都带斜杠,表示请求路径中的/被截掉,后端收到的是干净的/xxx - 子路径代理(如只代理
/api/):ProxyPass /api/ http://192.168.1.50:3000/ProxyPassReverse /api/ http://192.168.1.50:3000/
切勿写成/api(无尾部斜杠),否则后端路由可能错位导致 404
关键头信息透传(保证后端上下文正确)
仅转发路径不够,后端还需要知道原始 Host 和客户端真实 IP,否则重定向失败、日志记录失真、权限判断出错。
- 加一行:
ProxyPreserveHost On—— 把原始请求头中的Host透传给后端,避免后端生成错误跳转地址 - 显式透传常见转发头(推荐启用
headers_module):RequestHeader set X-Forwarded-Proto "http"RequestHeader set X-Forwarded-Port "80"
后端应用需主动读取X-Forwarded-For、X-Forwarded-Proto等头来还原真实请求 - 若需解析真实客户端 IP,后端还应信任内部代理地址(如
127.0.0.1),并在代码中从X-Forwarded-For提取最左非内网 IP
配置后务必检查与测试
每改一次配置都要验证,避免上线后才发现问题。
- 语法检查:
sudo apache2ctl configtest(Debian)或sudo httpd -t(RHEL) - 查看错误日志定位问题:
tail -f /var/log/apache2/error.log或/var/log/httpd/error_log - 简单测试:curl 请求代理地址,看响应是否来自后端;检查响应头是否含
Via或X-Forwarded-*;用浏览器打开页面,确认 JS/CSS 路径和重定向链接是否正常










