我想用一种非常规的方式来使用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)直接在“/”位置。