我正在使用 HAProxy 1.4.18,后端配置如下
backend staging
option httpchk HEAD /check.txt HTTP/1.0
http-check disable-on-404
default-server error-limit 1 on-error mark-down
server staging01 x.x.x.x:80 check observe layer7
server staging02 x.x.x.x:80 check observe layer7
服务器在 apache/passenger 上运行多个应用程序。
httpchk 和 disable-on-404 的组合允许正常关闭并从 lb 中轻松删除服务器,同时仍然能够直接访问(即用于测试)。
我正在尝试设置观察,以便在应用程序不工作时禁用服务器。我破坏了 staging02 上的应用程序配置,因此它总是返回 500。它在第一个 500 之后被正确标记为 DOWN,但在下一个 httpchk 中被标记为 UP。
这是日志文件:
Server staging/staging02 is DOWN, reason: Health analyze, info: "Detected 1 consecutive errors, last one was: Wrong http response". 1 active and 1 backup servers left. 2 sessions active, 0 requeued, 0 remaining in queue.
Server staging/staging02 is DOWN, reason: Health analyze, info: "Detected 1 consecutive errors, last one was: Wrong http response". 1 active and 1 backup servers left. 1 sessions active, 0 requeued, 0 remaining in queue.
Server staging/staging02 is UP, reason: Layer7 check passed, code: 200, info: "OK", check duration: 0ms. 2 active and 1 backup servers online. 0 sessions requeued, 0 total in queue.
有没有办法将这两项检查结合起来?
答案1
我现在理解的区别是/check.txt做实际上返回 200 响应,但对应用程序的所有请求都返回 500。HAProxy 看到从代理请求返回的 500 并将服务器从池中取出,但随后启动自己的检查,收到 200 并将服务器放回池中。
解决方案是执行以下任一操作:
- 配置 Apache 而不是应用程序,以便每个请求都返回 500 响应,即使是静态文件
/check.txt
。 - 更改
/check.txt
为一个 Ruby 应用程序,其中包含足够的逻辑以便在适当的时候在 200 和 500 响应之间进行选择。 - 设置
inter
价值变成 3600 这样荒谬的数字。这样应该会给你一个小时的时间进行测试或者(如果服务器自行宕机)找出问题并重新启动。 - 将值设置
inter
为较小的值,例如 60,但将rise
值设置为较大的值,例如 60。这也会给您一个小时的时间,然后服务器才会添加回池中。 (请注意,这两个列在最后,因为它们可能是非常糟糕的想法。)