如何使用inline-c选择清漆后端

时间:2013-07-03 15:59:27

标签: c varnish varnish-vcl

根据请求uri,我想使用来自mysql数据库的数据将带有varnish的请求转发到不同的服务器。该数据库包含2个字段:name和base_url。如果请求转到/转发/%name%,我想将请求转发到base_url定义的服务器/后端。我首先尝试使用VRT_SetHdr设置现有后端,但这不起作用:

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

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

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

1 个答案:

答案 0 :(得分: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";
    }
  }
  # ...
}