【问题标题】:Varnish triggering 503 without timeout清漆触发503没有超时
【发布时间】:2018-02-20 05:03:51
【问题描述】:

免责声明:我们正在将一些服务器从 Windows 迁移到 Linux,因此您会在这里看到一些不寻常的架构。

我们的后端服务器之间有以下通信:

客户端 -> Apache Httpd(解密 SSL - 运行 Windows 服务器)-> Varnish 缓存(转发代理和 HTTP 缓存 - 运行 Ubuntu 16)-> Apache Tomcat(应用服务器 - 运行 Windows 服务器)。

我们有大约 200 个活跃用户在高峰时间和一个 Ajax 调用每秒验证用户连接。

我们的客户有时会收到来自此 Ajax 请求的 503(后端获取失败 - 大师冥想)。我首先认为这会是某种应用程序服务器速度变慢,所以我将超时时间增加如下:

backend xxx {
    .host = "<%= $HOST_API %>";
    .port = "<%= $HOST_PORT %>";
    .first_byte_timeout = 1200s;
    .between_bytes_timeout = 1200s;
    .connect_timeout  = 10s;
}

但问题继续发生。所以我研究了修改 Apache Access Log 以记录请求在后端花费的时间:

配置是:

LogFormat "%h %l %u %t \"%r\" %>s %b **%T/%D**" commomWithTime

所以时间会显示为 *TIME_IN_SECONDS/TIME_IN_MILISECONDS*

当我收到 503 错误时,我将收到以下行:

200.201.175.53 - - [11/Sep/2017:17:16:06 -0300] "GET /sistema/verificarDesconexao?_=1505154046861 HTTP/1.1" 503 286 **0/0**

所以 Apache 告诉我 Varnish 立即返回了 503 错误!这种情况下,不可能是超时错误吧?

这里有一条带有 503 错误的 Varnishlog 消息(我不得不修改一些敏感部分):

*   << BeReq    >> 179699819
-   Begin          bereq 179699818 pass
-   Timestamp      Start: 1505161516.061772 0.000000 0.000000
-   BereqMethod    GET
-   BereqURL       /sistema/verificarDesconexao?_=1505153165280
-   BereqProtocol  HTTP/1.1
-   BereqHeader    Host: 10.1.1.135
-   BereqHeader    Accept: application/json, text/javascript, */*; q=0.01
-   BereqHeader    X-Requested-With: XMLHttpRequest
-   BereqHeader    User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36
-   BereqHeader    Content-Type: application/json;charset=ISO-8859-1
-   BereqHeader    Referer: https://www.sistema.com.br/sistema/
-   BereqHeader    Accept-Encoding: gzip, deflate, br
-   BereqHeader    Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4
-   BereqHeader    Cookie: JSESSIONID=0334D2460BD8E8AE9299E546AEB2838F; logo=Axis; idiomaSelecionado=pt_BR
-   BereqHeader    X-Forwarded-Host: www.sistema.com.br
-   BereqHeader    X-Forwarded-Server: www.sistema.com.br
-   BereqHeader    X-Forwarded-For: [IP], 10.1.1.177
-   BereqHeader    X-Varnish: 179699819
-   VCL_call       BACKEND_FETCH
-   VCL_return     fetch
-   FetchError     no backend connection
-   Timestamp      Beresp: 1505161516.062073 0.000301 0.000301
-   Timestamp      Error: 1505161516.062079 0.000307 0.000006
-   BerespProtocol HTTP/1.1
-   BerespStatus   503
-   BerespReason   Service Unavailable
-   BerespReason   Backend fetch failed
-   BerespHeader   Date: Mon, 11 Sep 2017 20:25:16 GMT
-   BerespHeader   Server: Varnish
-   VCL_call       BACKEND_ERROR
-   BerespHeader   Content-Type: text/html; charset=utf-8
-   BerespHeader   Retry-After: 5
-   VCL_return     deliver
-   Storage        malloc Transient
-   ObjProtocol    HTTP/1.1
-   ObjStatus      503
-   ObjReason      Backend fetch failed
-   ObjHeader      Date: Mon, 11 Sep 2017 20:25:16 GMT
-   ObjHeader      Server: Varnish
-   ObjHeader      Content-Type: text/html; charset=utf-8
-   ObjHeader      Retry-After: 5
-   Length         286
-   BereqAcct      0 0 0 0 0 0
-   End

还有哪些情况会发生 Varnish 503 错误,我应该如何识别和解决它?

【问题讨论】:

    标签: apache varnish


    【解决方案1】:

    您的 varnish 似乎无法访问或连接您的后端服务器,如日志所示

    FetchError no backend connection
    

    您能否检查您是否可以从您的 varnish ping 后端并启动 http 连接?

    【讨论】:

    • 从数千个连接中,只有一些收到此 503 错误。我的意思是,所有客户端同时收到此消息一秒钟或更短时间。
    • 可能是网络暂时不可用?有没有办法验证这一点?
    • 您是否在日志中跟踪您的后端运行状况?尝试 grep 生病
    • 我没有设置探针。我还能做到吗?如何跟踪后端运行状况日志?
    • 您仍然可以定义探针。定义它并将其链接到您的后端声明。健康检查将出现在您的 varnishlog 中。
    猜你喜欢
    • 2021-09-30
    • 2016-09-21
    • 2012-10-14
    • 2015-09-24
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    相关资源
    最近更新 更多