Ошибка HTTP Error 503. The service is unavailable

Ошибка HTTP Error 503. The service is unavailable

HTTP Error 503

Добрый день! Уважаемые читатели и гости одного из крупнейших 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 приложения и хотел их протестировать, но какого же было мое удивление, когда я в место привычной формы авторизации увидел ошибку:

Service Unavailable: HTTP Error 503. The service is unavailable.

Service Unavailable: HTTP Error 503. The service is unavailable

Причины ошибки 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)

Определение версии на сервере с ошибкой Service Unavailable: HTTP Error 503. The service is unavailable

После переустановки я поставил версию от июня 2020. Когда я уже в ней запускал сайт RDweb на ферме RDS, то сервис ответил корректно и HTTP Error 503 я не увидел.

Так, что если у вас только, что установленная Windows Server 2019, то попробуйте ее снести и установить заново, это может быть куда быстрее чем заниматься траблшутингом, самое ценное это ваше время, лучше уж провести его полезнее.

Проверка работы 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. Советую смотреть четыре журнала. Первые два стандартные, это "Система" и "Приложения". Например вы можете увидеть вот такое событие с предупреждением:

Код ID 1309

Код ID 1309: Event code: 3005
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. Как видно у него статус "Остановлено", попробуйте его запустить.

Запуск пула в IIS при ошибке 503

Если пул не запускается, то я вам советую активировать в просмотре событий два дополнительных журнала:

  • Microsoft-Windows-IIS-Configuration/Administrative
  • Microsoft-Windows-IIS-Configuration/Operational

Журналы, где можно искать события по ошибке Service Unavailable: HTTP Error 503. The service is unavailable

Так же что-то полезное вы можете найти в текстовом файле располагающемся по пути:

C:\Windows\System32\LogFiles\HTTPERR

Как видно из файла у меня был выключен пул "2020-07-01 08:34:12 ::1%0 62570 ::1%0 443 HTTP/2 GET /RDWeb 5 503 1 Disabled RDWebAccess". У вас может быть тут другая ошибка.

C:\Windows\System32\LogFiles\HTTPERR

Вы можете выполнить в PowerShell вот такой запрос по получению информации из данного файла, только для 503 кода.

Get-ChildItem -Path ‘C:\windows\system32\LogFiles\HTTPERR’ -Include *.log -Recurse | Where-Object LastWriteTime -gt (Get-Date).AddDays(-7) | Select-String -SimpleMatch ‘ 503 ‘

Получение информации из HTTPERR’ по ошибке 503

Отключение 32 битного режима на пуле IIS

В журнале Microsoft-Windows-IIS-W3SVC-WP вы можете увидеть ошибку с кодом события: 2282, где:

Не удалось загрузить модуль DLL из-за ошибки в конфигурации. Текущая конфигурация поддерживает только загрузку образов для x86 архитектуру процессора. Поле данных содержит номер ошибки.

По умолчанию 32-разрядная поддержка отключена в пулах приложений. Если не требуется поддержка 32-разрядных, проверьте параметры каждого из пулов приложений убедитесь, что значение Разрешить 32-разрядные приложения имеет значение False.

Откройте дополнительные параметры у нужного пула, через контекстное меню.

Отключение 32 битного режима у пула IIS

Еще раз проверьте что параметр Enable32bitAppOnWin64 (Разрешить 32-разрядные приложения) имеет значение "False".

Проверка пула IIS на параметр Enable32bitAppOnWin64

Подробнее об этом вот тут - https://support.microsoft.com/ru-ru/help/2619402/error-503-service-unavailable-when-you-browse-windows-sbs-websites

Проверка учетной записи от которой запускается пул

Я очень часто встречал безалаберных системных администраторов, которым было лень создавать отдельные учетные записи для каждой службы или сервиса с которой они работают. Они делали просто, запускали все из под себя с максимальными правами или для теста так делали и забывали, что так оставили. Потом с течением времени учетную запись могут отключить или сменить пароль, что сразу делает ваш пул неработоспособным, он просто не может запустить его. Исходя из этого проверьте данную ситуацию. В дополнительных параметрах найдите раздел "Удостоверение" и посмотрите от имени кого у вас запущен ваш пул, по умолчанию должна быть встроенная учетная запись "ApplicationPoolidentity".

Проверка учетной записи от которой запускается пул

При необходимости вы можете выбрать другую учетную запись для запуска пула. После изменения, обязательно перезапустите пул, а лучше саму службу IIS.

Выбор учетной записи от имени которой запускается пул IIS

Отключение Load User Profile на пуле IIS

Когда пользователь входит в систему в интерактивном режиме, система автоматически загружает профиль пользователя. Если служба или приложение олицетворяет пользователя, система не загружает профиль пользователя. Поэтому служба или приложение должны загрузить профиль пользователя с помощью LoadUserProfile .

Службы и приложения, которые вызывают LoadUserProfile, должны проверить, есть ли у пользователя временный профиль. Если пользователь имеет перемещаемый профиль, указать путь к нему в качестве lpProfilePath члена PROFILEINFO.

