我有一个关于将 Squid 设置为透明/正向代理后面的反向代理的问题。基本上,我正在寻找的是是否可以在以下情况下设置 (B):
客户端 (A) --> Squid 作为反向代理 (B) --> Squid 作为正向代理 (C) --> 取决于客户端请求 URI 的原始服务器 (D)
根据来自 (A) 的客户端请求,(B) 可以将请求路由到不同的原始服务器(多个 cache_peer 线路)。请求必须经过 (C) 才能到达 (D),因为 (C) 是从网络到互联网的唯一途径。此外,确定去往何处的逻辑在于 (B)。
我们无法访问或控制(A)和(C)。
假设我在 (B) 中有以下 cache_peer 行,并且 (C) 的地址是“forward-proxy.example.com:3128”。
cache_peer origin-x.example.com parent 443 0 no-query originserver ssl
cache_peer origin-y.example.com parent 443 0 no-query originserver ssl
cache_peer origin-z.example.com parent 443 0 no-query originserver ssl
配置 (B) 使用“forward-proxy.example.com:3128”(C) 作为原始服务器 (D) 的正向代理的语法是什么?
谢谢!
答案1
是的,这是可能的,尽管可能不是你所想的那样。
您谈论了很多关于 C 的事情,好像它很重要;既然您无法控制它,就不要再担心它了。除非有多个 C,并且可用于选择您的原始服务器,否则 C 完全无关紧要……它只是碍事(并且确实会阻止您使用更直接的方法来选择原始服务器)。
在这种情况下,您无法使用 cache_peer 指令确定原始服务器;cache_peer 配置 Squid 如何与其他代理通信,而不是原始服务器。由于您无法控制中间的 Squid,因此您无法直接根据原始服务器执行任何选择;即正向代理始终会转到您请求的域名,并且不会基于您在 B 处的选择标准。(如果您可以控制其他 Squid,您将拥有更多选择。)
实现您想要的一种方法是给您的原始服务器一些额外的名称,以便您的第一个 Squid(B)可以根据 URI 将请求重写为新的域名,而中间的 squid 可以根据域名发出请求。
您可以使用 url_rewrite_helper 选项利用重写程序以您选择的任何方式更改 URL。如果是我,我可能会为每个源服务器创建一个新名称(a、b、c 等),然后根据您拥有的任何数据重写这些名称。因此,如果您的 URI 是“http://domain.tld/a/image.png“你可以将其重写为”http://a.domain.tld/图片.png“, 和 ”http://domain.tld/b/image.png“ 到 ”http://b.domain.tld/图片.png“。
当然,您需要配置原始服务器以在这些新域上应答,并可能将其配置为从接收的混合 URI 中重建 URI。
参考:
http://www.squid-cache.org/Doc/config/url_rewrite_program/
以及重写器信息和示例重写程序:
http://wiki.squid-cache.org/Features/Redirectors#Using_a_re-writer_to_mangle_the_URL_as_it_passes
您还可以跳过让第一个 squid 确定来源的步骤,让来源应用程序以任何合理的方式跨域分发您的请求,方法是告诉客户端从正确的服务器发出请求。希望这对您有所帮助。