【问题标题】:nginx redirect on proxy connection instead of proxy_passnginx 重定向代理连接而不是 proxy_pass
【发布时间】:2020-10-28 06:32:48
【问题描述】:

有 3 台服务器

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

在 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 重定向?

提前致谢。

【问题讨论】:

    标签: nginx web


    【解决方案1】:

    看来我找到了一个解决方案,不是完美的,但它的工作原理。

    首先我尝试了:

    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。

    【讨论】:

      猜你喜欢
      • 2019-05-23
      • 2014-08-22
      • 1970-01-01
      • 1970-01-01
      • 2016-04-12
      • 1970-01-01
      • 1970-01-01
      • 2019-05-03
      • 2018-07-01
      相关资源
      最近更新 更多