Назад | Перейти на главную страницу

Как файлы cookie работают с несохраняющими балансировщиками нагрузки

У нас есть приложение Drupal, которое использует sso для входа пользователей.

Мы используем классические балансировщики нагрузки AWS (ELB), AWS сообщает нам, что на ELB нет постоянства сеанса.

Я пытаюсь понять, как файлы cookie работают без сохранения в классических балансировщиках нагрузки.

example.com DNS указывает на ELB. В пуле 2 сервера Server1 и Server2

Мы хотим, чтобы пользователь зашел на свою домашнюю страницу на http://example.com/user/12345/ скажем, на сервере 1, если они еще не вошли в систему, они перенаправляются на страницу sso http://example.com/user/login/sso, автоматически войдите в систему и получите cookie SESS<hexnumber> а затем перенаправили обратно на http://example.com/user/12345/

Нам не разрешено добавлять какие-либо серверы сеансов (redis), что является гарантией того, что они останутся на сервере 1 для обоих перенаправлений.

Насколько мне известно, при каждом обращении к example.com пользователь мог оказаться на сервере 1 или сервере 2.

Мой вопрос:

Если они получают cookie на server1, а затем перенаправляются на server2, как server2 узнает, что cookie уже назначен этому пользователю на server1?

Кажется, я думаю о себе кругами. При работе над этим типом настройки в прошлом с использованием LB без сохранения сеанса мы использовали сервер redis для хранения сеансов, и каждый запрос обращался к серверу redis для получения информации о сеансе.

Файл cookie устанавливается в браузере, а не на сервере. Он ограничен доменом и, необязательно, определенным путем в URL-адресе, поэтому, пока оба сервера доступны из одного домена, cookie будет там.

Если cookie указывает на сеанс, то необходимо, чтобы и server1, и server2 каким-либо образом имели доступ к этому сеансу. Если сеансы не могут быть разделены между серверами, вам необходимо заставить пользователя оставаться на определенном сервере. Этого можно легко добиться с помощью DNS и небольшой магии перезаписи URL:

  • www.example.com указывает на оба сервера.
  • www1.example.com указывает только на server1
  • www2.example.com указывает только на server2

Используя набор простых (ish) правил перезаписи и файл cookie, пользователь может быть привязан к определенному серверу, гарантируя, что его сеанс сохраняется.

Вот еще некоторые подробности.

DNS:

  • example.com A 1.1.1.1, A 2.2.2.2
  • www.example.com CNAME example.com
  • www1.example.com A 1.1.1.1
  • www2.example.com A 2.2.2.2

Правила перезаписи:

  • постоянный cookie: "backend"
  • начальное соединение: "backend" не определено, установите "backend" на www1 или www2, в зависимости от того, какой сервер ответил, и перенаправьте на этот сервер. Файл cookie должен быть настроен на домен example.com, таким образом он будет загружен как на www1, так и на www2.
  • Если определено «backend», убедитесь, что его значение соответствует экземпляру сервера, и при необходимости перенаправьте.
  • Убедитесь, что файл cookie сеанса определен в полном доменном имени сервера, то есть www1.example.com или www2.example.com.

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

Если вы не можете использовать базу данных управления сеансами, такую ​​как Elasticache Redis (Redis для простых сеансов не должен стоить более 15 долларов в месяц), то следующий лучший вариант - включить закрепленные сеансы на ELB;

https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-sticky-sessions.html

Это заставит пользователей переходить на один и тот же серверный узел на протяжении всего сеанса. «Куки, сгенерированные балансировщиком нагрузки» со сроком жизни 900 секунд, должно быть достаточно, но вы можете настроить это.