Как решить проблему зависания Apache на Windows-сервере с 1С при увеличении числа клиентов?

Системный администратор 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При эксплуатации информационных систем 1С, опубликованных через веб-сервер Apache на платформе Windows, нередко возникает ситуация, когда с ростом числа одновременно работающих пользователей Apache начинает «зависать» — для управления нагрузкой есть обработка для принудительного завершения сеансов пользователей 1С. Это проявляется в том, что служба Apache в системных сервисах может отображаться как запущенная, но клиенты 1С теряют связь с сервером. В этой статье мы подробно разберем возможные причины такой проблемы, научимся анализировать логи Apache и Windows, а также рассмотрим методы оптимизации и устранения неполадок.

Начинаем диагностику: сбор информации и анализ логов

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

  1. Проверяем логи Apache. Начнем с самого веб-сервера. Нас интересуют файлы error.log и access.log, которые обычно находятся в директории logs установки Apache (например, C:/Program Files/Apache Software Foundation/Apache2.4/logs/). Внимательно изучаем записи за период, когда наблюдались проблемы.
  2. Проверяем логи операционной системы. Открываем оснастку "Просмотр событий" (eventvwr.msc или compmgmt.exe -> "Просмотр событий") и обращаемся к журналам Windows: "Система" и "Приложение". Здесь мы ищем записи, совпадающие по времени с моментами зависания Apache. Возможно, проблема связана с конфликтами с другим программным обеспечением, нехваткой ресурсов или критическими ошибками ОС.
  3. Определяем количество клиентов. Важно понимать, о каком количестве пользователей идет речь, когда возникает проблема — для оперативного мониторинга подойдёт панель управления сеансами и регламентными заданиями 1С. Это поможет оценить масштаб нагрузки и принять соответствующее решение по масштабированию или оптимизации.
  4. Уточняем поведение клиентов. Что именно видят пользователи? Получают ли они конкретную ошибку от сервера, или просто соединение отваливается по таймауту? Это может указывать на характер проблемы — ошибку приложения, перегрузку сети или полную недоступность сервера.

Анализ сообщений в логах Apache

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

1. Сообщения, связанные с определением имени сервера и SSL-сертификатами

Часто в логах Apache можно увидеть следующие предупреждения:


AH00558: httpd.exe: Could not reliably determine the server's fully qualified domain name, using ::1. Set the 'ServerName' directive globally to suppress this message
AH01909: ::1:443:0 server certificate does NOT include an ID which matches the server name

Или аналогичные с IPv6-адресом fe80::1a0:c97a:1e41:db3d вместо ::1.

Что это означает:

Как устранить:

Для устранения предупреждения AH00558 и связанных с ним предупреждений SSL-сертификата, рекомендуется явно указать директиву ServerName в основном конфигурационном файле Apache (обычно httpd.conf или apache2.conf). Указываем полное доменное имя сервера или его IP-адрес и порт:

ServerName ваш_домен_или_IP:443

Например:


ServerName localhost:443
ServerName 192.168.1.100:443
ServerName myserver.example.com:443

2. Предупреждение о не сконфигурированном кэше SSL-сессий

В логах Apache также может встречаться сообщение:

AH01873: Init: Session Cache is not configured [hint: SSLSessionCache]

Что это означает:

Это предупреждение говорит о том, что кэш SSL-сессий не настроен. Без кэша при каждом новом SSL-соединении требуется выполнять полное рукопожатие SSL, что увеличивает накладные расходы и может замедлять установку соединений, особенно при большом количестве клиентов. Это может косвенно влиять на производительность и восприниматься как «подвисания».

Как устранить:

Для настройки кэша сессий необходимо добавить директиву SSLSessionCache в конфигурационный файл SSL (обычно httpd-ssl.conf). Убедитесь, что соответствующий модуль кэширования (например, mod_socache_shmcb) загружен. Пример конфигурации:


LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
...
SSLSessionCache "shmcb:C:/Program Files/Apache Software Foundation/Apache2.4/logs/ssl_scache(512000)"
SSLSessionCacheTimeout 300

