我一直在为这个问题奋斗了几个星期,而且我正在用尽想法。 我运行HAProxy来根据请求的path/头来在3个后端之间进行代理请求。
我的后端是:
最后一个后端(prerender.io)似乎没有问题(虽然stream量很小)。 另外两个随机返回504错误给客户(大约每分钟根据日志,但没有明确的模式)。
这是我的(消毒)configuration:
defaults log global mode http option httplog option dontlognull timeout connect 5s timeout client 120s timeout server 120s frontend foobar mode http bind *:80 bind *:443 ssl crt /etc/ssl/certs/foobar.com.pem redirect scheme https code 301 if !{ ssl_fc } default_backend s3 acl api path_beg -i /api/ use_backend node if api acl user-agent-bot hdr_sub(User-Agent) -i baiduspider twitterbot facebookexternalhit use_backend prerender if user-agent-bot backend s3 mode http http-request set-path /index.html reqirep ^Host: Host:\ my-bucket.s3-website-us-east-1.amazonaws.com reqidel ^Authorization:.* rspidel ^x-amz-id-2:.* rspidel ^x-amz-request-id:.* server s3 my-bucket.s3-website-us-east-1.amazonaws.com:80 check inter 5000 backend node mode http balance roundrobin option forwardfor server api01 1.2.3.4:3333 check server api02 5.6.7.8:3333 check backend prerender mode http server prerender service.prerender.io:443 check inter 5000 ssl verify none http-request set-header X-Prerender-Token my-secret-token reqrep ^([^\ ]*)\ /(.*)$ \1\ /https://app.wwoof.fr/\2
我自己也经历过那些访问这个网站的504人。 我所要做的就是刷新页面,并立即再次运行。 在获取这些504之前,我不必等待120秒(服务器超时),它们会根据请求立即显示。
来自日志的示例(消毒)错误:
Sep 28 14:27:13 node/api01 0/0/1/-1/1 504 195 - - sR-- 38/38/30/14/0 0/0 "GET /api/hosts/2266 HTTP/1.1" Sep 28 14:34:15 node/api02 0/0/0/-1/0 504 195 - - sR-- 55/55/41/25/0 0/0 "GET /api/hosts/4719 HTTP/1.1" Sep 28 14:34:15 node/api01 0/0/1/-1/1 504 195 - - sR-- 54/54/41/16/0 0/0 "GET /api/hosts/2989 HTTP/1.1" Sep 28 14:38:41 node/api01 0/0/1/-1/1 504 195 - - sR-- 50/50/47/25/0 0/0 "POST /api/users HTTP/1.1" Sep 28 14:42:13 node/api02 0/0/1/-1/1 504 195 - - sR-- 134/134/102/49/0 0/0 "POST /api/users HTTP/1.1" Sep 28 14:42:29 node/api02 0/0/1/-1/1 504 195 - - sR-- 130/130/105/51/0 0/0 "GET /api/hosts/1634 HTTP/1.1"
我有类似的日志s3后端。 我看了文档,了解sR含义。 第一个字符是报告导致会话终止的第一个事件的代码:
s:在等待服务器发送或接收数据时,服务器端超时过期。
第二个字符表示closures时的TCP或HTTP会话状态:
R:代理正在等待来自客户端的完整,有效的请求(仅限于HTTP模式)。 什么都没有发送到任何服务器。
这个组合sR对我来说没有意义。 服务器如何设置为120秒超时? 为什么第二个字母是指客户? 这些信似乎是矛盾的。
0/0/1/-1/1部分代表时间。 长话短说,这表明我们不要等待120秒,它马上就失败了。
s3和Node.js后台都有这个完全相同的问题。 我曾经用Nginx把所有东西都放在前面,而且工作的很好,所以我几乎肯定了,这和我的configuration有关。 任何意见或build议debugging这个?
我想我终于明白了。 解决scheme包括增加timeout值:
timeout connect 20s timeout client 10m timeout server 10m
我不知道为什么客户端/服务器超时从2分钟到10分钟解决了这个问题。 我相信这与keep-alive有关,HAProxy保持与S3 / Node的开放连接。
希望这可以帮助!