如何用varnish缓存帖子请求?

时间:2015-07-21 12:28:01

标签: caching post request docker varnish

我将清漆与码头工具一起使用 - 请参阅million12/varnish

GET请求工作得很好!

但我不知道我必须在设置中设置什么来缓存POST请求。

谷歌上的

我发现很多帖子(从2010年或2011年开始),它说POST请求不能用清漆缓存 - 这个陈述是否仍然正确?

或者是否有另一种缓存POST请求的方法?

此处我的 varnish.vcl 设置:

vcl 4.0;
backend default {
    ...
}

# Respond to incoming requests.
sub vcl_recv {
  unset req.http.Cookie;
}

# Set a header to track a cache HIT/MISS.
sub vcl_deliver {
  if (obj.hits > 0) {
    set resp.http.X-Varnish-Cache = "HIT";
  }
  else {
    set resp.http.X-Varnish-Cache = "MISS";
  }
}

# Not cache 400 - 500 status requests
sub vcl_backend_response {
    if (beresp.status >= 400 && beresp.status <= 600) {
        set beresp.ttl = 0s;
  }
}

感谢您的帮助!

3 个答案:

答案 0 :(得分:5)

目前Varnish 无法缓存POST请求

AFAIK人尝试缓存POST请求失败。 Varnish似乎最终将这些转换为GET请求。

来源:

答案 1 :(得分:5)

有一个Varnish模块和缓存POST请求的教程。这增加了将帖子主体添加到散列键并传递POST请求的功能。

  

VMOD适用于Varnish 4版本,包括以下内容   功能:

buffer_req_body(BYTES size): buffers the request body if it is smaller
    than size. This function is a “better” (bug-free**) copy of
    std.CacheReqBody(), so please use this one instead of the one provided
    by the libvmod-std. Please note that retrieving req.body makes it
    possible to retry pass operations(POST, PUT).

len_req_body(): returns the request body length.

rematch_req_body(STRING re): regular expression match on request body.

hash_req_body(): adds body bytes to the input hash key.

https://info.varnish-software.com/blog/caching-post-requests-with-varnish https://github.com/aondio/libvmod-bodyaccess

请注意,在此VMOD的4.1分支中,使用内置std.cache_req_body()而不是buffer_req_body(),但Varnish 4.1中的常见错误会破坏4.1分支。 https://github.com/varnishcache/varnish-cache/issues/1927

答案 2 :(得分:0)

  • 将另一个ngnx / apache /无论放在未使用的端口上
  • 将POST请求推送到该服务器
  • 在那里你将它们作为get请求转发给varnish并获取结果
  • 通过您的中继服务器显示结果

可能会让整个事情变得缓慢 - 但我们在这里谈论肮脏的变通方法吗?希望这不是一个太疯狂的解决方案..