使用 Varnish 替代 Apache2 作为反向代理

使用 Varnish 替代 Apache2 作为反向代理

我在用 Varnish ACL 替换 Apache2 反向代理规则时遇到了一些麻烦。

Apache 规则是:

<Location /MySite>
    ProxyPass       http://192.168.0.123/OtherSite
</Location>

我的 Varnish ACL:

if (req.url ~ "^/(?i)MySite") {
    set req.backend = myhost; # 192.168.0.123
    set req.url = regsub(req.url, "^/(?i)MySite", "/OtherSite");
    return (pipe);
}

这导致客户端的 URL 更改为“/OtherSite”,而我并不想发生这种情况。在这种情况下,当用户输入http://www.myhost.com/MySite,响应将用户浏览器重定向到http://www.myhost.com/OtherSite。我希望这个“重定向”只发生在 varnish 后端请求上,具有与 Apache 的 ProxyPass 相同的行为。

我怎样才能实现这个目标?

谢谢

答案1

请尝试以下操作:

sub vcl_recv {
  ...
  if (req.url ~ "(?i)^/MySite") {
    set req.backend = myhost;
    set req.url = regsub(reg.url, "(?i)^/MySite", "/OtherSite");
  }
  ..
  return (lookup);
}
  1. 正则表达式的选项必须在引号后面输入。参见此处:https://www.varnish-cache.org/docs/3.0/reference/vcl.html#regular-expressions
  2. 实际上,对于 Varnish,req.url 将以“/”开头,因为这是 URL 中端口后面的部分,或者(如果没有指定端口)是 URL 的主机部分。因此,您可以将“/?”替换为“/”。
  3. 只要您想将 Varnish 用作反向代理(即通过缓存加速 Web),就应该避免使用这个“return (pipe);”。这意味着流式传输后端数据,但不接触或缓存它。因此我删除了这一行。相反,您会看到默认方法“return (lookup);”来处理反向代理缓存中的请求。请参阅 Varnish 的流程图:https://www.varnish-software.com/static/book/VCL_Basics.html#vcl-request-flow

祝您使用 Varnish 愉快!

相关内容