当尝试加载 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->ws
是struct ws
[bin/varnishd/cache.h:126],它是一个“工作区结构”。r 成员是该工作区的保留长度。htc->rxbuf
指的是struct txt
[bin/varnishd/cache.h:109],但没有注释描述成员 (b 和 e) 指的是什么。也许是开始和结束?
我不知道工作区是如何调整大小的(或者即使它们被调整了大小),但是 - 而且我真的只是在猜测 - 我认为问题的一些可能原因是:
- 大量标头
- 非常长的标头
- Varnish 调整工作区大小时出现错误(如果可以的话)
通过搜索以下内容来尝试找到强制发生错误的点可能会很有用:
- 标头长度
- 标题数量
看看是否能可靠地重现该问题。
您可以通过增加http_headers
运行时选项来解决该问题。(如果您运行的是 <2.1,我认为这是一个编译时或配置时选项)