Мне нужно два разных набора апстримов. Но все мои запросы поступают с одного и того же URL (тот же путь). Разница в том, что у некоторых запросов будет специальный аргумент, а у других - нет. В зависимости от этого мне нужно будет выбрать, какой апстрим использовать. Вот неполная часть примера моего файла конфигурации:
server_name localhost;
root /var/www/something/;
upstream pool1
{
server localhost:5001;
server localhost:5002;
server localhost:5003;
}
upstream pool2
{
server localhost:6001;
server localhost:6002;
server localhost:6003;
}
location /
{
# this is the part where I need help
try_files $uri @pool1;
}
location @pool1
{
include fastcgi_params;
fastcgi_pass pool1;
}
location @pool2
{
include fastcgi_params;
fastcgi_pass pool2;
}
Итак ... часть, которую я не знаю, заключается в том, как проверить, находится ли аргумент / параметр в URL-адресе, и в зависимости от этого использовать либо пул местоположения1, либо пул2.
Есть идеи, как это реализовать?
Спасибо!
@hellvinz прав. Я не могу комментировать, поэтому даю еще один ответ.
location / {
if($myArg = "otherPool") {
rewrite ^/(.*)$ /otherUpstream/$1 last;
}
try_files $uri pool1;
}
location /otherUpstream {
proxy_pass http://@pool2;
}
Я думаю, вам придется изменить $ myArg на имя параметра запроса, который вы тестируете, а otherPool на то, что вы его установили. К тому же перезапись не проверена, так что я тоже могу ошибаться, но идею вы поняли.
Я предлагаю альтернативную версию этого без если заявление. Я знаю, что это старый вопрос, но будущие гуглеры могут найти его полезным.
Я должен признать, что это также означает изменение способа выбора восходящего потока. Но я не вижу в этом проблемы.
Идея состоит в том, чтобы отправить с запросом собственный HTTP-заголовок (X-Server-Select). Это позволяет nginx выбрать правильный пул. Если заголовок отсутствует, будет выбран вариант по умолчанию.
Ваша конфигурация может выглядеть примерно так:
upstream pool1
{
server localhost:5001;
server localhost:5002;
server localhost:5003;
}
upstream pool2
{
server localhost:6001;
server localhost:6002;
server localhost:6003;
}
# map to different upstream backends based on header
map $http_x_server_select $pool {
default "pool1";
pool1 "pool1";
pool2 "pool2";
}
location /
{
include fastcgi_params;
fastcgi_pass $pool;
}
Источник: nginx использует другой бэкэнд на основе заголовка http
Добавлено после того, как я вернусь к этому как к будущему: чтобы легко тестировать серверы, вы можете установить расширение в chrome (Я использую ModHeader), позволяющий изменять заголовки запросов.