【问题标题】:HAProxy random HTTP 503 errorsHAProxy 随机 HTTP 503 错误
【发布时间】:2012-12-09 07:10:16
【问题描述】:

我们设置了 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% 的时间没有错误。这些错误是随机发生的。

【问题讨论】:

  • 你找到答案了吗?我们有类似的东西。
  • 找到答案...请接受答案。

标签: haproxy


【解决方案1】:

我遇到了同样的问题。经过几天拔头发后,我发现了问题。

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

netstat -tulpn | grep 80

或者

sudo lsof -i:80

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

为了解决这个问题,我做了一个“kill xxxx”,其中 xxxx 是带有可疑统计信息的 pid。

【讨论】:

  • 天哪,谢谢。有超过 10 个进程监听端口 80。天哪。
  • 谢谢!!你刚刚救了我的命
  • 我的头发肯定被扯掉了 2 天。谢谢,谢谢
  • 快速提问,有点主题:两个进程怎么可能监听同一个端口?我不认为这是可能的。无论如何,谢谢你!
  • 你有我的英雄!!
【解决方案2】:

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

对于可能遇到此问题的其他人,请检查您的配置,看看您是否错误地将相同的“绑定”行放在配置的多个部分中。 Haproxy 不会在启动期间进行检查,我计划将此作为推荐的验证检查提交给开发人员。就我而言,我有 3 个不同的配置部分,并且我错误地将相同的 IP 绑定放在了两个不同的地方。关于是否使用正确的部分或使用不正确的部分大约是 50/50。即使使用了正确的部分,大约一半的请求仍然得到 503。

【讨论】:

  • 你刚刚拯救了我的一天!这正是我的问题! :O 非常感谢!
  • 这可能是比较流行的原因之一。经过 3 天的研究,这让我更加头疼。正在使用捆绑 haproxy 的 docker flow 代理,并且服务的配置创建了具有重复绑定的 haproxy 配置,导致所有其他请求都失败。我设置了 env var -e DEFAULT_PORTS=81,444 这导致默认端口和服务端口不再重复,所有工作都像魅力一样。唷。
  • 如果您的基础设施管理混乱,这特别难找...刚刚发现有人弄乱了我之前修复的配置,非常感谢您的评论。
  • 如果您像我一样是 haproxy 新手,那么很容易犯这个错误。如果我没有遇到这个问题并且没有找到这个答案,我就不会知道有多条绑定线是错误的。
【解决方案3】:

您的服务器可能共享一个在特定时间超时的公共资源,并且您的运行状况检查请求同时发出(因此同时将后端服务器拉出)。

您可以尝试使用 HAProxy 选项 spread-checks 来随机进行健康检查。

【讨论】:

    【解决方案4】:

    我遇到了同样的问题,因为 linux 机器上运行了 2 个 HAProxy 服务,但名称/pid/resources 不同。除非我停止不需要的实例,否则所需的实例会随机抛出 503 错误,例如 5 次中的 1 次。

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        我通过在后端添加 option http-server-close 解决了我的间歇性 503 问题。看起来uWSGI(上游)在keep-alive方面做得不好。不确定问题背后的真正原因,但在添加此选项后,此后再也没有看到过单个 503。

        【讨论】:

          【解决方案7】:

          不要在 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
          

          【讨论】:

            猜你喜欢
            • 2020-06-04
            • 2012-10-23
            • 2013-04-12
            • 2015-09-22
            • 2015-07-23
            • 1970-01-01
            • 2014-02-18
            • 2014-11-29
            • 1970-01-01
            相关资源
            最近更新 更多