![HAProxy 健康检查和更改服务器状态](https://linux22.com/image/652252/HAProxy%20%E5%81%A5%E5%BA%B7%E6%A3%80%E6%9F%A5%E5%92%8C%E6%9B%B4%E6%94%B9%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%8A%B6%E6%80%81.png)
我查阅了大量文档,并在 Google 上搜索,但似乎找不到答案。我在几台服务器上使用 HAProxy,这些服务器需要一段时间才能启动——本地 VM 上的初始加载大约需要一两分钟。从查看调试日志来看,HAProxy 似乎会检查这些服务器,导致 4 级连接失败,然后将服务器标记为永久死亡。谷歌搜索没有显示重新触发健康检查的方法。
我的假设是它们会在延迟后再次发生,但我没有在日志中看到任何有关服务器正在重新检查的通知。如果我重新启动 HAProxy,它会检测到服务器已启动,但理想情况下它会将它们标记为死机几分钟,检测到它们已恢复,然后将它们重新纳入轮换。我也尝试发送 SIGHUP,但这只会打印上次检查结果的报告。配置手册有点让人不知所措。我遗漏了什么?
这是我的haproxy.cfg:
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
maxconn 1024
user proxy
group proxy
tune.ssl.default-dh-param 2048
ssl-default-bind-ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA:!NULL:!aNULL:!RC4:!RC2:!MEDIUM:!LOW:!EXPORT:!DES:!MD5:!PSK:!3DES
debug
defaults
log global
mode http
option httplog
option dontlognull
option forwardfor
option http-server-close
option redispatch
retries 3
timeout connect 5s
timeout client 50s
timeout server 50s
frontend http-in
bind *:80
bind *:443 ssl crt /etc/ssl/private/perceptronapp.com.pem no-sslv3
redirect prefix https://www.perceptronapp.com code 301 if { hdr(host) -i perceptronapp.com }
redirect scheme https if !{ ssl_fc }
use_backend blog if { path_beg /blog }
use_backend app
backend app
balance leastconn
cookie JSESSIONID insert nocache
server s1 s1.perceptron.skydns.local:3000 check inter 3m cookie s1
server s2 s2.perceptron.skydns.local:3000 check inter 3m cookie s2
backend blog
server s1 s1.ghost.skydns.local:2368 check inter 3m
答案1
搞清楚了。HAProxy 在启动时进行 DNS 解析,我曾怀疑过这一点,但很难确认,因为我的所有查询都让我回到配置手册。由于我拥有被查询的 DNS 基础设施和命名空间(Docker 容器中的 SkyDNS),我希望将其用于服务发现和 HAProxy 后端。根据这,但检查并快速扫描最新来源并未表明该应用已上线。
从那时起就切换到基于 confd 的配置文件生成和优雅重启。配置起来有点烦人,但似乎能完成工作。