页面加载缓慢时出现 Varnish 503

页面加载缓慢时出现 Varnish 503

当尝试加载 Web 服务器上需要更长时间生成的页面时,Varnish 不断抛出 503 服务不可用。

在 varnishlog 中我看到一个FetchError c http read error: 0错误,但我不太清楚它意味着什么。

我还尝试增加后端超时:

backend default {
    .host = "x.x.x.x";
    .port = "80";
    .connect_timeout = 600s;
    .first_byte_timeout = 600s;
    .between_bytes_timeout = 600s;
}

后端是 Apache 服务器。

所有其他页面运行正常。

有任何想法吗?

答案1

错误信息含义(行号引用参考varnish 2.1.3):

在获取标头 [bin/varnishd/cache_fetch.c:399] 时,可以执行以下操作之一:

a)发生溢出 [bin/varnishd/cache_httpconn.c:170]

或者

b)调用 read() 时发生错误 [bin/varnishd/cache_httpconn.c:175]

最后的数值是 errno 的值,因为它是 0(无错误),所以我会认为出现选项 a) 是因为read()如果不设置 errno,就不应该返回负数。

检测到溢出,以下代码 [bin/varnishd/cache_httpconn.c:167] 返回负面结果:

i = (htc->ws->r - htc->rxbuf.e) - 1;    /* space for NUL */

htc->wsstruct ws[bin/varnishd/cache.h:126],它是一个“工作区结构”。r 成员是该工作区的保留长度。htc->rxbuf指的是struct txt[bin/varnishd/cache.h:109],但没有注释描述成员 (b 和 e) 指的是什么。也许是开始和结束?

我不知道工作区是如何调整大小的(或者即使它们被调整了大小),但是 - 而且我真的只是在猜测 - 我认为问题的一些可能原因是:

  • 大量标头
  • 非常长的标头
  • Varnish 调整工作区大小时出现错误(如果可以的话)

通过搜索以下内容来尝试找到强制发生错误的点可能会很有用:

  • 标头长度
  • 标题数量

看看是否能可靠地重现该问题。

您可以通过增加http_headers运行时选项来解决该问题。(如果您运行的是 <2.1,我认为这是一个编译时或配置时选项)

相关内容