如果主服务器返回404,则需要设置多个上游服务器,并使用proxy_next_upstream进行备份。但是,用于上游备份服务器的URI与面向主服务器的URI不同,因此我不知道这是否可行。
详细地说,下面的配置片段可以正常工作(如果URI与所有上游服务器相同):
上游-proj-a{服务器server1.test.com;服务器server2.test.com备份;}服务器{侦听80;侦听:80;server_name www.test.com;location /proj/proj-a { proxy_next_upstream错误超时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,这与针对主服务器的URI不同。如果只考虑备份服务器,我可以编写如下所示:
proxy_pass http://server2.test.com/lib/proj/proj-a-internal
然而,看来我不能有不同的proxy_pass不同的上游服务器结合proxy_next_upstream。
我怎样才能做到这一点?
发布于 2019-01-25 07:47:45
我找到了一个使用简单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;
}
}它可以正常工作,但唯一的副作用是,当请求需要转到备份服务器时,它会创建另一个从localhost到localhost的新HTTP请求,这似乎是nginx负载的两倍。目标是传输相当大的文件,我不确定这是否会影响性能,尤其是如果所有的协议都是https而不是http。
https://stackoverflow.com/questions/54331482
复制相似问题