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 для получения дополнительной информации.

Другие вопросы по тегам