如果服务器不可用,如何让 Nginx 立即触发 504?

如果服务器不可用,如何让 Nginx 立即触发 504?

我将 Nginx 设置为具有基于 Cookie 粘性的负载均衡器。逻辑如下:

  1. 如果不存在 cookie,则使用循环从集群中选择一个服务器。

  2. 如果存在 cookie,则转到与 cookie 值关联的服务器。然后服务器负责设置 cookie。

    我想补充的是:

  3. 如果 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;
}

就是这样!来自文档

高血压

相关内容