gpt4 book ai didi

Varnish :有条件地清除缓存以确保资源是最新的

转载 作者:行者123 更新时间:2023-12-03 17:46:59 27 4
gpt4 key购买 nike

假设我有一个“资源” - http://localhost/doc ,我希望它一直被 Varnish 缓存 因为它经常被访问, 除了 有人通过 POST 更新它,POST 更新完成后,所有进一步的请求都应该检索最新版本的“文档”。

我的想法是将此逻辑包装在我的后端服务器中,因为默认情况下 POST 请求将通过 Varnish 而不进行缓存,而在我的后端服务器中,我可以:

  • 执行命令:varnishadm -T 127.0.0.1:6082 purge req.url == "/doc"
  • 发出 HTTP 清除请求:curl -X PURGE http://localhost/doc

  • 但是,它需要我配置 VCL 以支持“ Cache-Control” header !
    我的 VCL 如下所示,但不起作用:
    sub vcl_fetch {
    if (beresp.http.Cache-Control ~ "no-cache") {
    purge;
    }
    return (deliver);
    }
    acl purgers { "127.0.0.1"; }

    sub vcl_recv {
    if (req.request == "PURGE") {
    if (!client.ip ~ purgers) {
    error 405 "Method not allowed";
    }
    return (lookup);
    }
    }
    sub vcl_hit {
    if (req.request == "PURGE") {
    #purge;
    purge("req.url ~ " req.url);
    error 200 "Purged";
    }
    }
    sub vcl_miss {
    if (req.request == "PURGE") {
    purge;
    error 200 "Purged";
    }
    }
    sub vcl_pass {
    if (req.request == "PURGE") {
    error 502 "PURGE on a passed object";
    }
    }

    它提示:
    Message from VCC-compiler:
    Expected ';' got '('

    (program line 174), at
    ('input' Line 154 Pos 14)
    purge("req.url ~ " req.url);
    -------------#-----------------------

    Running VCC-compiler failed, exit 1

    VCL compilation failed
  • 问题 1:如何更新 VCL 以实现我的目标?
  • 问题 2:我
    认为这是一个很常见的场景:缓存资源同时保留它
    最新的,那么使用实现这一目标的最佳实践是什么
    漆?

  • 感谢您的任何回应!

    最佳答案

    当文档更新时,您的应用程序服务器可以发出清除URL的请求。它需要为文档发送PURGE请求,而不是GET请求。

    另外,当您收到该网址的POST时,可以对该网址发布禁令。

    关于 Varnish :有条件地清除缓存以确保资源是最新的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14229301/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com