我有多个CDN服务器来托管主站点的大文件。但是,这些内容服务器没有足够的空间来容纳所有内容,因此它们只保留了部分内容。 我将Nginx作为负载均衡器放在所有这些前面,但我想将直接重定向到文件,而不是使用proxy_pass并通过负载均衡器流式传输。
我现在拥有的:
upstream cdn {
server content01.example.com;
server content02.example.com;
server content03.example.com;
}
location /files {
proxy_pass http://cdn;
proxy_set_header Host $host;
proxy_set_header X-Real_IP $remote_addr;
proxy_next_upstream http_404;
}
如果响应是http_200,例如content01.example.com,我如何让它发送一个Location标头,如果是http_404则尝试下一个服务器?
我知道这看起来有点奇怪,但后端没有关于这些文件存在的信息,也没有足够的时间来添加这些信息。
答案 0 :(得分:0)
执行此操作的一种方法是使用ngx.location.capture feature of the nginx LUA module向每个上游服务器发送子请求,直到返回200。然后重写URL并向该服务器的地址发出ngx.redirect。
我会考虑使用nginx.conf之外的脚本来执行此操作。此外,如果上游在响应中有一些时间稳定性,我会使用memcache来缓存正确的响应,因此最终用户必须等待每次命中的一些上游查询。