【问题标题】:Using Varnish with multiple apache named vhosts将 Varnish 与多个名为 vhost 的 apache 一起使用
【发布时间】:2023-03-26 03:17:01
【问题描述】:

我正在为具有大量 (1000+) 命名虚拟主机(在 Apache 上)的服务器实施 Varnish (4.0),其中大多数都指向相同的 IP 和 Web。我让 Varnish 可以正常工作:

backend default {
  .host = "127.0.0.1";
  .port = "80";
}
sub vcl_recv {
if (req.http.host ~ "^www.domain1.de(:[0-9]+)?$") {
    set req.http.host = "www.domain1.de";
 } else if (req.http.host ~ "^www.domain2.de(:[0-9]+)?$") {
    set req.http.host = "www.domain2.de";
 }
 ....
 ....
 set req.backend_hint = default;
}

但是,为 1000 多个域执行此操作似乎有点奇怪。我不需要对站点进行任何特殊配置,它们的后端都相同。

如果我不添加任何特定配置,我只会进入标准网站(无论我输入什么域)。

关于如何解决这个问题的任何提示? 谢谢!

【问题讨论】:

  • 你想用你在例子中展示给我们的东西来实现什么?
  • 如前所述,它会像这样到达正确的域。但我需要重复这个超过 1000 次......
  • 我的意思是,如果请求主机已经包含正确的主机名,为什么还要设置host?无需再次显式设置。

标签: apache varnish varnish-vcl


【解决方案1】:

例如,如果您希望删除端口名称,或者需要对 req.http.host 进行一些一般性更改,您可以在您的 varnish VCL 中使用 regsub() 方法:

set req.http.host = regsub(req.http.host , "(.*)(:[0-9]+|)" , "\1" );

此示例删除端口号(如果存在)。
请根据您的需要设置正则表达式,因为您的问题并未真正说明您要实现的目标。

请注意,您可以通过 \Nnot 调用替换字符串作为 $1,正如某些 man 页面所建议的那样。 (已经提交了一个错误来解决这个问题。)

最后还有一个不错的 Varnish 正则表达式备忘单:
http://kly.no/varnish/regex.txt

【讨论】:

  • 感谢正则表达式提示!看来我的端口存在后端问题(我先用不同的端口进行了测试),这就是解决方案,并且使用标准端口我不再需要任何特殊配置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
  • 2014-12-13
  • 2014-05-03
  • 1970-01-01
  • 2018-10-06
  • 2015-08-03
  • 2012-08-21
相关资源
最近更新 更多