2014-01-07 3 views
3

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

Приложение использует сеансы DB, и я вижу, что время истечения срока действия обновляется в базе данных. Даже в том случае, когда он просит их снова войти в систему сразу после того, как они уже вошли в систему, время окончания сеанса обновляется в базе данных. Является ли Yii чем-либо сервером, зависящим от сеансов?

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

На стороне сервера я использую Nginx с PHP-FPM и ELB Amazon как балансировщик нагрузки. Работа (в крайнем случае) заключается в использовании липких сеансов на балансировщике нагрузки, но тогда это не работает лучше всего, если узел должен отключиться и заставить пользователя использовать альтернативный узел.

Пожалуйста, дайте мне знать, если мне нужно прояснить что-нибудь лучше.

+0

был такая же проблема некоторое время назад, - заключил липкие сессии была единственным выходом. – Rohan

+0

@themosquitokiller на самом деле, возможно, у нас есть работа над приложением, над которым я работаю – acorncom

ответ

2

Проблема заключалась в том, что базовый путь, который использовался для генерации идентификатора приложения, префикс которого был аутентифицирован в сеансе, не соответствовал каждому серверу. Amazon OpsWorks разворачивал код на серверы, используя идентичный символический путь, но реальный путь, возвращаемый PHP, отличался из-за версий и символических ссылок.

Например, путь символической ссылки на обоих серверах был «/ app/current». Однако фактический путь на одном сервере был «/ app/релизы/2014010700», а другой был «/ app/релизы/2014010701», который генерировал другой хэш и, следовательно, не работал с сеансом.

Изменение базового пути для использования пути symlink в моем файле конфигурации устранило проблему, тогда как до того, как он использовал dirname(), который возвращал реальный путь символического содержимого. Мне также пришлось удалить функцию realpath() в setBasePath в структуре Yii.

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

Спасибо следующей статьи: http://www.yiiframework.com/forum/index.php/topic/19574-multi-server-authentication-failure-with-db-sessions

+0

Можете ли вы поделиться своим кодом, в котором вы вносили изменения, чтобы удалить realpath()? –

+0

@DharmeshGoswami Извините, у меня больше нет этого кода для меня.Я подозреваю, что это также значительно изменилось в Yii 2.0. Если вы следуете URL-адресу, который я опубликовал, и сделанным комментариям, он может указать, что нужно изменить. Из памяти это было изменение на 1-2 строки. –

1

думал, что я ответил на этот вопрос раньше, но взял немного, чтобы найти мой ответ: Yii session do not work in multi server

Укороченный вариант: если у вас включена Suhosin, это довольно болезненно. Отключите его, и все работает намного лучше. Но да, ответ: может сделать балансировку нагрузки ELB с сессиями Yii без необходимости липких сеансов.

+0

К сожалению, Сухосин не был моей проблемой. Я столкнулся с вашей статьей. Оказалось, что пути на каждом сервере не совпадают. Я отправлю полный ответ на это, как только SO позволит мне. Спасибо за ваш ответ! –

Смежные вопросы