Проблема «холодного старта» HTTP-сервисов в среде 1С:Предприятие — одна из самых распространенных задач, с которой сталкиваются разработчики при интеграции систем. Особенно остро это проявляется в файловом варианте базы данных, где задержка при первом обращении может достигать 30 секунд и более. В этой статье мы подробно разберем причины такого поведения и рассмотрим проверенные методы оптимизации, которые позволят вашим сервисам отвечать мгновенно.
Для начала проанализируем ситуацию: почему последующие вызовы отрабатывают за доли секунды, а первый требует столько времени? Дело в том, что при первом обращении к URL-адресу опубликованного сервиса система 1С выполняет полный цикл инициализации среды. Рассмотрим, что именно происходит за кулисами:
wsap24.dll (или аналогичную для вашей версии).1Cv8.1CD. На медленных дисках или при большом объеме конфигурации это занимает значительное время.После того как сеанс создан, он попадает в так называемый пул соединений. Последующие запросы используют уже «прогретый» сеанс, что и обеспечивает молниеносную скорость ответа.
Основным инструментом решения проблемы является правильная настройка файла публикации default.vrd. Нам необходимо заставить систему удерживать сеанс в памяти как можно дольше, чтобы он не закрывался сразу после выполнения запроса. Рассмотрим структуру секции pool, которую нужно добавить или изменить в файле .vrd.
Проанализируем пример настройки пула соединений:
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
base="/MyBase"
ib="File="D:\Bases\MyBase";">
<httpService name="MyService" alias="MyService.1cws" enable="true" reuseSessions="autouse" />
<standardOdata enable="true" reuseSessions="autouse" />
<pool size="10" timeout="600" maxAge="1800" />
</point>
Разберем параметры секции pool подробнее:
size: Максимальное количество удерживаемых сеансов. Для небольших систем достаточно значения 5–10.timeout: Время в секундах, в течение которого сеанс будет оставаться в пуле после завершения последнего вызова. Установив здесь 600 (10 минут) или более, мы гарантируем, что при периодических запросах пользователю не придется ждать инициализации.maxAge: Общее время жизни сеанса в секундах. По истечении этого времени сеанс будет корректно завершен и создан заново при следующем обращении (профилактика утечек памяти).Важным параметром в настройке самого сервиса является reuseSessions="autouse". Это указывает платформе на необходимость автоматического использования повторных сеансов.
Как показывает практика, включенный режим отладки на веб-сервере может существенно замедлять процесс первого подключения, так как системе требуется время на установку связи с конфигуратором. Посмотрим на настройки параметров отладки в vrd-файле:
<debug enable="false" url="tcp://localhost:1560" />
Если вам критична скорость первого запуска на «боевом» сервере, обязательно отключите отладку (установите enable="false"). Если же отладка необходима для разработки, попробуйте явно указать порт отладчика, это может сократить время поиска процесса с 30 до 3–5 секунд.
Выясним еще одну скрытую причину тормозов — ожидание ответа от менеджера лицензий. Модуль расширения веб-сервера при первом запуске пытается найти ключ защиты. Чтобы ускорить этот процесс, выполним следующие шаги:
nnhasp.ini, который используется модулем расширения (обычно он находится в папке conf или рядом с бинарными файлами 1С на веб-сервере).
NH_TCPIP = ENABLE
NH_SERVER_ADDR = 127.0.0.1 (или IP вашего сервера)
NH_USE_BROADCAST = DISABLE
Также проанализируем работу антивирусного ПО. При первом обращении веб-сервер начинает активно читать файл 1Cv8.1CD. Антивирусы (включая встроенный Защитник Windows) могут блокировать доступ к этому файлу для проверки. Добавьте расширения .1CD, .1CL и процессы веб-сервера (httpd.exe или w3wp.exe) в исключения антивируса.
Если даже после всех настроек первый запуск после перезагрузки компьютера или простоя кажется вам долгим, применим метод «прогрева». Идея заключается в том, чтобы имитировать обращение к сервису еще до того, как к нему обратится реальный клиент.
Рассмотрим варианты реализации:
curl), который будет раз в 5–10 минут отправлять пустой запрос к нашему HTTP-сервису. Это не даст сеансу в пуле «заснуть» по таймауту.
Invoke-WebRequest -Uri "http://localhost/MyBase/hs/MyService/Ping" -Method Get
Start Mode = AlwaysRunning, а в настройках самого сайта включить Preload Enabled = True. Это заставит IIS инициализировать приложение сразу после запуска службы.Стоит отметить, что версии Windows Home (Home Basic, Home Single Language) имеют встроенные ограничения на количество одновременных сетевых соединений и управление фоновыми процессами. На этих системах стабильная работа веб-сервера с 1С затруднена. Если вы вынуждены использовать такую ОС, максимально облегчите задачу системе: отключите все неиспользуемые компоненты веб-сервера и убедитесь, что база лежит на SSD-накопителе, так как файловая 1С крайне чувствительна к скорости дисковых операций в момент инициализации метаданных.
Мы проанализировали ситуацию и выяснили, что для устранения задержек первого запуска необходимо:
.vrd с достаточным timeout.nnhasp.ini.Применение этих мер в комплексе позволяет сократить время ожидания ответа от HTTP-сервиса с десятков секунд до миллисекунд даже при первом обращении после длительного простоя.