При разработке и публикации HTTP-сервисов 1С на веб-сервере Apache под управлением Windows Server программисты часто сталкиваются с ситуацией, когда первый запрос к сервису проходит успешно, а второй и последующие вызывают ошибку «Ошибка работы с Интернет: Превышен таймаут». При этом сам веб-сервер перестает отвечать даже через браузер, и «лечится» это только перезапуском службы Apache. Рассмотрим подробно, почему это происходит и как настроить стабильную работу связки 1С и Apache, а также изучим альтернативные подходы к обработке HTTP запросов в экосистеме 1С.
Типичный сценарий обращения к HTTP-сервису из кода 1С выглядит следующим образом. Мы создаем объект HTTPСоединение, используя защищенное соединение, и отправляем HTTPЗапрос с телом в формате JSON. Чтобы упростить этот процесс, многие разработчики используют общий модуль для быстрой организации HTTP сервиса, содержащий набор готовых функций — для этой задачи подойдёт модуль автоматической настройки обмена через веб-сервисы 1С. Рассмотрим пример кода, который часто становится источником проблемы при неправильной настройке сервера:
&НаСервере
Процедура ВыполнитьЗапросНаСервере()
адресПортала = "localhost";
адресРесурса = "http_publication/hs/request_answer/parameters/";
// Использование ЗащищенноеСоединениеOpenSSL сигнализирует о работе через HTTPS
соединение = Новый HTTPСоединение(адресПортала, , , , , 0, Новый ЗащищенноеСоединениеOpenSSL);
запрос = Новый HTTPЗапрос(адресРесурса);
заголовки = Новый Соответствие;
заголовки.Вставить("Content-Type", "application/json");
заголовки.Вставить("Accept", "application/json");
запрос.Заголовки = заголовки;
Поля = Новый Структура;
Поля.Вставить("description", "test");
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Поля);
JSONТекст = ЗаписьJSON.Закрыть();
запрос.УстановитьТелоИзСтроки(JSONТекст);
Попытка
ответ = соединение.ОтправитьДляОбработки(запрос);
Исключение
// Здесь часто возникает ошибка "Превышен таймаут"
ЗаписьЖурналаРегистрации("Ошибка.HTTP", УровеньЖурналаРегистрации.Ошибка, , , ПодробноеОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Проблема заключается в том, что при использовании ЗащищенноеСоединениеOpenSSL платформа 1С строго проверяет валидность SSL-сертификата. Подобная интеграция между 1С без боли и страданий требует тщательной настройки серверной части — для оперативного реагирования на сбои поможет мониторинг журнала регистрации 1С с уведомлениями в Telegram. Если сертификат настроен неверно, Apache может «подвиснуть» в попытке завершить TLS-рукопожатие, что и приводит к таймауту на стороне клиента.
Проанализируем логи Apache (файл error.log) — для этого подойдёт инструмент сбора и анализа логов HTTP-запросов и ответов. Если мы видим записи вида AH01906: server certificate is a CA certificate, это критическая ошибка. Правильная публикация HTTP сервиса с использованием клиентского SSL сертификата требует, чтобы сертификат не помечался как Root CA при использовании в качестве конечного сертификата сервера.
Современные версии OpenSSL 3.x и Windows Server 2022 крайне чувствительны к таким несоответствиям. Когда 1С обращается к серверу, происходит разрыв сессии сразу после проверки заголовков, но поток Apache остается в «подвешенном» состоянии. Чтобы это исправить, необходимо перевыпустить сертификат с правильными параметрами, убедившись, что:
basicConstraints установлен в значение CA:FALSE.Subject Alternative Name (SAN), содержащее DNS-имя или IP-адрес сервера.После установки корректного сертификата статус соединения в браузере должен смениться с «Небезопасно» на доверенный, а служба Apache перестанет аварийно завершать рабочие процессы.
Если замена сертификата не помогла или помогла временно, разберем архитектурную особенность работы Apache на Windows. По умолчанию Apache использует специфические системные фильтры для оптимизации обработки сетевых пакетов. Однако в средах Windows Server 2022 эти фильтры часто конфликтуют с антивирусами или драйверами сетевых карт, что приводит к зависанию рабочих потоков worker threads.
Проанализируем файл конфигурации httpd.conf и в рамках оптимизации Apache для Windows добавим в него следующие директивы для отключения нестабильных оптимизаций:
# Отключаем специфические фильтры приема соединений для Windows
AcceptFilter http none
AcceptFilter https none
# Отключаем механизмы прямой передачи файлов и отображения в память
EnableSendfile off
EnableMMAP off
Эти настройки заставляют Apache использовать стандартные методы работы с сокетами, что значительно повышает стабильность работы 1С через HTTPСоединение.
Платформа 1С при работе с объектом HTTPСоединение старается использовать Keep-Alive — механизм повторного использования одного TCP-соединения для нескольких запросов. Если вы планируете использовать Access token and Refresh token для аутентификации, правильная настройка времени жизни соединения становится критически важной.
Выясним, как настроены лимиты в Apache. Найдем и отредактируем параметры в httpd.conf или extra/httpd-default.conf:
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
Если ошибка таймаута сохраняется, попробуем принудительно отключить удержание соединения в самом коде 1С, добавив заголовок:
заголовки.Вставить("Connection", "close");
Если после этого «зависания» прекратились, значит, проблема заключается в рассинхронизации тайм-аутов между клиентом (1С) и сервером (Apache).
В ОС Windows Apache использует модуль mpm_winnt, который создает один дочерний процесс и множество потоков внутри него. Для тех, кто осуществляет быструю организацию HTTP-сервиса через универсальные модули, важно понимать, что при возникновении ошибок SSL эти потоки могут быстро исчерпаться.
Для повышения отказоустойчивости рекомендуется выполнить глубокую настройку Apache MPM для Windows и настроить автоматический перезапуск рабочего процесса после обработки определенного количества запросов. Отредактируем httpd-mpm.conf:
<IfModule mpm_winnt_module>
ThreadsPerChild 150
MaxConnectionsPerChild 5000
</IfModule>
Параметр MaxConnectionsPerChild, установленный в значение, отличное от нуля, заставляет Apache корректно пересоздавать рабочий процесс, не дожидаясь его зависания.
Современные сборки Apache часто включают модуль mod_http2 по умолчанию. Однако механизмы 1С (особенно на старых релизах платформы 8.3) могут некорректно обрабатывать мультиплексирование запросов, что вызывает проблемы совместимости с протоколом HTTP/2 при работе через самоподписанные сертификаты. Рассмотрим возможность принудительного ограничения протокола до HTTP/1.1.
В файле httpd.conf найдите и закомментируйте строку загрузки модуля:
# LoadModule http2_module modules/mod_http2.so
Или в настройках виртуального хоста VirtualHost укажите:
Protocols http/1.1
Для стабильной работы HTTP-сервисов 1С на Apache под Windows необходимо выполнить комплекс действий. В первую очередь, убедимся в корректности SSL-сертификата (он не должен быть CA). Во вторую — отключим специфические фильтры Windows (AcceptFilter none). И в-третьих — настроим лимиты соединений, чтобы предотвратить залипание потоков. Совокупность этих мер полностью устраняет ошибку «Превышен таймаут» и обеспечивает бесперебойную работу интеграций.