【问题标题】:How to select a varnish backend with inline-c如何使用 inline-c 选择清漆后端
【发布时间】:2014-02-19 08:59:51
【问题描述】:

根据请求 uri,我想使用 mysql 数据库中的数据将带有清漆的请求转发到不同的服务器。该数据库包含 2 个字段:name 和 base_url。如果请求转到 /forwards/%name% 我想将请求转发到由 base_url 定义的服务器/后端。我的第一次尝试是使用 VRT_SetHdr 设置现有后端,但这不起作用:

VRT_SetHdr(sp, HDR_REQ, "\010backend:", my_backend, vrt_magic_string_end);

也许可以设置一个像X-backend这样的header,然后用普通的VCL进行选择?

我还想使用来自 mysql 的相同数据在运行时定义后端。这可能吗?

【问题讨论】:

  • 另一种解决方案可能是从数据库数据中生成 VCL 文件并使用 varnishadm 重新加载它。出于性能原因,这可能是一个更好的解决方案。
  • 嗯,似乎有一个功能请求:varnish-software.com/blog/…

标签: c varnish varnish-vcl


【解决方案1】:

如您所说,如果设置了标头,则可以在 VCL 中切换后端,前提是每个后端都在 VCL 中预先声明:

vcl_recv {
  # ...
  if ( req.http.X-backend ) {
    set req.backend = req.http.X-backend;
  }
  # ...
}

编辑: 正如@Bhaskar 在他的评论中指出的那样,由于清漆结构分配限制,每个后端都需要一个额外的 if 。比如:

vcl_recv {
  # ...
  if ( req.http.X-backend ) {
    if ( req.http.X-backend == "predefined" ) {
      set req.backend = "predefined";
    }
  }
  # ...
}

【讨论】:

  • 这是不正确的,您不能将字符串 req.http.X-backend 分配给后端类型的结构。 varnish -C -f <vcl file> 应该显示相应的错误。
  • 你是对的,如果每个后端都需要它,则单独使用。对不起,我会编辑我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-21
  • 1970-01-01
  • 2017-07-21
  • 2016-08-19
  • 1970-01-01
  • 2014-10-16
  • 2012-04-20
相关资源
最近更新 更多