Ошибка HTTP Error 503. The service is unavailable
- Описание ошибки 503 на IIS
- Причины ошибки HTTP Error 503. The service is unavailable
- Методы устранения ошибки 503 на IIS
- Переустановка системы
- Проверка работы NET.Framework
- Отключение 32 битного режима на пуле IIS
- Проверка учетной записи от которой запускается пул
- Отключение Load User Profile на пуле IIS
- Не создает временный файл конфигурации пула
- Два сайта на 443 порту
- Дополнительные методы
Добрый день! Уважаемые читатели и гости одного из крупнейших IT блогов России Pyatilistnik.org. В прошлый раз мы с вами научились чинить две вещи в Windows 10, это пресловутый черный экран и ошибку запуска в приложениях из-за отсутствия библиотеки vcruntime140.dll. Двигаемся дальше и сегодня решим еще один интересный пазл с веб сервисом IIS и ошибкой "HTTP Error 503. The service is unavailable". Думаю, что мои грабли будут вам весьма интересны.
Описание ошибки 503 на IIS
Не так давно я устанавливал отказоустойчивую службу Remote Desktop Services High Availability на базе Windows Server 2019. Сами роли установились корректно и без ошибок в мастере, я успешно создал коллекцию, опубликовал RemoteApp приложения и хотел их протестировать, но какого же было мое удивление, когда я в место привычной формы авторизации увидел ошибку:
Причины ошибки HTTP Error 503. The service is unavailable
Сразу могу сказать, что данную проблему вы можете встретить в любом продукте компании Microsoft, где в качестве веб движка используется служба IIS (Internet Information Services). Из популярных:
- RDS фермы
- Share Point
- Exchange
- Просто сайты на IIS
Сама проблема связана в связке IIS и Net.Framework. Обычно ошибка указывает на то, что веб-страница или запрос ресурса понятен серверу, но последний не может выполнить его по той или иной причине, или же из-за банальной перегрузки, когда не хватает ресурсов.
Методы устранения ошибки 503 на IIS
Сразу скажу, что вам придется в большинстве случаев попотеть, чтобы найти причину падения вашей службы, но обо всем по порядку. Из причин можно выделить:
- Отсутствие прав у учетной записи, которая запускает пул приложений
- Вы запускаете пул в режиме 32 бита
- У вас просто не работает пул приложений
- Проблема с NET.Framework
- Проблема на уровне операционной системы из-за ошибок целостности
Переустановка системы
Как бы это смешно не звучало, но в последнем случае у меня после того, как я все перепробывал чтобы устранить ошибку 503 на IIS, уже кончились идеи и я просто снес все так как система была чистая и поставил заново, но уже более свежий дистрибутив и о чудо проблема ушла.
Не знаю, в чем было дело, то ли глюки при обновлении Windows Server 2019, то ли что-то со сборкой которая у меня была, не могу точно сказать. До переустановки у меня была версия Windows 1809 (Сборка ОС 17763.1282)
После переустановки я поставил версию от июня 2020. Когда я уже в ней запускал сайт RDweb на ферме RDS, то сервис ответил корректно и HTTP Error 503 я не увидел.
Проверка работы NET.Framework
По умолчанию в Windows Server 2019 при установке добавляется NET.Framework версии 4.7. Очень часто он может быть добавлен кривовато. В случае с Remote Desktop Services мне пришлось:
- Удалить роль IIS и RDS
- Удалить компонент NET.Framework
- Скачать NET.Framework версии 4.7. Скачиваем потому, что после его удаления у вас не будет работать диспетчер серверов и установка из PowerShell.
- Установить NET.Framework версии 4.7
- Устанавливаете IIS
- Устанавливаете RDS
В результате данного шаманства в сможете запустить RDweb на вашей RDS ферме минуя ошибку "Service Unavailable: HTTP Error 503. The service is unavailable".
Но перед всеми этими рокировками я вам советую, как и в случае с зависанием пула IIS обратиться к логам и попытаться там найти, что-то что даст нам направление для поиска информации. Напоминаю посмотреть логи Windows вы можете через оснастку "Просмотр событий" или веб-сервис Windows Admin Center. Советую смотреть четыре журнала. Первые два стандартные, это "Система" и "Приложения". Например вы можете увидеть вот такое событие с предупреждением:
Event message: Возникло необработанное исключение.
Event time: 30.06.2020 18:34:41
Event time (UTC): 30.06.2020 15:34:41
Event ID: aa3cbb1255f3432d813e6c5cb75395ed
Event sequence: 14
Event occurrence: 1
Event detail code: 0
Application information:
Application domain: /LM/W3SVC/1/ROOT/RDWeb/Pages-2-132380048755425068
Trust level: Full
Application Virtual Path: /RDWeb/Pages
Application Path: C:\Windows\Web\RDWeb\Pages\
Machine name: RDSH03
Process information:
Process ID: 3416
Process name: w3wp.exe
Account name: IIS APPPOOL\RDWebAccess
Exception information:
Exception type: NullReferenceException
Exception message: Ссылка на объект не указывает на экземпляр объекта.
в Microsoft.TerminalServices.Publishing.Portal.FormAuthentication.TSFormAuthTicketInfo..ctor(HttpContext objHttpContext)
в ASP.ru_ru_default_aspx.<GetAppsAsync>d__0.MoveNext()
--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---
в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
в System.Web.UI.PageAsyncTaskManager.<ExecuteTasksAsync>d__3.MoveNext()
--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---
в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
в System.Web.UI.Page.<ProcessRequestAsync>d__554.MoveNext()
Request information:
Request URL: https://rdsh03.root.pyatilistnik.org:443/RDWeb/Pages/ru-RU/Default.aspx
Request path: /RDWeb/Pages/ru-RU/Default.aspx
User host address: 192.168.31.100
User:
Is authenticated: False
Authentication Type:
Thread account name: IIS APPPOOL\RDWebAccess
Thread information:
Thread ID: 7
Thread account name: IIS APPPOOL\RDWebAccess
Is impersonating: False
Stack trace: в Microsoft.TerminalServices.Publishing.Portal.FormAuthentication.TSFormAuthTicketInfo..ctor(HttpContext objHttpContext)
в ASP.ru_ru_default_aspx.<GetAppsAsync>d__0.MoveNext()
--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---
в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
в System.Web.UI.PageAsyncTaskManager.<ExecuteTasksAsync>d__3.MoveNext()
--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---
в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
в System.Web.UI.Page.<ProcessRequestAsync>d__554.MoveNext()
Custom event details:
Из которого понятно, что у меня не запущен пул. Откройте оснастку IIS и перейдите в раздел "Пулы приложений". Далее найдите нужный, в моем примере это RDWebAccess. Как видно у него статус "Остановлено", попробуйте его запустить.
Если пул не запускается, то я вам советую активировать в просмотре событий два дополнительных журнала:
- Microsoft-Windows-IIS-Configuration/Administrative
- Microsoft-Windows-IIS-Configuration/Operational
Так же что-то полезное вы можете найти в текстовом файле располагающемся по пути:
Как видно из файла у меня был выключен пул "2020-07-01 08:34:12 ::1%0 62570 ::1%0 443 HTTP/2 GET /RDWeb 5 503 1 Disabled RDWebAccess". У вас может быть тут другая ошибка.
Вы можете выполнить в PowerShell вот такой запрос по получению информации из данного файла, только для 503 кода.
Отключение 32 битного режима на пуле IIS
В журнале Microsoft-Windows-IIS-W3SVC-WP вы можете увидеть ошибку с кодом события: 2282, где:
По умолчанию 32-разрядная поддержка отключена в пулах приложений. Если не требуется поддержка 32-разрядных, проверьте параметры каждого из пулов приложений убедитесь, что значение Разрешить 32-разрядные приложения имеет значение False.
Откройте дополнительные параметры у нужного пула, через контекстное меню.
Еще раз проверьте что параметр Enable32bitAppOnWin64 (Разрешить 32-разрядные приложения) имеет значение "False".
Проверка учетной записи от которой запускается пул
Я очень часто встречал безалаберных системных администраторов, которым было лень создавать отдельные учетные записи для каждой службы или сервиса с которой они работают. Они делали просто, запускали все из под себя с максимальными правами или для теста так делали и забывали, что так оставили. Потом с течением времени учетную запись могут отключить или сменить пароль, что сразу делает ваш пул неработоспособным, он просто не может запустить его. Исходя из этого проверьте данную ситуацию. В дополнительных параметрах найдите раздел "Удостоверение" и посмотрите от имени кого у вас запущен ваш пул, по умолчанию должна быть встроенная учетная запись "ApplicationPoolidentity".
При необходимости вы можете выбрать другую учетную запись для запуска пула. После изменения, обязательно перезапустите пул, а лучше саму службу IIS.
Отключение Load User Profile на пуле IIS
Когда пользователь входит в систему в интерактивном режиме, система автоматически загружает профиль пользователя. Если служба или приложение олицетворяет пользователя, система не загружает профиль пользователя. Поэтому служба или приложение должны загрузить профиль пользователя с помощью LoadUserProfile .
Службы и приложения, которые вызывают LoadUserProfile, должны проверить, есть ли у пользователя временный профиль. Если пользователь имеет перемещаемый профиль, указать путь к нему в качестве lpProfilePath члена PROFILEINFO.
Для IIS этот параметр указывает, должна ли служба загружать профиль пользователя для удостоверения пула приложений. Если значение этого параметра "True", то служба IIS загружает профиль пользователя для удостоверения пула приложений. Если необходимо поведение IIS 6.0 без загрузки профиля пользователя для удостоверения пула приложений задайте значение "False". Так, что если получаете "HTTP Error 503. The service is unavailable" и ничего не помогает, то пробуем его отключить.
Не создает временный файл конфигурации пула
Ошибку "Service Unavailable: HTTP Error 503. The service is unavailable" вы легко можете ловить из-за того, что ваш пул по какой-то причине не может создать временный файл конфигурации и об этом может свидетельствовать предупреждение в логах:
На начальном этапе обновления "Центр обновления Windows" сканирует существующие папки и файлы и записывает их пути для восстановления после обновления. Однако, поскольку файлы конфигурации являются временными, они удаляются при остановке WAS.
На следующем этапе Центра обновления Windows эти ранее отсканированные файлы и папки копируются во временную папку обновления. После обновления Windows "Центр обновления Windows" создает символическую ссылку на каждую папку, которая была скопирована во временное местоположение обновления, прежде чем он пытается восстановить эти файлы и папки в их исходное местоположение.
Однако поскольку эти временные файлы конфигурации больше не существуют, Центр обновления Windows не удаляет символические ссылки.
Когда WAS пытается запустить как рабочий процесс IIS, он не создает временную папку для записи конфигурации из-за символических ссылок. Поэтому Http.Sys возвращает ошибку HTTP 503.
Чтобы решить эту проблему, вручную удалите символические ссылки, созданные "Центром обновления Windows". Для этого выполните следующие действия:
rmdir /s /q C:\inetpub\temp\appPools
net start W3SVC
- Из оболочки PowerShell в режиме администратора
Remove-Item -Recurse -Force C:\inetpub\temp\appPools\*
Start-Service W3SVC
Два сайта на 443 порту
Был интересный случай в прошлом, мне нужно было перенести один сайт с IIS на другой сервер. После переноса вместо сайта я видел уже вам известную ошибку "Service Unavailable: HTTP Error 503. The service is unavailable". Самое интересное, что ошибка была только для HTTPS, в то время как HTTP работал нормально. Напоминаю, что по умолчанию https использует порт 443, зная это я решил посмотреть, что слушает порт, можно было конечно воспользоваться утилитами netstat или TCPView, но я пошел в тот момент через PowerShell. Введите команду, чтобы посмотреть, что порт слушается.
Как видно сервер слушается.
Если вы когда-нибудь столкнетесь с такой проблемой как 503 ответ, то попробуйте остановить службу веб-публикации
И после этого опять запустить команду на прослушивание, если и в этом случае вы видите, что 443 порт ответил, то поздравляю у вас есть другой сервис мешающий IIS.
Если это сервер, который вы унаследовали, может быть нелегко определить, что прослушивает этот конкретный порт. Я установлю модуль PowerShell с именем Carbon (https://www.powershellgallery.com/packages/Carbon/) из галереи PowerShell, чтобы определить, что происходит.
Когда веб-сервер не-IIS установлен в Windows, он устанавливает ACL для порта, который будет прослушивать. Вы можете увидеть ACL, который ссылается на порт 443.
На самом деле, есть две записи для порта 443. Тот, у кого GUID все в порядке, так как он предназначен только для конкретного приложения через заголовок узла, а не по всему пространству имен.
Второе я вычислил через TCPView, это было приложение Dell EqualLogic SAN Headquarters, установленное на этом конкретном сервере, оно вызывало проблему, поэтому я решил удалить его, так как оно больше не нужно.
Хоть я и удалил Dell EqualLogic SAN Headquarters с сервера, это не удалило ACL, назначенный порту 443.
Поскольку деинсталляция приложения не решила проблему, я решил принудительно удалить ACL
После удаления этой записи и перезапуска веб-службы проблемы с прослушиванием IIS через порт 443 были решены.
Кстати можно в логах посмотреть кто установил ACL, но там не всегда все подробно. Выполните:
Дополнительные методы
- Перезагрузить сайт, через клавиши CTRL+F5
- Перезагрузите модем или компьютер
- Очистить кеш браузера
- Проверьте настройки прокси
- Если ошибку получаете в каком-то сервисе на телефоне, то попробуйте обновить приложение
- Проверка диска C:\ на ошибки
отличная статья, спасибо!
Спасибо за статью! У меня была проблема с учеткой, не стал углубляться почему, наверное что-то из-за обновления винды слетело, поменял учетку, все пошло!
Если вдруг кому поможет, то у нас например в организации эту ошибку вызывал корпоративный антивирус, он блокировал наше веб-приложение. Попробуйте его отключить, а еще лучше удалить.