Мы сталкиваемся с распространенной, но весьма неприятной проблемой: веб-сервер Apache, обслуживающий платформу 1С:Предприятие, регулярно вылетает с ошибкой AH00428: Parent: child process xxxxx exited with status 3221225477 -- Restarting. При этом в системных логах Windows фиксируется сбой приложения httpd.exe с именем сбойного модуля core83.dll и кодом исключения 0xc0000005. Это указывает на серьезное нарушение доступа к памяти, происходящее внутри веб-расширения 1С.
В нашем конкретном случае, проблема возникла после переустановки Windows Server 2019, установки платформы 1С 8.3.24.1586 (64-битной) и Apache/2.4.62 (Win64) OpenSSL/3.1.7. Сервер имеет 64 ГБ ОЗУ и обслуживает до 10 пользователей, каждый из которых запускает по 3-5 экземпляров 1С, работающих с двумя базами на SQL Server 2016 и 65 файловыми базами. Такой объем файловых баз, опубликованных через веб-сервер, создает значительную нагрузку и может быть источником нестабильности.
Давайте подробно разберем, что означают эти ошибки, и какие шаги мы можем предпринять для их устранения.
Прежде всего, давайте выясним, что означают ошибки, с которыми мы имеем дело:
AH00428: Parent: child process xxxxx exited with status 3221225477 -- Restarting: Это сообщение из логов Apache указывает на то, что родительский процесс Apache (httpd.exe) обнаружил, что один из его дочерних рабочих процессов завершил работу с определенным кодом состояния, и пытается его перезапустить. Сам по себе перезапуск дочернего процесса — это штатное поведение Apache при сбоях, но код состояния 3221225477 является критичным.3221225477: В десятичном представлении этот код соответствует шестнадцатеричному значению 0xC0000005. На платформе Windows этот код означает EXCEPTION_ACCESS_VIOLATION, или нарушение доступа к памяти. Это критическая ошибка, которая происходит, когда программа пытается получить доступ к области памяти, которая ей не была выделена, или к которой у нее нет соответствующих прав доступа. Такие ошибки часто свидетельствуют о серьезных багах в программном обеспечении, попытке записи в защищенную область памяти, или переполнении буфера/стека.core83.dll: Это самый важный индикатор. Модуль core83.dll является ключевым компонентом платформы 1С:Предприятие (версии 8.3) и отвечает за взаимодействие с информационными базами и выполнение основной логики. То, что сбой происходит именно в нем, прямо указывает на проблему в компонентах веб-расширения 1С, используемых Apache. Это может быть связано с ошибками в самом модуле, его некорректной работой с выделенной памятью, или конфликтами с другими компонентами.0x0000000000122577: Это смещение внутри модуля core83.dll, где произошло нарушение. Для обычной диагностики это не так критично, но для разработчиков 1С эта информация была бы бесценной для точного определения места бага в коде.В совокупности эти ошибки говорят нам о том, что веб-расширение 1С (core83.dll) в какой-то момент пытается получить доступ к запрещенной области памяти, что приводит к аварийному завершению дочернего процесса Apache и его последующему перезапуску. Сообщения вида AH10244: invalid URI path или AH02811: stderr from C:/Apache24/cgi-bin/luci: script not found, которые также присутствуют в логах Apache, вероятнее всего, являются фоновым "шумом" от сканеров безопасности или попыток взлома и напрямую не связаны с описываемым сбоем core83.dll.
Одной из наиболее частых причин ошибок AH00428 на платформе Windows, особенно когда Apache работает со сторонними модулями, активно использующими стек памяти (как в случае с веб-расширением 1С), является недостаточно большой размер стека потоков. На Windows Apache использует модель mpm_winnt, где один дочерний процесс запускает несколько потоков. Каждый из этих потоков имеет свой стек.
Давайте рассмотрим, для чего нужен этот параметр и как его регулировать:
ThreadStackSize? Это параметр в конфигурации Apache, который определяет максимальный размер стека в байтах для каждого рабочего потока (thread) дочернего процесса Apache. Стек — это область памяти, используемая функцией для хранения локальных переменных, адресов возврата и параметров функций. Если приложение или модуль активно использует рекурсию, глубокие вызовы функций или большие локальные переменные, оно может быстро исчерпать доступный размер стека, что приводит к переполнению стека и, как следствие, к нарушению доступа к памяти (0xC0000005).ThreadStackSize до 134217728 байт, что равно 128 МБ. Это очень большое значение. По умолчанию на Windows размер стека Apache часто составляет 1 МБ. В интернете, для решения подобных проблем, часто рекомендуют устанавливать ThreadStackSize в 8 МБ (8388608 байт) или 16 МБ. Например, в одном из сообщений (сообщение 4) упоминается успешное решение аналогичной проблемы путем увеличения ThreadStackSize до 8 МБ.core83.dll некорректно обрабатывает выделенную ему память, независимо от ее размера.ThreadStackSize обычно задается в основном конфигурационном файле Apache — httpd.conf, в секции <IfModule mpm_winnt_module>. Если он закомментирован (#ThreadStackSize), значит, используется значение по умолчанию.Рассмотрим пример настройки ThreadStackSize вместе с другими важными параметрами mpm_winnt_module:
<IfModule mpm_winnt_module>
# Рекомендуем начать с 8MB (8388608 байт) или 16MB (16777216 байт)
# Если 128MB не помогло, попробуйте промежуточные значения
# ThreadStackSize 8388608
# Если вы уверены, что 128MB необходимо и у вас достаточно ОЗУ (как в вашем случае 64GB)
# и вы подтвердили, что 8MB или 16MB недостаточно:
ThreadStackSize 134217728
# Количество рабочих потоков, запускаемых дочерним процессом Apache
ThreadsPerChild 500
# Максимальное количество запросов, которое будет обработано дочерним процессом
# до его принудительного перезапуска. Значение 0 означает бесконечность.
# Если есть подозрение на утечки памяти, конечное значение (например, 1000000)
# может помочь периодически очищать память.
MaxConnectionsPerChild 10000
</IfModule>
После каждого изменения файла httpd.conf обязательно перезапускайте службу Apache, чтобы изменения вступили в силу. Если после увеличения ThreadStackSize до разумных пределов (например, 8-16 МБ) или даже до 128 МБ (при наличии достаточного ОЗУ) проблема сохраняется, мы должны искать причину в других аспектах.
Веб-расширение 1С, как любой сложный сторонний модуль, должно быть тщательно протестировано и оптимизировано для работы с конкретными версиями веб-сервера. Несмотря на то, что 1С заявляет о поддержке Apache 2.4 с версии платформы 8.3.8, конкретные минорные версии Apache могут вносить изменения или иметь свои нюансы, которые влияют на стабильность работы модуля 1С.
Рассмотрим этот аспект подробнее:
core83.dll вашей версии 1С (8.3.24.1586) был протестирован или лучше работает именно с более ранними версиями Apache 2.4.C:\Apache24) и его конфигурационных файлов (httpd.conf, httpd-vhosts.conf и т.д.), а также конфигурации веб-публикаций 1С.webinst.exe из каталога установки 1С. Это гарантирует, что компоненты 1С будут правильно связаны с новой версией Apache.Экспериментирование с версиями Apache — это важный шаг в таких случаях, когда проблема возникает после переустановки с новой версией веб-сервера.
Ваша текущая конфигурация — 10 пользователей, каждый из которых запускает по 3-5 экземпляров 1С, работающих с двумя базами на SQL Server и 65 файловыми базами, опубликованными через один экземпляр Apache — является весьма ресурсоемкой и потенциально нестабильной. Такая нагрузка на один веб-сервер, особенно с файловыми базами, может приводить к проблемам с производительностью и стабильностью.
Давайте проанализируем ситуацию и рассмотрим возможности оптимизации:
core83.dll. Если есть возможность, мы настоятельно рекомендуем рассмотреть перевод всех или большинства активно используемых баз на SQL Server.MaxConnectionsPerChild: В вашей конфигурации MaxConnectionsPerChild установлено в 10000. Этот параметр определяет, сколько запросов каждый дочерний процесс Apache обработает, прежде чем будет принудительно перезапущен. Если у нас есть подозрения на утечки памяти или нестабильность в модуле 1С, установка конечного значения (например, 100000 или 1000000, а не 0, что означает "бесконечно") может помочь периодически "очищать" состояние дочерних процессов и предотвращать накопление проблем. Однако, если сбои происходят быстро, это значение может не сильно помочь.webinst.exe: 1С предоставляет утилиту webinst.exe (находящуюся в каталоге установки платформы 1С), которая позволяет публиковать информационные базы на различных веб-серверах или разных экземплярах Apache. Мы можем использовать ее для настройки публикаций на каждый из наших новых сервисов.C:\Apache24 в, например, C:\Apache24_SQL и C:\Apache24_Files.httpd.conf, меняя порт (например, 8080 для одного и 8081 для другого) и путь к PID-файлу, чтобы они не конфликтовали.C:\Apache24_SQL\bin\httpd.exe -k install -n "Apache24_SQL" -f "C:\Apache24_SQL\conf\httpd.conf"
C:\Apache24_Files\bin\httpd.exe -k install -n "Apache24_Files" -f "C:\Apache24_Files\conf\httpd.conf"
Разделение нагрузки не только повысит стабильность, но и упростит локализацию проблем: если один из сервисов вылетает, другие продолжают работать, и мы можем точно определить, какая группа баз или пользователей вызывает нестабильность.
Если предыдущие шаги не привели к полному устранению проблемы, нам необходимо углубиться в диагностику:
0xC0000005. Запуск Apache в отладчике (например, Visual Studio Debugger, WinDbg или OllyDbg) позволит нам "поймать" момент сбоя. Отладчик покажет точное место в коде core83.dll, где происходит нарушение доступа к памяти, а также состояние стека вызовов. Это требует определенной квалификации, но предоставляет самую точную информацию.depends.exe), чтобы проверить core83.dll и httpd.exe на предмет их зависимостей. Убедитесь, что все необходимые библиотеки (особенно библиотеки Microsoft Visual C++ Redistributable, с которыми скомпилирован Apache и 1С) присутствуют и имеют правильные версии. Удостоверьтесь, что Apache и 1С используют одни и те же библиотеки C++ Redistributable.Проблема с вылетами Apache, вызванными сбоем в core83.dll, является сложной и требует системного подхода. Мы рассмотрели несколько ключевых направлений для диагностики и решения:
ThreadStackSize для предотвращения переполнения стека.MaxConnectionsPerChild и использование нескольких сервисов Apache для распределения нагрузки.Помните, что решение такой проблемы часто является итеративным процессом. Действуйте пошагово, фиксируйте все изменения и внимательно отслеживайте результаты. Это позволит вам не только устранить текущую нестабильность, но и значительно улучшить общую надежность вашей инфраструктуры 1С.