apache反向代理关键在于精准启用mod_proxy和mod_proxy_http两模块、正确配置proxypass/proxypassreverse(路径斜杠必须一致)、开启proxypreservehost并透传x-forwarded-*头,缺一将导致500错误、跳转失效或后端无法获取真实ip。
apache 安装 mod_proxy 实现反向代理,关键不在“装多少模块”,而在于精准启用必需模块、配置路径映射、透传关键请求头。漏掉任一环节,轻则 500 错误或跳转失效,重则后端拿不到真实 ip、生成内网链接、限流白名单全失效。
启用两个核心模块:mod_proxy 和 mod_proxy_http
这两个模块缺一不可——mod_proxy 是代理引擎,mod_proxy_http 才能真正处理 HTTP 请求。只启一个,Apache 会报 Invalid command 'ProxyPass' 或静默返回 500。
-
Debian/Ubuntu 系统:运行
sudo a2enmod proxy proxy_http -
RHEL/CentOS 系统:编辑
/etc/httpd/conf/httpd.conf,取消以下两行注释:LoadModule proxy_module modules/mod_proxy.soLoadModule proxy_http_module modules/mod_proxy_http.so - 启用后必须验证:
apache2ctl -M | grep proxy(Debian)或httpd -M | grep proxy(RHEL),确认两模块均显示为(shared)
在 VirtualHost 中配置 ProxyPass 与 ProxyPassReverse
规则必须写在 <virtualhost></virtualhost> 块内,避免污染全局配置。最易出错的是路径末尾斜杠是否一致——前后不统一会导致后端路由错乱、404 频发。
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 代理整个站点(如前端访问
/,后端跑在localhost:8080):ProxyPass / http://127.0.0.1:8080/ProxyPassReverse / http://127.0.0.1:8080/
注意:两个指令末尾都带/,表示根路径被完整截断 - 代理子路径(如只把
/api/转发):ProxyPass /api/ http://192.168.1.50:3000/ProxyPassReverse /api/ http://192.168.1.50:3000/
切勿写成/api(无斜杠),否则后端收到的路径可能变成/api/v1→/v1还多挂一层前缀
透传 Host 与客户端真实信息
不加这步,后端看到的 Host 是 127.0.0.1:8080,跳转链接暴露内网;request.getRemoteAddr() 拿到的全是 127.0.0.1,IP 白名单和日志统计全部失灵。
-
ProxyPreserveHost On:把浏览器原始 Host 头原样传给后端 - 注入真实客户端 IP 和协议:
RequestHeader set X-Forwarded-For "%{REMOTE_ADDR}e" env=REDIRECT_REMOTE_ADDRRequestHeader set X-Forwarded-Proto "http" early(HTTPS 站点请改为"https") - 务必关闭正向代理防滥用:
ProxyRequests Off
重启前必做:语法检查与服务重启
改完配置不能直接重启,必须先验证语法,再加载新配置。
- 检查语法:
Debian/Ubuntu:sudo apache2ctl configtest
RHEL/CentOS:sudo httpd -t - 语法通过后重启:
sudo systemctl restart apache2(Debian)sudo systemctl restart httpd(RHEL) - 可追加日志确认模块已加载:
sudo tail -n 20 /var/log/apache2/error.log或对应错误日志路径










