我想以一种非常规的方式使用 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;
}
}
有没有更简单的方法来处理这种情况,而不需要诉诸代理?
答案1
您可以从 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)。