nginx在代理连接上重定向,而不是proxy_pass

时间:2020-10-28 06:32:48

标签: nginx web

有3台服务器

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

在server3上获得以下配置:

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_pass而是使用302 redirect?

谢谢。

1 个答案:

答案 0 :(得分:0)

似乎我找到了一种解决方案,而不是完美的解决方案,但是可以解决问题。

首先我尝试过:

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_up上对其进行处理。

从nginx遇到以下错误:

nginx [emerg] value "200" must be between 300 and 599

我们不能将200个代码用作“错误”,而且似乎没有办法允许这样做,因此我在这篇文章中找到了一个技巧/黑客:

How to change the status code of a proxied server response in nginx?

所以我将配置更改为此:

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_up,并且我们可以重定向到server1.com。