Мы указываем тип кэша (shmcb - на основе общей памяти), путь к файлу кэша и его размер в байтах (в данном случае 512 КБ), а также время жизни кэшированной сессии в секундах.

3. Сообщение о получении сигнала на завершение работы

Одним из наиболее тревожных сообщений в логах является:

Parent: Received shutdown signal -- Shutting down the server.

Что это означает:

Это сообщение указывает на то, что родительский процесс Apache получил сигнал на завершение работы и начал останавливать дочерние процессы. Причины могут быть разными:

Если это происходит не по расписанию и без вашего вмешательства, нам необходимо искать причину внезапного завершения в журналах событий Windows (Система, Приложение). Там могут быть записи о сбоях службы httpd.exe, конфликтах портов или других системных ошибках.

4. Ошибка AH00341: winnt_accept: Asynchronous AcceptEx failed.

Эта ошибка, часто сопровождаемая сообщением (OS 64)The specified network name is no longer available., является достаточно специфичной для Apache на Windows:


[Fri Nov 13 06:06:11.161694 2020] [mpm_winnt:warn] [pid 4320:tid 664] (OS 64)The specified network name is no longer available. : AH00341: winnt_accept: Asynchronous AcceptEx failed.

Что это означает:

Эта ошибка возникает из-за проблем в работе сетевого стека Windows, когда стороннее программное обеспечение или драйверы некорректно взаимодействуют с функциями Windows Sockets (WinSock). Это может быть антивирус, фаервол, или другое ПО, которое перехватывает сетевые операции. Внешне это проявляется как отсутствие ответа от сервера для клиентов, хотя Apache формально и запущен.

Как устранить:

Для Apache 2.4 и выше, мы можем попробовать отключить использование функций AcceptEx путем добавления следующих директив в конфигурацию Apache (например, в httpd.conf или httpd-ssl.conf для соответствующих портов):


AcceptFilter https none
AcceptFilter http none

Для более старых версий Apache, или в качестве альтернативы, можно использовать директиву Win32DisableAcceptEx on. Также рекомендуется отключить использование функций `MMAP` и `Sendfile`, которые могут вызывать проблемы на некоторых системах Windows:


EnableMMAP off
EnableSendfile off

Эти изменения могут помочь обойти проблемы с сетевым стеком, которые вызывают ошибку AH00341.

Оптимизация производительности Apache с модулем mpm_winnt

На Windows-серверах Apache использует модуль управления процессами mpm_winnt. Этот модуль работает иначе, чем, например, mpm_prefork или mpm_event на Linux. mpm_winnt запускает один родительский процесс и один дочерний процесс, который, в свою очередь, создает несколько потоков (worker threads) для обработки всех запросов. Вся нагрузка обрабатывается этим единственным дочерним процессом.

Для оптимизации работы mpm_winnt, нам следует внимательно настроить следующие директивы:

1. ThreadsPerChild и ThreadLimit

Директива ThreadsPerChild определяет количество потоков, которые может запустить дочерний процесс Apache для обработки запросов. ThreadLimit устанавливает максимальное количество потоков, которое дочерний процесс может создать за весь свой жизненный цикл (обычно равно или больше ThreadsPerChild). По умолчанию ThreadsPerChild для mpm_winnt составляет 64.

На что обратить внимание:

Как оптимизировать:

Мы должны найти оптимальный баланс. Для этого проводим нагрузочное тестирование. Начинаем с дефолтного значения или немного увеличиваем его, постоянно мониторя загрузку ЦП, ОЗУ и дисковой подсистемы сервера. Помним, что каждое соединение 1С может потреблять значительные ресурсы. Ищем файл httpd.conf или httpd-mpm.conf и корректируем директивы:


<IfModule mpm_winnt_module>
    ThreadsPerChild 100
    ThreadLimit 100
</IfModule>

Убедитесь, что ThreadLimit не меньше ThreadsPerChild.

2. MaxRequestsPerChild

