Я хочу использовать 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-адреса на карте) прямо в месте "/".