在“探测”标记服务器不健康之前,在 Varnish 4 中错误获取后交付过时的内容

2024-05-04

我在用着stale-if-error在服务器被标记为不健康的情况下提供过时的内容grace and keep中的对象选项vcl_hit.

问题是:进入vcl子程序后是否可以传递一个缓存对象vcl_backend_error(新请求错误)。实际上,我在以下位置交付缓存对象vcl_hit但看下一张图,我不明白如何访问该请求的缓存对象。

Source: https://www.varnish-software.com/book/4.0/chapters/VCL_Basics.html https://www.varnish-software.com/book/4.0/chapters/VCL_Basics.html


使用内置VCL时(见下面的代码):

# Built-in 'vcl_hit'.
sub vcl_hit {
    if (obj.ttl >= 0s) {
        return (deliver);
    }

    if (obj.ttl + obj.grace > 0s) {
        return (deliver);
    }

    return (fetch);
}
  • If vcl_backend_error由后台/异步后端获取触发return (deliver) during vcl_hit你不用担心。它只是一个更新停滞对象的后台线程。停滞的内容已经交付给客户。

  • If vcl_backend_error由触发的同步后端获取到达return (fetch) during vcl_hit你也不必担心。错误将会传递给客户端,但你别无选择。停滞的对象在 Varnish 存储中不可用。

但是,如果您已定制vcl_hit当后端健康时限制宽限(参见下面的VCL示例代码),return (fetch)期间执行vcl_hit将作为同步后端请求进行处理。客户端将等待后端响应。如果后端请求达到vcl_backend_error并且错误将被传递到客户端。 Varnish 存储中存在一个已停止的对象(在此示例中已停止超过 60 秒),但不会使用它。

# Customised 'vcl_hit'.
sub vcl_hit {
    if (obj.ttl >= 0s) {
        return (deliver);
    }

    if (std.healthy(req.backend_hint)) {
        if (obj.ttl + 60s > 0s) {
            return (deliver);
        }
    } else {
        if (obj.ttl + obj.grace > 0s) {
            return (deliver);
        }
    }

    return (fetch);
}

如果您想在同步后端获取失败时传递停滞的对象,在这种情况下您需要一些额外的 VCL 逻辑。这个想法如下面的代码所示:

backend fail_be {
    .host = "127.0.0.1";
    .port = "9000";
    .probe = {
        .url = "/give-me-a-non-200-please";
        .interval = 24h;
        .timeout = 1s;
        .window = 1;
        .threshold = 1;
    }
}

sub vcl_recv {
    # Force the non-healthy backend in case of restart because of a previous
    # failed backend fetch. This will force serving stalled content using
    # full grace during 'vcl_hit' (if possible).
    if (req.restarts == 0) {
        unset req.http.X-Varnish-Restarted-5xx;
    } else {
        if (req.http.X-Varnish-Restarted-5xx) {
            set req.backend_hint = fail_be;
        }
    }

    # ...
}

sub vcl_synth {
    # 503 generated for synchronous client requests when abandoning the
    # backend request (see 'vcl_backend_fetch') and not executing a POST.
    if (resp.status == 503 &&
        req.method != "POST" &&
        !req.http.X-Varnish-Restarted-5xx) {
        set req.http.X-Varnish-Restarted-5xx = "1";
        return (restart);
    }

    # ...
}

sub vcl_backend_fetch {
    if (bereq.retries == 0) {
        unset bereq.http.X-Varnish-Backend-5xx;
    } else {
        if (bereq.http.X-Varnish-Backend-5xx) {
            # Jump to 'vcl_synth' with a 503 status code.
            return (abandon);
        }
    }

    # ...
}

sub vcl_backend_response {
    if (beresp.status >= 500 && beresp.status < 600) {
        set bereq.http.X-Varnish-Backend-5xx = "1";
        return (retry);
    }

    # ...
}

