如果主服务器返回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。
我该如何实现?
答案 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的话。