【问题标题】:How to detect backend liveness with Varnish and Nginx如何使用 Varnish 和 Nginx 检测后端活跃度
【发布时间】:2020-11-30 18:17:30
【问题描述】:

我有一个 Varnish 服务器,它位于 Web 服务前面的 Nginx 服务器上(实际上它们都在 k8s 中并且有多个副本,但这似乎与问题无关)。

在 Varnish 中,我需要检测后端状态,以便我可以控制宽限期的长度并相应地提供陈旧数据。问题是 Varnish 的后端是 Nginx,因此健康检查是针对 Nginx 本身的,而不是针对底层服务的。

这当然导致的问题是,如果实际服务出现故障,Nginx 仍在工作,而 Varnish 认为一切都很好,并拒绝相应地延长宽限期。

关于如何摆脱这个难题的任何想法?我一直在尝试让 nginx 暴露底层服务的健康状况,但无济于事。

谢谢

【问题讨论】:

    标签: nginx varnish varnish-vcl


    【解决方案1】:

    可以为您的原始 Web 应用程序定义一个额外的后端,并对其进行健康探测。

    通过std.healthy()你可以判断它是否健康,并相应地调整恩典。

    这是一个 VCL 示例:

    vcl 4.1;
    import std;
    
    probe health {
        .url = "/healthz";
    }
    
    backend proxy {
        .host = "proxy.example.com";
        .port = "80";
        .probe = health;
    }
    backend webapp {
        .host = "webapp.example.com";
        .port = "80";
        .probe = health;
    }
    
    sub vcl_recv {
        if(std.healthy(webapp)){
            set req.grace= 10s;
        } 
    }
    
    sub vcl_backend_response {
         set beresp.grace = 24h;
    }
    
    

    此示例将设置 24 小时的标准宽限期,但如果后端运行良好,则它强制执行的宽限期仅为 10 秒。

    默认选择proxy 后端,因为它是首先定义的。 webapp 后端仅用于轮询。

    【讨论】:

    • 谢谢。既然你这么说,这似乎很明显。唯一的区别是支票是if(std.healthy(webapp) && std.healthy(proxy)) {。与问题本身无关,但现在的问题是,在运行状况检查意识到后端已关闭所需的时间内,超过 10 秒宽限期的请求会导致缓存失效。
    • 要么增加beresp.grace,要么通过更改.interval 属性和.window.threshold 比率来调整probe 设置。调整probe 设置将导致更快的疾病检测。 varnishlog -g raw -i backend_health 将帮助您检查探针的状态。
    猜你喜欢
    • 2020-09-29
    • 2016-11-18
    • 2013-12-19
    • 2020-09-12
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    相关资源
    最近更新 更多