Формы веб-сайтов (POST) на веб-сайте нескольких экземпляров (серверов) (Python Django / PHP) - PullRequest
0 голосов
/ 18 января 2012

Предположим, у меня есть сайт PHP / Python (Django). Сайт работает на нескольких серверах экземпляров. Это означает, что URL-адрес веб-сайта - www.test.com, а из балансировщика нагрузки он может перевести клиента на www.server1.com или www.server2.com и т. Д.

Когда на сайте есть форма, и обработка этой формы находится на той же странице: Может ли существовать следующая ситуация? : - Пользователь заходит на www.test.com - за кулисами, через балансировщик нагрузки, он попадает на www.server * 1 *. Com. Он заполняет форму. - Форма действия (URL) предназначена для www.test.com - поэтому за кулисами через балансировщик нагрузки он попадает на www.server * 2 *. Com. Итак, будут ли необходимые данные формы, и, возможно, более важные для моего вопроса - данные 'запроса' (например, request.SOMETHING в Python Django) будут отсутствовать? Потому что, возможно, он был сохранен ранее в сеансе, на www.server * 1 *. Com, а теперь его нет на www.server * 2 *. Com?

Ответы [ 2 ]

0 голосов
/ 18 января 2012

Да, это действительная проблема.Из-за особенностей Интернета (HTTP) другой запрос может оказаться на другом сервере.Эта проблема называется постоянством или липкостью.

Решением здесь будет сохранение всей этой информации на стороне клиента (с использованием файлов cookie), а не использование сеансов на стороне сервера.Так что вам нужно реализовать это с помощью Python / Django.Использование подхода на стороне клиента дает наилучшую производительность и должно быть самым простым в реализации.

Имейте в виду, что это решение несет довольно значительный риск безопасности для атак типа "человек посередине", если только вы не шифруете соединение с помощью SSL / TSL (используя HTTPS), поскольку все данные клиента хранятсяв куки, которые могут быть перехвачены.

0 голосов
/ 18 января 2012

В запросе всегда будут все данные, так как они передаются на пограничный сервер. request.POST и request.GET будут иметь все данные из запроса. Однако проблема в том, что данные сеанса могут быть недоступны на этом пограничном сервере. Например, вы запустили сеанс на сервере server1, а затем запросили другую страницу на сервере server2. server2 может назначить новый сеанс и запретить вам доступ к определенному содержимому.

Чтобы преодолеть эту проблему сеанса, вы можете сделать одну из двух вещей:

  1. Совместное использование сеансов между серверами (центральное хранилище сеансов)
  2. Всегда пересылать пользователя на один и тот же пограничный сервер. Некоторые балансировщики нагрузки хранят перенаправленный на крайний сервер файл cookie. При последующих запросах пользователь перенаправляется на один и тот же граничный узел каждый раз. Тот же самый пограничный узел будет поддерживать сеанс этого пользователя, поэтому никаких проблем.
...