sub vcl_backend_error {
    set bereq.http.X-Varnish-Backend-5xx = "1";
    return (retry);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在“探测”标记服务器不健康之前,在 Varnish 4 中错误获取后交付过时的内容 的相关文章

  • 配置 Magento 2 在 CentOS 7 上使用 Varnish

    页面速度或加载时间对于在线商店的成功至关重要 加载时间是加载特定页面上的内容所需的总时间 加载时间越长 转化率越低 这也是谷歌考虑确定搜索引擎排名的最重要因素之一 在第一篇文章中 我们在 CentOS 7 机器上安装了 Magento 2
  • 如何设置 Varnish 缓存控制标头

    我希望有人可以建议让 Varnish 发送缓存控制标头的正确方法 目前 我的配置正在发送 缓存控制 无缓存 给客户 预先感谢任何能够提供帮助的人 你的后端正在向 Varnish 发送 Cache Control no cache 这意味着两
  • HTTP 状态代码 206:什么时候应该使用它?

    The 206 状态码 w3 org 表示响应请求的部分结果Range header 所以 显然 如果请求的文件是例如1024 字节长 并且Range标头是bytes 0 512然后是状态码206 Partial Content应该被退回
  • Varnish + nginx + ELB 499 响应

    我有 varnish 4 服务器使用 nginx 作为连接到 ELB 的反向代理 每隔 2 天左右 我的服务器就会停止响应 我会在 nginx access log 中看到 499 个响应 重启nginx即可解决问题 为什么我开始收到这些
  • 当 php 应用程序位于 Varnish 后面时使用 Xdebug

    我正在尝试使用 PHPStorm 将 Xdebug 远程调试设置为位于 Varnish 后面的站点作为缓存层 Varnish 作为端口 80 上的前端 Apache 作为端口 8080 上的后端与之通信 如果我绕过 Varnish 并直接与
  • Varnish/Apache 随机 503 错误

    我在托管大约 30 个网站的 Rackspace 云服务器上运行 cPanel 我正在使用 Varnish 3 0 3 Apache 2 2 23 我收到随机 503 错误 如果我重新启动 httpd 进程 它们就会消失 我检查了 Apac
  • php 脚本查找 Web 服务器名称

    是否有任何 php 脚本可以查找 Web 服务器的名称 例如 apache varnish nginx 等 我了解 netcraft 和 wappalyzer 但我想要一个脚本在我的本地计算机上运行 主要原因是 我的本地机器中有4台服务器A
  • Varnish 和 ESI HTTP AUTH

    我对这个问题很迷茫 我不知道问题出在哪里 所以 我希望你能帮助我 我有 symfony 的 HTTP BASIC 身份验证 并且我正在尝试访问受此身份验证保护的 url 并在 Drupal 页面中使用标签 每个请求都会发送到 Varnish
  • 在 Varnish 正则表达式中提取捕获组内容

    我在 Varnish 配置语言中有以下正则表达式 abc a zA Z0 9 0 9 现在 我想获取值 2部分 即 0 9 Varnish 中的正则表达式 我怎样才能得到这个值 您可以使用regsub在这种情况下 set req url r
  • 用清漆+正则表达式替换页面中的内容

    如果我希望我的清漆缓存服务器在提供或存储页面 vcl fetch 之前从后端替换页面内的内容 即 更改 div 上的类 该怎么做 我想使用简单的正则表达式来执行替换 因为我想象清漆本身就支持它 Varnish 本身不支持修改响应正文 为此
  • 使用 HTTP 和 REGEX 清除 Varnish

    我想使用 HTTP 清除清漆中的元素 这个http调用是从varnish本身后面的后端服务器触发的 因此后端服务器除了HTTP之外没有其他访问权限 我已经使用相应的 ACL 实施了以下清除规则 该规则适用于 curl X PURGE htt
  • 使用 Varnish 时 Magento Onepagechekout 登录问题

    我在用着 Magento v1 7 0 2 Varnish 缓存 v3 0 3 和 IWD 的一页结账 OPC 模块 v2 0 9 我已将 一页结帐 和 一步结帐 路由添加到应从 Varnish 缓存中排除的路由中 我可以看到OPC页面没有
  • Varnish:清除说它有效,但不会删除旧内容

    我正在 Digital Ocean Ubuntu VM 上运行一个独立的 varnish 实例 它基本上工作正常 该设置用于承担位于其他地方的旧 WordPress 服务器的负载 这很有效 但我很难清除内容 当谈论清除时 我的意思是使 UR
  • Magento 多语言商店与清漆

    多语言 Magento 商店如何与 Varnish 配合使用 varnish 中是否有可用的配置 以便我们可以基于 cookie 创建缓存 如果您不介意语言位于不同的 url Turpentine 可以为您处理此问题 https githu
  • cookie 如何影响 Varnish 缓存?

    Varnish 缓存如何影响 Omniture 设置的第三方 Cookie 和 Google Analytics 设置的第一方 Cookie 到目前为止 我看到了反对的意见 有些人说因为跟踪统计数据是由 JavaScript 创建的 这是事
  • Varnish hit-for-pass 是什么意思?

    Varnish 版本 3 有一些用于不同操作的对象 例如 当它必须从后端检索数据时使用pass 当它在缓存中找到请求内容时使用hit 但我无法理解 hit for pass 的用法 Varnish什么时候使用它 我在网上没有找到任何有用的材
  • 清漆配置文件在哪里?

    我刚刚安装了清漆并准备好提供网页服务 问题是我们达到了打开文件限制 我们已经设定了ulimit给清漆用户 我们想要找到一个可以写入此配置的文件 Maximum number of open files NFILES 131072 Locke
  • 在“探测”标记服务器不健康之前,在 Varnish 4 中错误获取后交付过时的内容

    我在用着stale if error在服务器被标记为不健康的情况下提供过时的内容grace and keep中的对象选项vcl hit 问题是 进入vcl子程序后是否可以传递一个缓存对象vcl backend error 新请求错误 实际上
  • 如何在 Varnish 中禁用“传输编码:分块”编码?

    Using 清漆4 https www varnish cache org content varnish cache 400 我有一组后端以有效的方式响应Content Length标题和没有Transfer Encoding heade
  • 通过 ESI:include 设置 Cookie,如何?

    我正在尝试使用 esi 在我的网站上创建忍者缓存 这个想法是 该网站大部分是静态的 我只需要在用户是否登录时做一些花哨的事情 所以我试图在页面A上放置一个 并在页面B的应用程序中设置触发器 这样我就可以将页面 A 缓存在 varnish 上

随机推荐