Apache 配置七层(http 协议)反向代理的流程

反向代理(Reverse Proxy):客户端发送请求到代理服务器,代理服务器代替客户端向目标服务器发送请求,然后将目标服务器的响应返回给客户端。

Apache 配置反向代理的流程:

步骤一:需要启用反向代理的模块,Apache 是基于模块化设计的,需要保证以下两类模块启用,才具有反向代理功能。

  • 核心模块:mod_proxy 是 Apache 反向代理的核心模块,只有启用了这个模块才能配置代理功能。

  • 协议模块:针对不同的七层协议,需要启动对应的协议子模块。

HTTP 请求代理: mod_proxy_http(HTTP 请求代理)、mod_proxy_wstunnel(WebSocket 代理)、mod_proxy_ftp( FTP 请求代理)


步骤二:配置代理策略,就是哪种类型的请求会被代理服务器捕获,然后转发给哪个后端服务器处理。

Apache 提供了一个名为 ProxyPass 的指令,如果某个 http 请求中包含了指定的路径,就会被匹配到。
ProxyPass [URL-path](需要匹配什么样的请求) [backend-url](转发到哪个后端服务器处理)

例如:ProxyPass /EHCommon http://127.0.0.1/EHCommon

假设客户客户端发起的请求是:http://117.172.117.203/EHCommon/admin/user/login,那么此时 Request URI:/EHCommon/admin/user/login

  1. 这个请求被这个规则匹配到后,首先/EHCommon这个前缀会被去掉,剩下:/admin/user/login
  2. 然后将剩下的 /admin/user/login 拼接到 http://127.0.0.1/EHCommon上,
  3. 拼接后:拼接:http://127.0.0.1/EHCommon/admin/user/login,用这个URL发起请求

例如:ProxyPass /EHCommon http://127.0.0.1

客户端请求:http://117.172.117.203/EHCommon/admin/user/login,此时 Request URI 为:/EHCommon/admin/user/login

  1. 去掉 Request URI 中被匹配到的前缀:/admin/user/login
  2. 将http://127.0.0.1 和 :/admin/user/login 拼接;http://127.0.0.1/admin/user/login

所以通过这两个例子,可以知道 Apache 的 ProxyPass 指令的工作流程是这样的:

  • 参数一:写的是一个路径,如果某个请求的 Request URI(去除协议、地址和端口部分)的路径前缀包含这个指定的路径,就会被匹配到,匹配到之后会将这部分去掉
  • 参数二:可以理解为指定的就是一个URL,会将参数1剩下的路径部分直接拼接到这个参数指定的URL上。

步骤三:对后端服务器的响应进行处理

为什么对后端服务器的响应还需要进行处理。
假设代理服务器拼接后的URL是 http://127.0.0.1/EHCommon/admin/user/login,通过这个向后端服务器发起请求后,后端服务器会返回一个响应报文。
如果后端服务器返回 301 重定向响应,响应头中的 Location: http://127.0.0.1/EHCommon/anotherpage,希望客户端直接访问 http://127.0.0.1/EHCommon/anotherpage
如果代理服务器直接把这个请求给客户都安,此时客户端会直接访问 http://127.0.0.1/EHCommon/anotherpage,从而导致出错
所以通过roxyPassReverse 指令对响应头进行处理,响应中携带有特定路径的 URL,就将 URL 中的协议、主机和端口改为代理服务器的信息,避免直接访问后端服务器,从而保证代理服务器继续处理所有的请求。

例如:ProxyPassReverse /EHCommon http://127.0.0.1/EHCommon

假设代理服务器发起的请求:http://127.0.0.1/EHCommon/admin/user/login
这里的第一个参数 /EHCommon 表示代理服务器发起的若干个请求中,包含路径前缀 /EHCommon 的请求的响应才会被匹配。
如果这个请求头的响应报文中存在:Location: http://127.0.0.1/EHCommon/anotherpage
就会将这部分URL中的协议、主机名和端口三部分(即 authority 部分)替换为代理服务器的地址信息, 路径及其后内容保持不变。

说明:这里参数2还带了个路径,仅用来做精确匹配的,没有其他特殊用途。
例如:Location: http://127.0.0.1/EHCommon/anotherpage 和 Location: http://127.0.0.1/bob/anotherpage,只有第一个会被匹配并替换,第二个因为路径前缀不同,就不会改这个URL。

所以通过这两个例子,可以知道 Apache 的 ProxyPassReverse 指令的工作流程是这样的:

  • 参数1:只匹配包含特定路径前缀请求返回的响应报文
  • 参数2:如果这个响应报文中包含URL的字段,就将和参数2匹配到的URL的协议、地址和端口三部分改了,其他不动

范例:当客户端向 19001 对应的虚拟主机发起请求,请求中包含/ws_9001前缀时, 代理到后端的 9001 端口对应的虚拟主机进行处理。

ws 反向代理配置
<VirtualHost *:19001>
    ProxyPass /ws_9001 ws://127.0.0.1:9001
    ProxyPassReverse /ws_9001 ws://127.0.0.1:9001

    ErrorLog ${APACHE_LOG_DIR}/general_error.log
    CustomLog ${APACHE_LOG_DIR}/general_access.log combined
</VirtualHost>

posted on 2025-11-20 16:13  背对背依靠  阅读(0)  评论(0)    收藏  举报