haproxy 504超时到apache

时间:2017-06-21 18:50:07

标签: apache haproxy

除了我们正在获得的504问题之外,对haproxy和爱它很新。相关的日志输出是:

Jun 21 13:52:06 localhost haproxy[1431]: 192.168.0.2:51435 [21/Jun/2017:13:50:26.740] www-https~ beFootprints/foorprints 0/0/2/-1/100003 504 195 - - sH-- 2/2/0/0/0 0/0 "POST /MRcgi/MRlogin.pl HTTP/1.1"
Jun 21 13:54:26 localhost haproxy[1431]: 192.168.0.2:51447 [21/Jun/2017:13:52:46.577] www-https~ beFootprints/foorprints 0/0/3/-1/100005 504 195 - - sH-- 2/2/0/0/0 0/0 "POST /MRcgi/MRlogin.pl HTTP/1.1"
Jun 21 14:15:57 localhost haproxy[1431]: 192.168.0.1:50225 [21/Jun/2017:14:14:17.771] www-https~ beFootprints/foorprints 0/0/2/-1/100004 504 195 - - sH-- 3/3/0/0/0 0/0 "POST /MRcgi/MRlogin.pl HTTP/1.1"
Jun 21 14:22:26 localhost haproxy[1431]: 192.168.0.1:50258 [21/Jun/2017:14:20:46.608] www-https~ beFootprints/foorprints 0/0/2/-1/100003 504 195 - - sH-- 2/2/0/0/0 0/0 "POST /MRcgi/MRlogin.pl HTTP/1.1" 

在haproxy.cfg中使用以下超时值

defaults
        log     global
        mode    http
        option forwardfor
        option  httplog
        option  dontlognull
        timeout connect 5000
        timeout client  50000
        timeout server  100000

在Ubuntu 16.04.2 LTS上运行

非常感谢任何帮助和评论!

2 个答案:

答案 0 :(得分:5)

问题似乎与Web服务器有关。检查那里的日志,你应该找到长时间运行的请求。

以下是我的结论。

在日志中记下sH--。这是session state at disconnection。它对于故障排除非常有价值。这些值是位置和区分大小写的。

  

s :等待服务器发送或接收数据时,服务器端超时已到期。

...所以,timeout server被解雇了,而......

  

H :代理正在等待来自服务器的完整有效响应HEADERS(仅限HTTP)。

服务器尚未完成(可能甚至没有启动)将所有响应标头撤回到代理,但是已建立连接并且已发送请求。

HAProxy返回504 Gateway Timeout,表示后端没有及时响应。

如果你的后端需要超过100秒(?!),那么你需要增加timeout server。否则,您的Apache服务器似乎有一个问题太慢而无法响应。

答案 1 :(得分:0)

我遇到了类似的问题,发现问题出在我如何配置后端服务器部分。

backend no_match_backend
  mode http
  balance roundrobin
  option forwardfor
  option httpchk HEAD / HTTP/1.1\r\nHost:\ example.com
  server nginx-example 192.168.0.10 check port 80

我的问题是我没有指定连接端口。 通过HTTP连接时可以使用,但是由于我的haproxy终止了SSL。 这尝试通过443连接到后端。 由于后端无法/无法正确通信。使用haproxy的SSL会话和导致网关超时的后端的设置。 我需要强制将未加密的通信发送到后端。

backend no_match_backend
  mode http
  balance roundrobin
  option forwardfor
  option httpchk HEAD / HTTP/1.1\r\nHost:\ example.com
  server nginx-example 192.168.0.10:80 check port 80

很难发现server nginx-example 192.168.0.10 check port 80的更改,而在IP :80之后是192.168.0.10:80

由于配置了SSL重定向的后端服务器使此问题变得更加复杂。因此,我所有的请求都将以HTTP的形式到达并重定向到HTTPS。因此,很难确定问题出在哪里。一世 看起来https请求已正确重定向到后端服务器。我需要在后端服务器上禁用此重定向,并将其转发到haproxy config