Varnish/Apache 随机 503 错误

Posted

技术标签:

【中文标题】Varnish/Apache 随机 503 错误【英文标题】:Varnish/Apache Random 503 Errors 【发布时间】:2013-04-12 01:50:40 【问题描述】:

我在托管大约 30 个网站的 Rackspace 云服务器上运行 cPanel。我正在使用 Varnish 3.0.3 + Apache 2.2.23。我收到随机的 503 错误。如果我重新启动 httpd 进程,它们就会消失。我检查了 Apache error_log,没有看到任何与 503 错误相关的内容。

这是我的 Varnish 配置:

backend default 
    .host = "198.61.161.65";
    .port = "8080";
    .connect_timeout = 600s;
    .first_byte_timeout = 600s;
    .between_bytes_timeout = 600s;
    

这是我的 Varnish 启动参数:

-a :80 -f /etc/varnish/default.vcl -T 127.0.0.1:6082 -t 120 -w 1,1000,120 -u varnish -g varnish -S /etc/varnish/secret -p http_max_hdr=256 -p http_resp_hdr_len=8192 -p http_range_support=on -s malloc,768M

我运行了 varnishlog 并记录了一些错误。它们都包含 TxResponse=Service Unavailable 。对我来说,这意味着 Apache 没有及时响应 Varnish 的请求。这是一个例子:

17 SessionOpen  c 74.133.75.136 54227 :80
17 ReqStart     c 74.133.75.136 54227 1219297893
17 RxRequest    c GET
17 RxURL        c /
17 RxProtocol   c HTTP/1.1
17 RxHeader     c Host: www.archerytrade.org
17 RxHeader     c User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:20.0) Gecko/20100101 Firefox/20.0
17 RxHeader     c Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
17 RxHeader     c Accept-Language: en-US,en;q=0.5
17 RxHeader     c Accept-Encoding: gzip, deflate
17 RxHeader     c DNT: 1
17 RxHeader     c Connection: keep-alive
17 VCL_call     c recv lookup
17 VCL_call     c hash
17 Hash         c /   
17 Hash         c www.archerytrade.org
17 VCL_return   c hash
17 VCL_call     c miss fetch
17 Backend      c 18 default default
17 FetchError   c http first read error: -1 0 (Success)
17 VCL_call     c error deliver
17 VCL_call     c deliver deliver
17 TxProtocol   c HTTP/1.1
17 TxStatus     c 503
17 TxResponse   c Service Unavailable
17 TxHeader     c Server: Varnish
17 TxHeader     c Content-Type: text/html; charset=utf-8
17 TxHeader     c Retry-After: 5
17 TxHeader     c Content-Length: 441
17 TxHeader     c Accept-Ranges: bytes
17 TxHeader     c Date: Wed, 17 Apr 2013 01:39:52 GMT
17 TxHeader     c X-Varnish: 1219297893
17 TxHeader     c Age: 0
17 TxHeader     c Via: 1.1 varnish
17 TxHeader     c Connection: close
17 Length      c 441
17 ReqEnd      c 1219297893 1366162792.398471832 1366162792.541639328 0.000244379 0.143036604 0.000130892
17 SessionClose c error
17 StatSess     c 74.133.75.136 54227 0 1 1 0 0 0 257 441

我已尝试将以下内容添加到我的 default.vcl 文件中:

sub vcl_recv 
set req.grace = 15s;
...


sub vcl_fetch 
if (beresp.status == 500 || beresp.status == 503) 
set beresp.saintmode = 10s;
return(restart);
 
set beresp.grace = 1h;
...

在出现一些 503 错误时,我在 Apache error_log 中发现了 php 致命错误、脚本头过早结束以及由于可能的配置错误,请求超出了 10 次内部重定向的限制。

我尝试增加/减少 Varnish 的内存和超时值。我尝试添加更高的 http_max_hdr 和 http_resp_hdr_len 值。

【问题讨论】:

【参考方案1】:

我们在这台服务器上使用 APC,分配的内存大小只有 96M。在增加了几次内存并跟踪使用情况后,我们选择了 312M。缓存命中率99.7%,碎片

【讨论】:

【参考方案2】:

以下是帮助我解决问题的原因:

执行以下命令后,我知道错误:

$ varnishlog -b -q 'FetchError'

错误为“- FetchError http first read error: EOF”,详情可查看varnish site

然后在设置“first_byte_timeout”后,问题就解决了:

backend default 
  .host = "127.0.0.1";
  .port = "8888";
  .connect_timeout = 1s; # Wait a maximum of 1s for backend connection (Apache, nginx, etc...)
  .first_byte_timeout = 5s; # Wait a maximum of 5s for the first byte to come from your backend
  .between_bytes_timeout = 2s; # Wait a maximum of 2s between each bytes sent

详情Varnish 503 Solutions

【讨论】:

以上是关于Varnish/Apache 随机 503 错误的主要内容,如果未能解决你的问题,请参考以下文章

在 Docker 后面运行的 Nginx 上出现随机 502/503 错误(在 ECS 集群 + ALB 上)

来自 Azure 前门的 503 错误或空白页

YouTube V3 API - Google.Apis.Requests.RequestErrorBackend 错误 [503]

显然随机内存耗尽错误

谷歌浏览器返回 503 服务不可用

网页503错误