Apache反向代理核心是启用mod_proxy和mod_proxy_http模块、成对配置ProxyPass/ProxyPassReverse(路径斜杠严格一致)、透传X-Forwarded头并开启ProxyPreserveHost,缺一将导致500错误、跳转失效或后端无法获取真实IP。
apache 实现反向代理,核心就三件事:模块必须启用、路径映射要配对、关键请求头得透传。漏掉任一环节,轻则 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
然后重启服务:sudo systemctl restart apache2
-
RHEL/CentOS 系统:
编辑/etc/httpd/conf/httpd.conf,取消以下两行注释:LoadModule proxy_module modules/mod_proxy.so
LoadModule 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 中配置 ProxyPass 和 ProxyPassReverse
所有代理规则必须写在 `-
路径斜杠必须严格一致,这是最容易出错的地方:
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
前后都带 `/`,表示客户端访问 `/login` 时,实际发给后端的是 `/login`(不是 `//login`),后端路由不会错位。 -
子路径代理示例(如只代理
/api/):ProxyPass /api/ http://192.168.1.50:3000/
ProxyPassReverse /api/ http://192.168.1.50:3000/
切勿写成 `/api`(无尾部斜杠),否则后端收到的路径可能变成 `/api/v1` → `/v1` 还多挂一层前缀,极易 404。 -
额外安全与实用设置:
ProxyRequests Off
—— 必须关闭正向代理,防止被滥用为开放代理
CPA Update - Secure CLI Proxy API Maintenance下载安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
ProxyPreserveHost On
—— 把原始 Host 头传给后端,避免 Spring Boot 或 Nginx 生成 `http://127.0.0.1:8080/login` 这类内网跳转链接
透传真实客户端信息(X-Forwarded-* 头)
默认情况下,后端看到的 `RemoteAddr` 全是 `127.0.0.1`,日志、IP 白名单、限流都会失真。需主动注入并确保后端读取:启用
headers_module(如未启用:sudo a2enmod headers)-
在
<VirtualHost>内添加:RequestHeader set X-Forwarded-For "%{REMOTE_ADDR}e" env=REDIRECT_REMOTE_ADDR
RequestHeader set X-Forwarded-Proto "http" early
(HTTPS 站点请将 `"http"` 改为 `"https"`) -
后端应用需配合解析这些头:
- Java/Spring Boot 需设
server.forward-headers-strategy=framework - Node.js 需信任
X-Forwarded-For并取最左非内网 IP - Go/Python 也需显式读取
X-Forwarded-For和X-Forwarded-Proto
- Java/Spring Boot 需设
配置后务必检查与重启
每次修改都要走完这三步,避免上线后才发现问题:-
语法检查:
sudo apache2ctl configtest
(Debian)或sudo httpd -t
(RHEL) -
查看模块加载状态(再次确认):
apache2ctl -M | grep proxy
-
重启服务:
sudo systemctl restart apache2
(Debian)或sudo systemctl restart httpd
(RHEL)
不复杂但容易忽略。

















