我正在寻找一个可以静默处理服务器错误的 HTTP 负载平衡器。我想要的是平衡每个请求的负载,以便它能够正常工作,在最坏的情况下也会出现一点超时。
如果工作中的 Web 节点返回 HTTP 500 服务器错误,则负载平衡器必须使用另一个 Web 节点重试该请求。如果第二个节点确实返回另一个 500 错误,则对最后一个节点执行相同操作(我假设有 3 个节点)。如果最后一个节点返回 500 错误,则将其显示给最终用户。
如果服务器节点超时(需要 1 或 2 秒以上的时间来应答),则请求必须路由到另一台服务器,客户端应该在 2 秒以上的时间内收到好的答复。
答案1
你可以使用HttpProxy模块(它是相当标准的模块,通常位于 nginx 内部)来实现这样的负载均衡器。
Nginx 轻量、快速且具有很多功能(甚至可以在其中嵌入 lua 代码)。
您的用例的示例配置如下
upstream backend {
server 10.0.0.1;
server 10.0.0.2;
server 10.0.0.3;
}
server {
listen 80;
server_name _;
location / {
proxy_pass http://backend;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_redirect off;
proxy_buffering off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
秘诀是proxy_next_upstream指令,决定在什么情况下将请求传输到下一个服务器。可能的值包括:
- 错误 — 连接到服务器、向服务器发送请求或读取其响应时发生错误;
- 超时 — 与服务器连接、传输请求或从服务器读取响应时发生超时;
- invalid_header — 服务器返回一个空的或者不正确的答案;
- http_500 — 服务器返回代码 500
- http_502 — 服务器返回代码 502
- http_503 — 服务器返回代码 503
- http_504 — 服务器返回代码 504
- http_404 — 服务器返回代码 404
- off — 禁止将请求转移到下一个服务器
答案2
Apache 也可以通过两种方式实现此行为
第一个,使用 failonstatus
该指令是 mod_proxy 模块中的 failonstatus
例如,我曾经在生产环境中使用以下配置
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<Proxy "balancer://mycluster">
BalancerMember "https://bod_node3.wavin.com:8443" route=1 connectiontimeout=5 keepalive=On retry=1200
BalancerMember "https://bod.wavin.com:9443" route=2 connectiontimeout=5 keepalive=On retry=1200
ProxySet stickysession=ROUTEID
ProxySet lbmethod=bytraffic
ProxySet failonstatus=500,503,502
</Proxy>
第二种方法,我认为最好的选择是使用模块 mod_proxy_hcheck https://httpd.apache.org/docs/2.4/mod/mod_proxy_hcheck.html
目前,我正在使用此模块来检测后端问题
LoadModule proxy_hcheck_module modules/mod_proxy_hcheck.so
LoadModule watchdog_module modules/mod_watchdog.so
...
ProxyPass "/" "balancer://mycluster/" stickysession=JSESSIONID|jsessionid
<Proxy "balancer://mycluster">
BalancerMember "https://bod_node3.wavin.com:8443" route=node3 connectiontimeout=5 keepalive=On retry=1200 hcmethod=GET hcuri=/BOE/CMC/
BalancerMember "https://bod.wavin.com:9443" route=node4 connectiontimeout=5 keepalive=On retry=1200 hcmethod=GET hcuri=/BOE/CMC/
ProxySet lbmethod=bytraffic
</Proxy>
答案3
我猜你想提供 HTTP 服务?
Nginx 提供了很多功能,包括您正在寻找的所有功能:http://wiki.nginx.org
特别检查上游和代理设置,在那里您可以实现所有要求:http://wiki.nginx.org/HttpUpstreamModule http://wiki.nginx.org/HttpProxyModule
答案4
您在这里寻找的是代理或合理昂贵的负载均衡器。
在代理方面,squid/nginx 可以相对合理地完成工作 - 选择哪一个取决于个人喜好,但拥有足够的资源也很重要(如果没有,那么 nginx 无疑是最好的选择)
从硬件方面来看……F5 负载均衡器可以做这类事情,同时还能确保高可扩展性。