我把Nginx设置为一个基于cookie的粘性负载均衡器。 逻辑是:
如果该cookie存在,请转到与该cookie值关联的服务器。 服务器然后负责设置cookie。
我想补充的是这样的:
如果cookie存在,但服务器closures,则回退到select下一个可用服务器的循环步骤。
所以实际上我有负载平衡,并希望添加故障转移支持。
我设法通过error_page指令来实现这个function,但是它不能像我预期的那样工作。
问题: 504(和与之相关的回退)仅在30s超时后才会触发,即使服务器不可用。
所以我想要Nginx做什么是立即(当然,这意味着:当TCP连接失败)发射504(或任何其他错误,无所谓)。 这是我们在浏览器中可以看到的行为:如果我们在服务器closures时直接进入服务器,浏览器会立即告诉我们无法连接。 此外,Nginx似乎正在为502错误做这件事:如果我故意错误地configuration我的服务器,Nginx会立即触发502。
configuration (精简到基本):
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"; } } }
免责声明:我远离任何types的系统pipe理,所以我可能会在这里错过一些基本知识。
编辑:我感兴趣的解决scheme与标准的免费版本的Nginx,而不是Nginx Plus。 谢谢。
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; }
你走了! 从文档
HTH