nginx и 2 апстрима
Я хочу сделать следующее: у меня есть nginx, который перенаправляет на tomcat, поэтому конфигурация выглядит примерно так:
upstream miserver.com {
server localhost:8080;
}
server {
listen 0.0.0.0:80;
location / {
proxy_pass http://miserver.com/mywar-web-0.4/convert;
}
}
То, что я хочу сделать, - это то, что nignx попадает в апстрим и учитывает только ответ одного из них. Это потому, что я хочу протестировать новую версию войны, но я все еще хочу продолжить со старой (новая будет записывать информацию в файл).
Например, я хочу иметь:
upstream miserver.com {
server localhost:8080;
}
server {
listen 0.0.0.0:80;
location / {
proxy_pass http://miserver.com/mywar-web-0.4/convert;
proxy_pass http://miserver.com/mywar_testing-web-0.4/convert;
}
}
и когда есть совпадение с "/", тогда nginx обращается к: - mywar-web-0.4 - mywar_testing-web-0.4
но используется только резонанс mywar-web-0.4.
3 ответа
По сути, вам нужно, чтобы один клиентский запрос приводил к тому, что nginx делает два запроса к внутренним серверам, но возвращает клиенту только один из таких запросов. Это очень необычно и обычно не поддерживается.
Вы можете попробовать поиграть с
error_page
, Вы хотели бы сделать первый запрос (ответ на который должен быть отброшен), а затем поймать его код состояния как ошибку, а затем использовать именованное местоположение (тот, который начинается с@
и не переписывает$uri
) обрабатывать последующий запрос, который будет возвращен клиенту. Не уверен, что вы можете указатьerror_page 200
если нет, то вам, возможно, придется изменить свое приложение (ответ на который следует отбросить), чтобы вместо него возвращался какой-то фактический код ошибки.Кроме того, вы можете попробовать использовать какой-то модуль фильтра, например
ngx_http_addition_module
а такжеadd_after_body
директивы. Хотя это официальный модуль, который уже входит в состав дистрибутива исходного кода nginx, он требует перекомпиляции, и это также приведет к получению двух ответов, возвращаемых пользователю, так что вам все равно придется изменить свое приложение.
Это работает для вас?
upstream miserver.com {
server localhost:8080; <- This is Live mywar-web-0.4
server localhost:8081; <- This is Testing mywar_testing-web-0.4
}
server {
listen 0.0.0.0:80;
location / {
proxy_pass http://miserver.com;
}
}
Не уверен, что вы можете сделать это, и все еще знаете, какой бэкэнд вы используетеНадеюсь, это поможет:D
Я загружаю баланс 4 сервера торнадо с этой конфигурацией.
upstream frontends {
server 127.0.0.1:8888;
server 127.0.0.1:8889;
server 127.0.0.1:8890;
server 127.0.0.1:8891;
}
server {
listen 80;
location / {
proxy_pass http://frontends;
}
}
Запросы распределяются между каждым сервером в списке "веб-интерфейсов", и если один из них не работает, он будет игнорироваться, пока не будет достигнут.
В вашем примере вы могли бы заставить каждую из ваших войн обрабатывать часть трафика в /, если они каждый слушают на своем порте.
Обратитесь к документации модуля Upstream для получения дополнительной информации.