Nginx
在 Nginx 中使用重定向而不是代理進行負載平衡
我想以一種非正常的方式使用 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)直接在“/”位置。