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

Bra*_*rad 5 configuration nginx proxy load-balancing

我想以一种非常规的方式使用 Nginx。我想在几台服务器之间进行负载平衡,而不是我想重定向到这些服务器的代理内容。

也就是说,如果一个请求进入我的 Nginx 服务器,它应该 302 重定向到另一台服务器,方法是从上游块或等效的块中随机选择一个。我什至不需要其他上游块功能,例如加权(但如果可能的话,让它们可用也无妨)。

现在,我有以下配置,它可以满足我的需要,但有点难看:

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;
        }
}
Run Code Online (Sandbox Code Playgroud)

有没有更简单的方法来处理这种情况,而无需求助于我自己?

kup*_*son 5

您可以从 misc 模块获取随机变量:

set_random $loc_rnd 1 10;
Run Code Online (Sandbox Code Playgroud)

然后根据它选择内部位置,并进行简单的加权:

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;
}
Run Code Online (Sandbox Code Playgroud)

重定向:

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

location @server2 {
  internal;
  return 302 http://box11.example.com$request_uri;
}
Run Code Online (Sandbox Code Playgroud)

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