我偶尔会遇到第 7 层运行状况检查失败的情况。这种情况在生产机器上似乎是随机发生的,可能每分钟一次或平均每几分钟一次。这是配置:
backend api
mode http
option httpchk GET /api/v1/status HTTP/1.0
http-check expect status 200
balance roundrobin
server api1 127.0.0.1:8001 check fall 3 rise 2
server api2 127.0.0.1:8002 check fall 3 rise 2
HAproxy 日志告诉我以下内容:
Health check for server api/api2 failed, reason: Layer7 timeout, check duration: 10001ms, status: 2/3 UP.
奇怪的是,当我运行脚本以比 HAproxy 快得多的速度获取相同的 URL 时,它永远不会返回 200 响应。它永远不会像 HAproxy 那样挂起。
此外,我偶尔会收到各种 API 调用的 HAProxy 错误,而不仅仅是运行状况检查,所有这些看起来都非常相似:
https-in~ api/api1 45/0/0/-1/30045 504 194 - - sHVN 50/49/13/10/0 0/0 "POST /api/v1/accounts HTTP/1.1"
这可能是什么问题?这个真的把我难住了
您已将
haproxy
配置为使用 HTTP 1.0
(这也是默认设置)发送运行状况检查。
GET /api/v1/status HTTP/1.0
content-length: 0
curl
等价物是:
curl --http1.0 http://127.0.0.1:8001/api/v1/status
确保您的后端服务器正确处理此问题。
您可能想切换到
HTTP/1.1
:
backend api
option httpchk GET /api/v1/status HTTP/1.1
...
对于偶尔的失败,请考虑重试请求,尽管这可能表明应用程序服务器端存在某些问题(注意,需要
haproxy >= 2.0
)
backend api
option redispatch
retry-on empty-response conn-failure
查看haproxy博客了解更多详情。