Проблема состояния сеанса ASP.NET веб-сервера IIS 7.5 с балансировкой нагрузки
У нас есть проблема с веб-сайтом ASP.NET, где сессии пользователей ведут себя странно - данные сессий появляются, исчезают и снова появляются.
Я думаю, я знаю, в чем проблема:
- Наша установка - 2 x WebServers с балансировкой нагрузки + база данных состояния одного сеанса.
- Хранилище состояния сеанса ASP.NET SQL, по-видимому, зависит от идентификатора экземпляра веб-сайта IIS (идентификатора метабазы) для однозначной идентификации идентификатора cookie входящего сеанса и получения / сохранения значений.
- Идентификатор экземпляра веб-сайта IIS на каждом из действующих серверов различен (ID / W3SVC / 1 / Root на веб-сервере A, ID / W3SVC / 2 / Root на веб-сервере B).
- Балансировка нагрузки не использует привязку клиента, поэтому каждый пользовательский HTTP-запрос может идти на любой сервер.
Поэтому, когда пользователь входит на сайт и перемещается, каждый HTTP-вызов может перейти на любой веб-сервер и, следовательно, использовать запись состояния сеанса с разными идентификаторами в зависимости от сервера. По сути, пользователь будет одновременно иметь 2 отдельных экземпляра сеанса. Я полагаю, что я проверил это, как и в таблице ASPStateTempSessions базы данных, каждый идентификатор файла cookie сеанса, кажется, соответствует 2 почти идентично названным записям (их идентификаторы отличаются только на последние несколько символов, которые, я считаю, являются модификатором на основе AppID из Таблица AspStateTempApplications), созданная за считанные секунды.
Поэтому состояние сеанса будет выглядеть некорректно, поскольку изменения, внесенные в одну запись сеанса, будут сохраняться только на этом веб-сервере. Если пользователь перемещается на другой сервер с балансировкой нагрузки, значения сеанса могут исчезнуть или вернуться.
Я полагаю, что решение состоит в том, чтобы синхронизировать идентификаторы экземпляров IIS сайтов (например, сделать их оба / W3SVC / 1 / Root), но я попытался отредактировать это значение в IIS в разделе "Дополнительные параметры", и, хотя он сохранил "ОК", он просто сделал сайт возвращал 404s на этом сервере, пока я не изменил его обратно.
Я нашел сценарий VBS для этой проблемы, но, похоже, он предназначен только для IIS 6, поэтому я беспокоюсь об этом. Кто-нибудь еще сталкивался с такой ситуацией на IIS 7.5, и как вы это исправили?
РЕДАКТИРОВАТЬ / РЕШЕНИЕ
Моя ошибка заключалась в том, что я забыл перезапустить IIS после изменения идентификатора экземпляра сайта в IIS. После этого идентификатор был обновлен, и сеансы ASP.NET были синхронизированы на двух веб-серверах.
Полные инструкции:
- Удаленный рабочий стол на сервере LIVE1, откройте IIS Mgr, нажмите на проблемный сайт и выберите Дополнительные настройки на боковой панели.
- Измените идентификатор на что-то уникальное, например, 10. Нажмите OK.
- Перезапустите веб-сервис (
c:\windows\system32\iisreset /restart
)
Сделайте то же самое для LIVE2 (убедитесь, что идентификатор сайта такой же, как на LIVE1)
Обратите внимание, что идентификатор сайта влияет на расположение файлов сайта, например, папка файла журнала станет C:\inetpub\logs\LogFiles\W3SVC10
например.
Также обратите внимание, что вы можете сделать эти изменения вручную, отредактировав атрибут id сайта в файле конфигурации IIS на каждом сервере: C:\Windows\System32\inetsrv\config\applicationHost.config
, Требуются права администратора и все еще требуется сброс после этого.
1 ответ
Судя по вашему вопросу, кажется, что у вас есть центральный сервер состояния сеанса (DB?), Который отслеживает данные сеанса?
Вы также должны синхронизировать ключ компьютера, который используется для шифрования, для проверки подлинности любых форм и т. Д. Это также может повлиять на идентификацию сеанса, я не уверен.
Настройка машинных ключей в IIS 7
Кроме того, вы должны использовать общую конфигурацию между машинами, это может само по себе решить проблему с разными ключами машины.
Синхронизация конфигурации IIS для фермы веб-серверов?
РЕДАКТИРОВАТЬ: Когда вы изменили идентификатор сайта, вы пытались перезапустить диспетчер IIS, чтобы увидеть, изменился ли webroot? Возможно, конфигурация связана с идентификатором, что означает, что изменение идентификатора также изменяет такие вещи, как корень документа и т. Д.