我正在使用具有以下后端配置的 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
Run Code Online (Sandbox Code Playgroud)
服务器在 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.
Run Code Online (Sandbox Code Playgroud)
有没有办法结合这两个检查?
我现在理解的区别是 /check.txt实际上返回200 响应,但对应用程序的所有请求都返回 500。HAProxy 看到从代理请求返回的 500 响应并将服务器从池中取出,然后启动自己的服务器检查,收到 200 并将服务器放回池中。
解决方案是执行以下操作之一:
/check.txt
./check.txt
为包含足够逻辑的 Ruby 应用程序,以便在适当时在 200 和 500 响应之间进行选择。inter
将值设置为可笑的值,例如 3600。这应该给您一个小时的时间来进行测试或(如果服务器自行关闭)找出问题并将其恢复。inter
为较小的值(例如 60),但将rise
值设置为较高的值(例如 60)。这也会给您一个小时的时间,然后再将服务器添加回池中。 (注意,这两个被列在最后,因为它们可能是非常糟糕的主意。)