我将 Nginx 设置为具有基于 Cookie 粘性的负载均衡器。逻辑如下:
如果不存在 cookie,则使用循环从集群中选择一个服务器。
如果存在 cookie,则转到与 cookie 值关联的服务器。然后服务器负责设置 cookie。
我想补充的是:
如果 cookie 存在,但是服务器已关闭,则回退到循环步骤来选择下一个可用的服务器。
所以实际上我有负载平衡,并想在其上添加故障转移支持。
我已经在指令的帮助下成功做到了这一点error_page
,但它并没有像我预期的那样工作。
问题:即使服务器物理上不可用,504(及其相关的后备)也会仅在 30 秒超时后触发。
因此,我希望 Nginx 立即触发 504(或任何其他错误,无所谓)(我猜这意味着:当 TCP 连接失败时)。这是我们可以在浏览器中看到的行为:如果我们在服务器关闭时直接访问它,浏览器会立即告诉我们它无法连接。此外,Nginx 似乎正在为 502 错误执行此操作:如果我故意错误配置我的服务器,Nginx 会立即触发 502。
配置(简化至基本内容):
http {
upstream my_cluster {
server 192.168.73.210:1337;
server 192.168.73.210:1338;
}
map $cookie_myCookie $http_sticky_backend {
default 0;
value1 192.168.73.210:1337;
value2 192.168.73.210:1338;
}
server {
listen 8080;
location @fallback {
proxy_pass http://my_cluster;
}
location / {
error_page 504 = @fallback;
# Create a map of choices
# see https://gist.github.com/jrom/1760790
set $test HTTP;
if ($http_sticky_backend) {
set $test "${test}-STICKY";
}
if ($test = HTTP-STICKY) {
proxy_pass http://$http_sticky_backend$uri?$args;
break;
}
if ($test = HTTP) {
proxy_pass http://my_cluster;
break;
}
return 500 "Misconfiguration";
}
}
}
免责声明:我与任何类型的系统管理都相距甚远,因此我可能会错过一些基础知识。
编辑:我对使用标准免费版 Nginx 的解决方案感兴趣,而不是 Nginx Plus。谢谢。
答案1
upstream appservers {
zone appservers 64k;
server appserv1.example.com weight=5;
server appserv2.example.com:8080 fail_timeout=5s slow_start=30s;
server 192.0.2.1 max_fails=3;
server reserve1.example.com:8080 backup;
server reserve2.example.com:8080 backup;
}
就是这样!来自文档
高血压