Эта директива определяет, сколько запросов может обработать дочерний процесс Apache, прежде чем он будет перезапущен. После достижения этого лимита, дочерний процесс завершается, и родительский процесс запускает новый.

На что обратить внимание:

Частые перезапуски дочерних процессов могут привести к накладным расходам и кратковременным прерываниям обслуживания, что негативно скажется на производительности. Если дочерний процесс стабилен, нет утечек памяти и других проблем, частые перезапуски нежелательны.

Как оптимизировать:

В идеале для mpm_winnt мы устанавливаем это значение в 0 (ноль) или очень большое число, чтобы дочерний процесс работал бесконечно, если он стабилен. Это позволяет избежать накладных расходов на создание новых процессов. Если нестабильность все же наблюдается, можно установить большое значение, например, 1 000 000, и уменьшать его только при необходимости, если мы точно знаем, что проблема в "старении" процесса:


<IfModule mpm_winnt_module>
    MaxRequestsPerChild 0
</IfModule>

3. KeepAliveTimeout

Директива KeepAliveTimeout определяет время в секундах, в течение которого Apache будет ждать нового запроса в рамках уже установленного "живого" HTTP-соединения (Keep-Alive). Keep-Alive соединения позволяют клиенту отправлять несколько запросов по одному TCP-соединению, что уменьшает накладные расходы на его установку.

На что обратить внимание:

Высокое значение KeepAliveTimeout может привести к тому, что рабочие потоки Apache будут заняты ожиданием запросов от бездействующих клиентов. Это уменьшает количество доступных потоков для новых соединений, что при высокой нагрузке может вызывать задержки или отказы для новых клиентов.

Как оптимизировать:

Для серверов с высокой нагрузкой мы рекомендуем устанавливать это значение между 1 и 5 секундами. Для 1С-клиентов, которые часто обмениваются данными, это обычно достаточный интервал:


KeepAlive On
KeepAliveTimeout 3

4. Кэширование

Использование дискового кэширования (например, с помощью модуля mod_cache_disk) может значительно повысить производительность, снижая нагрузку на сервер и ускоряя отдачу статического контента (например, файлов интерфейса 1С или служебных скриптов). Кэширование в памяти (mod_cache_socache) может быть быстрее, но приводить к более высокому потреблению памяти.

Как использовать:

Мы должны активировать и настроить соответствующие модули кэширования в httpd.conf. Например:


LoadModule cache_module modules/mod_cache.so
LoadModule cache_disk_module modules/mod_cache_disk.so

<IfModule mod_cache_disk.c>
    CacheRoot "C:/Apache24/cache"
    CacheDirLevels 2
    CacheDirLength 1
    CacheLockFile "C:/Apache24/logs/cache.lock"
    CacheMaxFileSize 10485760    # 10 MB
    CacheMinFileSize 1024       # 1 KB
    CacheMaxStreamingBuffer 262144 # 256 KB
    CacheForceCompletion 1
    CacheEnable disk /
</IfModule>

Мы устанавливаем директорию для кэша, его структуру и правила кэширования. Важно тщательно тестировать конфигурацию кэша, чтобы избежать кэширования динамического контента или контента, чувствительного ко времени.

Разделение нагрузки и изоляция проблем

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

1. Публикация разных баз 1С через разные экземпляры Apache

Это может помочь распределить нагрузку между несколькими процессами Apache и изолировать потенциальные проблемы. Если одна из баз или один из клиентов вызывает чрезмерную нагрузку или сбой, это не повлияет на работу других баз. Мы можем запустить несколько экземпляров Apache, каждый на своем порту или привязанный к своему IP-адресу, и публиковать каждую базу 1С через свой экземпляр. Это применимо как для файловых, так и для серверных баз 1С. Для решения этой задачи можно использовать скрипт автоматического запуска нескольких экземпляров Apache на одном сервере.

