在Nginx中使用redirect而不是代理进行负载平衡

我想用一种非常规的方式来使用Nginx。 我想在几个服务器之间进行负载均衡,而不是为那些我想redirect到的服务器设置代理内容。

也就是说,如果请求进入我的Nginx服务器,它应该302redirect到另一台服务器,通过从上游模块或等同物中随机选取一个。 我甚至不需要其他的上游块function,如权重(但如果可能的话,它们不会受到伤害)。

现在,我有以下configuration,这是我所需要的,但有点丑陋:

upstream boxes { server 127.0.0.1:46011; server 127.0.0.1:46012; } server { listen 46011; return 302 http://box11.example.com$request_uri; } server { listen 46012; return 302 http://box12.example.com$request_uri; } server { listen 80; server_name example.com; location / { proxy_pass http://boxes; } } 

有没有一个更简单的方法来处理这种情况,而不诉诸代理自己?

你可以从misc模块中得到一个随机variables:

 set_random $loc_rnd 1 10; 

然后select基于它的内部位置,用简单的权重:

 map $loc_rnd $loc_redirect { 1 @server1; 2 @server1; ... 8 @server2; 9 @server2; 10 @server2; } location / { recursive_error_pages on; error_page 403 = $loc_redirect; return 403; } 

redirect:

 location @server1 { internal; return 302 http://box11.example.com$request_uri; } location @server2 { internal; return 302 http://box11.example.com$request_uri; } 

其他变体:使用return 302 $ some_variable; (和地图中的完整URL)直接在“/”位置。