Nginx负载均衡器 - 重定向而不是传递

时间:2014-12-23 19:26:40

标签: redirect nginx cdn

我有多个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则尝试下一个服务器?

我知道这看起来有点奇怪,但后端没有关于这些文件存在的信息,也没有足够的时间来添加这些信息。

1 个答案:

答案 0 :(得分:0)

执行此操作的一种方法是使用ngx.location.capture feature of the nginx LUA module向每个上游服务器发送子请求,直到返回200。然后重写URL并向该服务器的地址发出ngx.redirect

我会考虑使用nginx.conf之外的脚本来执行此操作。此外,如果上游在响应中有一些时间稳定性,我会使用memcache来缓存正确的响应,因此最终用户必须等待每次命中的一些上游查询。