Как это сделать:

  1. Создайте копии папки установки Apache.
  2. Для каждого экземпляра скорректируйте пути в httpd.conf (например, ServerRoot).
  3. Измените порты Listen для каждого экземпляра, чтобы они не конфликтовали.
  4. Создайте отдельные службы Windows для каждого экземпляра Apache, используя httpd.exe -k install -n "Apache24_Instance2" -f "C:/Apache24_Instance2/conf/httpd.conf".
  5. Настройте файлы публикации 1С (.vrd) для каждого экземпляра Apache.

2. Выявление конкретного проблемного клиента или отчета

Иногда причиной зависаний является не общая нагрузка, а действия одного конкретного пользователя или запуск ресурсоемкого отчета. Мы должны проанализировать access.log Apache и логи сервера 1С (при их наличии) в момент зависания, чтобы определить, какие запросы выполнялись и какие пользователи были активны.

Дополнительные проверки и рекомендации

Помимо настроек Apache и анализа его логов, мы должны выполнить несколько дополнительных проверок, касающихся серверной инфраструктуры и самой 1С.

1. Мониторинг ресурсов сервера

В момент зависаний Apache обязательно мониторим загрузку ресурсов сервера: процессор (ЦП), оперативная память (ОЗУ), дисковая подсистема (Disk I/O) и сетевой интерфейс — для этой задачи есть инструмент анализа производительности 1С, серверов и СУБД. Для этого мы можем использовать "Диспетчер задач" Windows или "Монитор ресурсов".

2. Проблемы с кэшем 1С

Иногда проблемы могут быть не в Apache, а в самой 1С. Поврежденный или переполненный кэш 1С у клиентов может вызывать зависания или некорректную работу. Мы можем порекомендовать пользователям очистить локальные каталоги кэша 1С. Обычно это делается удалением папок с числовыми именами в %appdata%\1C\1CE\ или %LOCALAPPDATA%\1C\1CE\.

3. Параметр SessionTimeout в файле публикации 1С (.vrd)

Если клиенты теряют связь, хотя Apache, кажется, работает, это может быть связано с настройками сессий 1С. В файле публикации .vrd (который находится в папке публикации на веб-сервере) есть параметр SessionTimeout. Если он установлен слишком маленьким, сессии клиентов могут автоматически завершаться. При необходимости можно воспользоваться удобным инструментом для публикации баз 1С и настройки параметров vrd-файлов.


<application xmlns="http://v8.1c.ru/8.2/virtual-resource-description"
             xmlns:xs="http://www.w3.org/2001/XMLSchema"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://v8.1c.ru/8.2/virtual-resource-description http://v8.1c.ru/8.2/virtual-resource-description.xsd">
    <appInfo name="MyBase">
        <ws enable="true"/>
        <httpServices enable="true"/>
        <connection string="Srvr="SERVER_1C";Ref="MyBase";"/>
        <security enable="true" allowStandardAuthentication="true" allowClientAuthentication="true"/>
        <sessionOptions timeout="3600"/> <!-- Увеличиваем таймаут сессии до 3600 секунд (1 час) -->
    </appInfo>
</application>

Увеличение значения timeout может предотвратить преждевременное завершение сессий.

4. Проверка занятых портов

Если Apache не запускается или работает нестабильно, мы должны убедиться, что его порты (обычно 80 для HTTP и 443 для HTTPS) не заняты другими приложениями, такими как IIS, Skype, VMware Workstation или другим ПО. Для проверки мы используем команду в командной строке:


netstat -ao | findstr ":80"
netstat -ao | findstr ":443"

Это покажет список процессов, которые прослушивают указанные порты, и их PID (идентификатор процесса). Затем мы можем найти соответствующий процесс в "Диспетчере задач" и при необходимости остановить его.

Заключение

Зависание Apache на Windows-сервере с 1С — это комплексная проблема, которая требует систематического подхода к диагностике. Мы начинаем с тщательного анализа логов Apache и Windows, затем переходим к оптимизации конфигурации Apache (особенно mpm_winnt), и при необходимости рассматриваем архитектурные решения по разделению нагрузки. Не забываем и о мониторинге ресурсов сервера, а также о специфических настройках 1С. Последовательно применяя эти шаги, мы сможем выявить и устранить причину нестабильной работы веб-сервера.

← На главную