HTTP Error 500.0 Internal Server Error в IIS - Полный гайд
Архитектура модулей IIS и симптомы сбоя (HTTP 500)
Пользователи открывают корпоративный сайт (например, 1С WEB, OWA или внутренний портал) и видят страницу с ошибкой: «HTTP Error 500.0 - Internal Server Error. The page cannot be displayed because an internal server error has occurred». (Внутренняя ошибка сервера. Страница не может быть отображена).
Суть ошибки 500.0 (General Failure)
В отличие от >500.19 (Ошибка web.config) или >503 (Пул упал), код 500.0 — это классический отказ на уровне приложения (Worker Process) или расширения (ISAPI/CGI). Процесс w3wp.exe жив, файл конфигурации прочитан успешно, но когда IIS попытался выполнить код (PHP, ASP.NET или сторонний DLL модуль), этот модуль вернул фатальную ошибку (Exception), упал с Access Denied (нехватка прав на чтение файла), либо завис.
Пошаговое дерево решений (Отладка и Права)
Сценарий 1: Нехватка прав NTFS (ApplicationPoolIdentity)
В современных IIS (версии 7.5+) пулы приложений работают не от имени NETWORK SERVICE, а от уникальных виртуальных учеток пула (ApplicationPoolIdentity). Если вы скопировали файлы сайта в папку, ядро IIS не сможет их прочитать для выполнения (Access Denied).
- Откройте папку сайта (например,
C:\inetpub\wwwroot\my_site). - Свойства -> Безопасность (Security) -> Изменить -> Добавить.
- В поле имен введите: IIS AppPool\ИМЯ_ВАШЕГО_ПУЛА (например, IIS AppPool\DefaultAppPool). Обратите внимание: расположение (Locations) должно быть установлено на ваш локальный ПК, а не домен!
- Дайте права Чтение и Выполнение (Read & Execute). Нажмите ОК.
Сценарий 2: Ограничения ISAPI и CGI (ISAPI Restrictions)
Если ваш сайт использует внешние обработчики (например, PHP.exe, Python или модули 1С wsisapi.dll), IIS из соображений безопасности блокирует их выполнение по умолчанию.
- Откройте Диспетчер IIS (IIS Manager) на уровне СЕРВЕРА (верхний узел).
- Дважды кликните иконку Ограничения ISAPI и CGI (ISAPI and CGI Restrictions).
- Если вашего модуля (например,
C:\php\php-cgi.exe) там нет — добавьте его. - Убедитесь, что статус модуля установлен в Разрешено (Allowed). Если стоит 'Not Allowed', сайт будет выдавать 500.0.
Сценарий 3: Сбор детальной трассировки (FREB Tracing)
Если права в норме, а 500.0 остается — программист написал код с ошибкой. Чтобы доказать это (или найти сбойный модуль IIS), включите трассировку неудачных запросов.
- В IIS Manager выберите ваш сайт -> Справа в панели Actions нажмите Failed Request Tracing (Трассировка невыполненных запросов) -> Включить (Enable).
- Нажмите иконку Правила трассировки (Failed Request Tracing Rules) в центре -> Добавить правило.
- Укажите коды состояния (Status Codes) = 500.
- Попробуйте открыть сайт в браузере (получите ошибку 500).
- Зайдите в папку
C:\inetpub\logs\FailedReqLogFiles\W3SVC...и откройте сгенерированный XML-файл (fr000001.xml) в Internet Explorer/Edge. - Вы увидите потрясающий графический отчет. Красным будет подсвечен точный модуль (например, `RewriteModule` или `ManagedPipelineHandler`) и точная причина сбоя (например, `2147942405` - Отказано в доступе).
Типовые ошибки администраторов
- Поиск причины 500.0 в браузере (RemoteOnly): В целях безопасности IIS не показывает детальный Stack Trace с ошибками кода (желтый экран) внешним пользователям. Чтобы увидеть реальную ошибку, зайдите на сам сервер по RDP, откройте браузер локально и перейдите на
http://localhost. Вы увидите настоящую причину сбоя (например, SQL Timeout).
Траблшутинг IIS и анализ логов FREB требует DevOps-квалификации. Возьмем вашу веб-инфраструктуру на системную поддержку: проанализируем трассы приложений, устраним узкие места (I/O, SQL-таймауты, нехватку прав ACL), настроим Application Pools и гарантируем 100% аптайм корпоративных сайтов.
Частые вопросы (FAQ)
Почему 500.0 появляется после обновления PHP?
Вы изменили путь к бинарнику php-cgi.exe (например, обновили с 7.4 на 8.1), но забыли обновить путь в разделе 'Сопоставления обработчиков' (Handler Mappings) в IIS для вашего сайта. IIS обращается к старому удаленному файлу и выдает 500.0.
Поможет ли перевод пула в 'Классический' (Classic) режим?
Да, если ваш сайт (или ISAPI-плагин) написан 15 лет назад и не поддерживает Интегрированный конвейер (Integrated Pipeline) современного IIS. Для современного ПО (ASP.NET MVC, .NET Core) всегда используйте Integrated.
Что означает HRESULT 0x80070005 в XML отчете FREB?
Это стандартный Win32 код 'Access Denied' (Отказано в доступе). Он подтверждает 'Сценарий 1' — у виртуальной учетной записи пула (или у IUSR, если это анонимный доступ) нет прав NTFS на чтение файла в wwwroot.
Влияют ли 32-разрядные приложения на 500.0?
Да. Если ваш модуль (ISAPI.dll) является 32-битным (x86), а пул работает в 64-битном режиме (x64), модуль не сможет загрузиться в память. Включите 'Enable 32-Bit Applications = True' в настройках пула.
Как сбросить IIS полностью для применения настроек?
Откройте командную строку (CMD) от имени администратора и выполните 'iisreset'. Это жестко перезапустит все службы W3SVC, пулы и сбросит кэш конфигурации (applicationHost.config).