У нас есть сервер IIS7, на котором размещено несколько десятков веб-сайтов. Некоторые из этих веб-сайтов являются частью того же старого приложения, которое мы разработали. Все эти сайты используют один и тот же код и работают в одном пуле приложений.
Примерно раз в месяц за последние несколько месяцев мы обнаружили, что все запросы для этого пула приложений начинают зависать на неопределенный срок. Когда это происходит, мы получаем предупреждение и перерабатываем пул приложений. После этого сайты снова начинают работать.
Это влияет только на один пул приложений, а не на другие на том же сервере. Пару раз, прежде чем перезапустить пул, я смотрел на выполняющиеся в данный момент запросы в рабочем процессе. Все они отображаются как выполняющиеся внутри модуля WindowsAuthenticationModule. Что странно, ведь подавляющее большинство приложений не требует аутентификации. Есть небольшой раздел администратора, который использует авторизацию Windows ... но все остальные запросы должны быть анонимными.
Кто-нибудь знает, что может быть причиной этого?
В том, как устроены эти сайты, есть несколько необычных вещей. Как я уже упоминал, все они запускают один и тот же код - несколько сайтов указывают на один и тот же физический каталог. Единственное отличие - это привязки заголовка хоста. Я не уверен, почему не существует только одного сайта со всеми заголовками хостов, но это то, как это работает.
На некоторых из этих сайтов один и тот же физический каталог отображается на двух уровнях - как корень сайта и снова как приложение внутри сайта. Итак, если пользователь переходит на http://oursite.com/index.aspx, который отображается в c: \ files \ oursite \ index.aspx. Если пользователь переходит на http://oursite.com/foo/index.aspx, который также сопоставляется с c: \ files \ oursite \ index.aspx. Я думаю, что есть код, который смотрит на URL-адрес запроса и по-разному обрабатывает два запроса.
Это странно, потому что один и тот же файл web.config в конечном итоге интерпретируется как файл конфигурации сайта, а также как файл конфигурации приложения на сайте. Я не знаю, может ли это быть связано с проблемой аутентификации.
Если мы не можем найти причину, мы думаем о нескольких обходных решениях, которые мы могли бы попробовать:
Переместите раздел администратора на отдельный сайт и дайте клиенту новый URL-адрес администратора. Запустите этот отдельный сайт в собственном пуле приложений. Затем в файле web.config, который используется всеми остальными сайтами, удалите модуль WindowsAuthenticationModule. Таким образом, не должно быть возможности зависания в WindowsAuthenticationModule.
Попробуйте запустить все эти сайты в классическом конвейере вместо интегрированного. Они нормально работали на нашем старом сервере IIS6 ...
(Если мы в отчаянии) Настройте сторожевой скрипт, который отслеживает сайты и автоматически перезагружает пул приложений, когда обнаруживает, что запросы застревают.
Что вы думаете?
Спасибо за вашу помощь,
Ричард
Я бы попытался щелкнуть правой кнопкой мыши процесс w3wp.exe, выполняющийся в вашем пуле зависших приложений. Щелкните его правой кнопкой мыши и выберите, создать файл дампа.
Либо:
ИЛИ:
Активируйте ведение журнала с помощью netsh, чтобы видеть запросы токенов Kerberos по мере их поступления (я не пробовал этот IRL):
PS C:\> netsh trace show providers | select-string kerberos
PS C:\> netsh trace show providers | select-string auth
... а потом что-то вроде:
netsh trace start provider={5BBB6C18-AA45-49B1-A15F-085F7ED0AA90}
ИЛИ: