Nginx

在 Nginx 中使用重定向而不是代理進行負載平衡

  • January 30, 2017

我想以一種非正常的方式使用 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;
       }
}

有沒有更簡單的方法來處理這種情況而不求助於自己?

您可以從 misc 模組獲取隨機變數:

set_random $loc_rnd 1 10;

然後根據它選擇內部位置,用簡單的權重:

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;
}

重定向:

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)直接在“/”位置。

引用自:https://serverfault.com/questions/597671