HAProxy随机HTTP 503错误

时间:2012-12-21 17:32:38

标签: haproxy

我们设置了3台服务器:

  • 使用Nginx + HAproxy执行负载平衡的服务器A
  • 后端服务器B
  • 后端服务器C

这是我们的/etc/haproxy/haproxy.cfg

global
        log /dev/log   local0
        log 127.0.0.1   local1 notice
        maxconn 40096
        user haproxy
        group haproxy
        daemon

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        retries 3
        option redispatch
        maxconn 2000
        contimeout      50000
        clitimeout      50000
        srvtimeout      50000
                stats enable
                stats uri /lb?stats
                stats realm Haproxy\ Statistics
                stats auth admin:admin
listen statslb :5054 # choose different names for the 2 nodes
        mode http
        stats enable
        stats hide-version
        stats realm Haproxy\ Statistics
        stats uri /
        stats auth admin:admin

listen  Server-A 0.0.0.0:80    
        mode http
        balance roundrobin
        cookie JSESSIONID prefix
        option httpchk HEAD /check.txt HTTP/1.0
        server  Server-B <server.ip>:80 cookie app1inst2 check inter 1000 rise 2 fall 2
        server  Server-C <server.ip>:80 cookie app1inst2 check inter 1000 rise 2 fall 3

所有三台服务器都有大量的RAM和CPU核心来处理请求

浏览时会显示随机HTTP 503错误:503 Service Unavailable - No server is available to handle this request.

还在服务器控制台上:

Message from syslogd@server-a at Dec 21 18:27:20 ...
 haproxy[1650]: proxy Server-A has no server available!

请注意,90%的时间没有错误。这些错误是随机发生的。

7 个答案:

答案 0 :(得分:26)

我有同样的问题。经过几天的拔毛,我找到了问题。

我运行了两个HAProxy实例。一个是僵尸,在某个更新或haproxy重启期间不知何故从未被杀过。刷新/ haproxy统计信息页面时我注意到了这一点,PID会在两个不同的数字之间发生变化。带有其中一个数字的页面具有荒谬的连接统计数据。确认我做了

netstat -tulpn | grep 80

并看到两个haproxy进程正在侦听端口80。

为了解决这个问题我做了一个“杀死xxxx”,其中xxxx是带有可疑统计数据的pid。

答案 1 :(得分:6)

在此处为遇到此完全相同问题的其他人添加我的答案,但上述解决方案均不适用。请注意,我的回答不适用于上面列出的原始代码。

对于可能遇到此问题的其他人,请检查您的配置,看看您是否可能错误地将其设置为&#34; bind&#34;在配置的多个部分中排队。 Haproxy在启动期间不会检查这一点,我计划将此作为推荐的验证检查提交给开发人员。在我的情况下,我有3个不同的配置部分,我错误地将相同的IP绑定放在两个不同的地方。关于是否使用正确的部分或使用了错误的部分大约是50/50。即使使用了正确的部分,大约一半的请求仍然得到503。

答案 2 :(得分:1)

您的服务器可能共享一个在特定时间超时的公共资源,并且您的健康检查请求同时进行(从而同时拉出后端服务器)。

您可以尝试使用HAProxy选项spread-checks随机化运行状况检查。

答案 3 :(得分:1)

我有同样的问题,因为Linux框中运行了2个HAProxy服务,但名称/ pid /资源不同。除非我停止不需要的操作,否则所需的实例会随机抛出503错误,例如5次中的1次。

尝试使用单个linux机箱进行多个URL路由,但在haproxy或我定义的haproxy的配置文件中看起来有限制。

答案 4 :(得分:0)

很难说没有更多细节,但是你是否有可能超过每个后端配置的maxconn? Stats UI在前端和单个后端上显示这些统计信息。

答案 5 :(得分:0)

我通过向后端添加option http-server-close解决了HAProxy间歇性503s的问题。看起来uWSGI(位于上游)在保持活动方面表现不佳。不知道问题的真正根源是什么,但是添加此选项后,此后再没有见过503。

答案 6 :(得分:0)

不要在 haproxy.cfg 的多个部分使用“绑定”行 例如,这将是错误的

frontend stats
bind *:443 ssl crt /etc/ssl/certs/your.pem
frontend Main
bind *:443 ssl crt /etc/ssl/certs/your.pem

像这样修复

frontend stats
bind *:8443 ssl crt /etc/ssl/certs/your.pem
frontend Main
bind *:443 ssl crt /etc/ssl/certs/your.pem