Nginx proxy_next_upstream具有不同的URI修改

时间:2019-01-23 16:17:02

标签: nginx nginx-reverse-proxy nginx-config

如果主服务器返回404,我们需要设置多个上游服务器,并使用proxy_next_upstream进行备份。但是,上游备份服务器的URI与主服务器的URI不同,因此我不知道这是否可能。

详细地说,下面的配置代码片段可以正常工作(如果所有上游服务器的URI都相同):

upstream upstream-proj-a {
   server server1.test.com;
   server server2.test.com backup;
}

server {
    listen 80;
    listen [::]:80;

    server_name www.test.com;
    location /proj/proj-a {

        proxy_next_upstream error timeout http_404;

        proxy_pass http://upstream-proj-a/lib/proj/proj-a;
}

对于http://test.com/proj/proj-a/file的请求,它将首先尝试请求http://server1.test.com/lib/proj/proj-a/file,如果返回404或超时,则尝试http://server2.test.com/lib/proj/proj-a/file。很好。

但是,现在对于server2,它只能接受类似http://server2.test.com/lib/proj/proj-a-internal/file的URL,该URL与指向主服务器的URI不同。如果仅考虑备份服务器,我可以这样写:

proxy_pass http://server2.test.com/lib/proj/proj-a-internal

但是,对于结合了proxy_next_upstream的不同上游服务器,我似乎无法拥有不同的proxy_pass。

我该如何实现?

1 个答案:

答案 0 :(得分:0)

我发现了使用简单proxy_pass的变通方法,并将本地主机设置为备份上游服务器,然后代表真正的备份上游服务器进行重写。

配置如下:

upstream upstream-proj-a {

   server server1.test.com:9991;
   # Use localhost as backup
   server localhost backup;
}

server {
    listen 80;
    listen [::]:80;

    resolver 127.0.1.1;

    server_name www.test.com;

    location /lib/proj/proj-a {
        # Do rewrite then proxy_pass to real upstream server
        rewrite /lib/proj/proj-a/(.*) /lib/proj/proj-a-internal/$1 break;
        proxy_pass http://server2.test.com:9992;
    }

    location /proj/proj-a {
        proxy_next_upstream error timeout http_404;
        proxy_pass http://upstream-proj-a/lib/proj/proj-a;
    }
}

它可以正常工作,但是唯一的副作用是,当一个请求需要发送到备份服务器时,它会创建另一个新的HTTP请求,从本地主机到本地主机,这似乎使nginx的负载增加了一倍。目标是传输相当大的文件,我不确定这是否会影响性能,特别是如果所有协议都是https而不是http的话。