Для IIS этот параметр указывает, должна ли служба загружать профиль пользователя для удостоверения пула приложений. Если значение этого параметра "True", то служба IIS загружает профиль пользователя для удостоверения пула приложений. Если необходимо поведение  IIS 6.0 без загрузки профиля пользователя для удостоверения пула приложений задайте значение "False". Так, что если получаете "HTTP Error 503. The service is unavailable" и ничего не помогает, то пробуем его отключить.

Отключение Load User Profile на пуле IIS

Не создает временный файл конфигурации пула

Ошибку "Service Unavailable: HTTP Error 503. The service is unavailable" вы легко можете ловить из-за того, что ваш пул по какой-то причине не может создать временный файл конфигурации и об этом может свидетельствовать предупреждение в логах:

Службе активации процессов Windows не удалось создать файл конфигурации пула приложений для пула приложений < DefaultAppPool >. Тип ошибки: «5». Чтобы решить эту проблему, убедитесь, что файл applicationhost.config указан правильно, и повторите последние изменения конфигурации. Поле данных содержит номер ошибки.

Подробнее об этом на - https://support.microsoft.com/en-in/help/4050891/error-http-503-and-was-event-5189-from-web-applications-on-windows-10

Все происходит по причине того, что служба активации Windows (WAS) создает временный файл конфигурации для каждого пула приложений IIS в папке C:\inetpub\temp\appPools во время обычной работы.

На начальном этапе обновления "Центр обновления Windows" сканирует существующие папки и файлы и записывает их пути для восстановления после обновления. Однако, поскольку файлы конфигурации являются временными, они удаляются при остановке WAS.

На следующем этапе Центра обновления Windows эти ранее отсканированные файлы и папки копируются во временную папку обновления. После обновления Windows "Центр обновления Windows" создает символическую ссылку на каждую папку, которая была скопирована во временное местоположение обновления, прежде чем он пытается восстановить эти файлы и папки в их исходное местоположение.

Однако поскольку эти временные файлы конфигурации больше не существуют, Центр обновления Windows не удаляет символические ссылки.

Когда WAS пытается запустить как рабочий процесс IIS, он не создает временную папку для записи конфигурации из-за символических ссылок. Поэтому Http.Sys возвращает ошибку HTTP 503.

Чтобы решить эту проблему, вручную удалите символические ссылки, созданные "Центром обновления Windows". Для этого выполните следующие действия:

net stop WAS /y
rmdir /s /q C:\inetpub\temp\appPools
net start W3SVC

Stop-Service -Force WAS
Remove-Item -Recurse -Force C:\inetpub\temp\appPools\*
Start-Service W3SVC

Удаление временных файлов конфигурации пула в IIS

Два сайта на 443 порту

Был интересный случай в прошлом, мне нужно было перенести один сайт с IIS на другой сервер. После переноса вместо сайта я видел уже вам известную ошибку "Service Unavailable: HTTP Error 503. The service is unavailable". Самое интересное, что ошибка была только для HTTPS, в то время как HTTP работал нормально. Напоминаю, что по умолчанию https использует порт 443, зная это я решил посмотреть, что слушает порт, можно было конечно воспользоваться утилитами netstat или TCPView, но я пошел в тот момент через PowerShell. Введите команду, чтобы посмотреть, что порт слушается.

Get-NetTCPConnection -LocalPort 443 -State Listen

Как видно сервер слушается.

Проверка порта 443 на доступность через PowerShell

Если вы когда-нибудь столкнетесь с такой проблемой как 503 ответ, то попробуйте остановить службу веб-публикации

Stop-Service -Name w3svc -PassThru

И после этого опять запустить команду на прослушивание, если и в этом случае вы видите, что 443 порт ответил, то поздравляю у вас есть другой сервис мешающий IIS.

Остановка службы IIS

Если это сервер, который вы унаследовали, может быть нелегко определить, что прослушивает этот конкретный порт. Я установлю модуль PowerShell с именем Carbon (https://www.powershellgallery.com/packages/Carbon/) из галереи PowerShell, чтобы определить, что происходит.

Install-Module -Name Carbon -Force -AllowClobber

Когда веб-сервер не-IIS установлен в Windows, он устанавливает ACL для порта, который будет прослушивать. Вы можете увидеть ACL, который ссылается на порт 443.

Get-HttpUrlAcl

То же самое через cmd - netsh http show urlacl

На самом деле, есть две записи для порта 443. Тот, у кого GUID все в порядке, так как он предназначен только для конкретного приложения через заголовок узла, а не по всему пространству имен.

Get-HttpUrlAcl

Второе я вычислил через TCPView, это было приложение Dell EqualLogic SAN Headquarters, установленное на этом конкретном сервере, оно вызывало проблему, поэтому я решил удалить его, так как оно больше не нужно.

Dell EqualLogic SAN Headquarters

Хоть я и удалил Dell EqualLogic SAN Headquarters с сервера, это не удалило ACL, назначенный порту 443.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *