nginx在代理连接上重定向,而不是代理\u pass

nginx在代理连接上重定向,而不是代理\u pass,nginx,web,Nginx,Web,有3台服务器 运行nginx和两个后端服务器(server1、server2)的“server3” 已在服务器3上获得以下配置: server { listen 80; location @onerror { return 302 http://server2.com$request_uri; } location / { proxy_connect_timeout 1s; proxy_

有3台服务器

运行nginx和两个后端服务器(server1、server2)的“server3”

已在服务器3上获得以下配置:

server {
    listen       80;

    location     @onerror {
        return 302  http://server2.com$request_uri;
    }

    location / {
        proxy_connect_timeout   1s;
        proxy_pass http://server1.com/;
        error_page 400 401 402 403 404 405 500 501 502 503 504  @onerror
    }
}
我的目标是,请求到达server3并尝试server1,如果无法连接或出现其他错误,它将重定向到server2

这很好,但没有完全“优化”,因为如果server1工作,所有的流量都通过server3,这实际上并不需要,因为302重定向将完成这项工作,而客户端将重定向到server1

如果server1已启动并正在运行,则负载平衡不是一个选项所有客户端都需要使用它,只有当它已关闭时,客户端才需要使用server2

现在我的问题是

我是否可以将nginx配置为“尝试”连接到server1,如果可以,请不要使用proxy\u pass,而是使用302重定向


提前谢谢。

看来我找到了一个解决方案,不是完美的,但它很有效

首先,我尝试:

server {
    listen       80;

    location    @server_up {
        return 302  http://server1.com$request_uri;
    }

    location     @onerror {
        return 302  http://server2.com$request_uri;
    }

    location / {
        proxy_connect_timeout   1s;
        proxy_pass http://server1.com/;
        proxy_intercept_errors on;
        error_page 200 @server_up;
        error_page 400 401 402 403 404 405 500 501 502 503 504  @onerror
    }
}
也就是说,如果我们从服务器上获得200个状态码,这意味着它已启动,我们将在@server\u up上处理它

很遗憾,从nginx获得以下错误:

nginx [emerg] value "200" must be between 300 and 599
我们不能使用200代码作为“错误”,而且似乎没有办法允许这样做,所以我在这篇文章中发现了一个技巧/黑客:

因此,我将配置更改为:

server {
    listen       80;

    location    @server_up {
        return 302  http://server1.com$request_uri;
    }

    location     @onerror {
        return 302  http://server2.com$request_uri;
    }

    location / {
        proxy_connect_timeout   1s;
        #proxy pass to non existing url so we can intercept the 404 error and we know server is up
        proxy_pass http://server1.com/hgfkdjhgfdkjhgdfkhgkfdjh;
        proxy_intercept_errors on;
        error_page 404 @server_up;
        error_page 400 401 402 403 405 500 501 502 503 504  @onerror
    }
}
我们在服务器上请求一个不存在的URL,如果我们无法连接@onerror将被触发,但如果服务器启动@server\u将被触发,我们可以重定向到server1.com