Squeak.ru - шаблоны программирования

Как установить исключения для балансировщика нагрузки NGINX

Можно ли настроить балансировщик нагрузки NGINX в режиме наименьшего_конн, чтобы сделать исключение для определенных путей?

Я хочу настроить балансировщик нагрузки таким образом, чтобы все запросы, необходимые для операции единого входа в систему, отправлялись в один и тот же экземпляр внутреннего приложения.

У меня есть внешнее приложение, обращающееся к дублированному внутреннему приложению через балансировщик нагрузки nginx. Все приложения развернуты на Tomcat 8.5, а серверные экземпляры настроены на репликацию сеансов между Tomcat.

Моя проблема заключается в том, что когда пользователь аутентифицируется с использованием метода предоставления кода авторизации OAuth-2.0, внешнее приложение получает код авторизации, но из-за подключения к серверной части через балансировщик нагрузки оно пытается получить токен, используя этот код, с другого компьютера, что приводит к InvalidGrantException.

Использование режима ip_hash или его вариантов не является решением этой проблемы, поскольку он нестабилен при доступе к приложению через VPN.


Ответы:


1

Да, вы можете добиться того, чего хотите, объявив два местоположения и обращаясь с ними по-разному. См. пример ниже и проверьте этот вопрос, где объясняется, как работает приоритет.

http {
  upstream myapp1 {
    least_conn;
    server srv1.example.com;
    server srv2.example.com;
    server srv3.example.com;
  }

  server {
    listen 80;

    location / {
        proxy_pass http://myapp1;
    }

    location /my-special-path/ {
        proxy_pass http://srv1.example.com;
    }
  }
}

Выше приведено решение, в основном основанное на вашем первом заявлении о том, что вы хотите маршрутизировать на основе определенных путей. Если ваша проблема более сложная, т. е. эти пути создаются динамически и т. д., вы можете поделиться примером, чтобы было легче понять вашу конкретную ситуацию.

ОБНОВЛЕНИЕ

На основании комментария. Я бы действительно предложил устранить неполадки в вашем бэкэнде, чтобы синхронизироваться. При этом, если вы действительно хотите решить конкретную проблему с вашего nginx, я бы сделал следующее:

  1. К каждому ответу я добавлял определенный заголовок, который конкретный бэкэнд отвечал на этот запрос. add_header X-Upstream $upstream_addr;
  2. На этом конкретном пути я бы обслуживал запрос на основе значения этого заголовка. proxy_pass http://$http_x_upstream;

Таким образом, конфиг будет выглядеть так:

http {
  ...

  server {
  ...
    location / {
        add_header  X-Upstream  $upstream_addr always;
        proxy_pass http://myapp1;
    }

    location /authorize/ {
        add_header  X-Upstream  $upstream_addr always;
        proxy_pass http://$http_x_upstream;
    }
  }
}

ПРИМЕЧАНИЕ. Безопасность. Если вы пойдете по этому пути, будьте осторожны, направляя свои запросы на основе значения, которым может манипулировать ваш клиент. Поэтому убедитесь, что вы хотя бы проверяете это значение. Проверьте этот ответ для проверки заголовков с помощью nginx. .

10.08.2019
  • Спасибо за ответ. Чего я точно хочу, так это передавать два последовательных запроса по определенному пути всегда на одну и ту же машину. Всегда есть два запроса пути /authorize, когда пользователь входит в систему. Проблема в том, что этот второй запрос использует код авторизации Oauth 2.0, который необходимо передать на тот же компьютер для получения токена. Я не знаю почему, но хотя сеанс между бэкэнд-приложениями реплицируется, код действителен только для того экземпляра, который его выдал. 13.08.2019
  • Я обновил ответ на основе вашего комментария, я думаю, что теперь он лучше подходит для вашего варианта использования. 13.08.2019
  • Этот ответ был наиболее полезным, хотя и недостаточным. Я опубликую ответ позже, если смогу. 23.08.2019
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...