При работе с высоконагруженными системами или сервисами, которые постоянно обмениваются данными, полная перепубликация информационной базы на веб-сервере крайне нежелательна. Это приводит к разрыву текущих соединений, сбросу сессий и потенциальной потере передаваемых данных. Однако при разработке новых функций в расширениях часто возникает необходимость оперативно внедрить новый HTTP-сервис. Рассмотрим, как решить эту задачу, используя механизмы «мягкого» перезапуска веб-сервера Apache и ручную корректировку конфигурационных файлов 1С.
По умолчанию при публикации базы через конфигуратор или утилиту webinst, 1С формирует файл default.vrd. Если мы добавляем новый сервис в основную конфигурацию, перепубликация неизбежна. Но для расширений предусмотрен более гибкий механизм. Проблема автора заключается в том, что по умолчанию платформа 1С не публикует HTTP-сервисы из расширений автоматически, если это не указано в настройках публикации. Разберем по шагам, как активировать сервисы расширений вручную.
Файл default.vrd является основным дескриптором публикации вашей информационной базы. Чтобы веб-сервер «увидел» HTTP-сервисы внутри расширений, нам необходимо отредактировать этот XML-файл. Проанализируем два способа настройки.
Способ А: Глобальная публикация всех расширений
Если мы хотим, чтобы все текущие и будущие расширения автоматически публиковали свои сервисы, необходимо добавить атрибут publishExtensionsByDefault="true" в секцию httpServices. Это избавит от необходимости править файл при добавлении новых расширений в будущем.
Пример структуры файла:
<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="Srvr=ServerName;Ref=BaseName;">
<httpServices publishExtensionsByDefault="true">
<service name="MyStandardService" rootUrl="std" />
</httpServices>
</point>
Способ Б: Точечная публикация конкретных расширений
Для повышения безопасности и контроля рекомендуется публиковать только нужные расширения. Для этого внутри элемента <point> добавим дочерний элемент <extensions>. Это позволит системе точно знать, какие расширения должны участвовать в обработке HTTP-запросов.
<extensions>
<extension name="ИмяВашегоРасширения" active="true"/>
</extensions>
После того как мы внесли изменения в default.vrd, веб-сервер Apache должен их перечитать. Обычная команда restart полностью останавливает все рабочие процессы и запускает их заново, что обрывает активные HTTP-сессии. Для предотвращения этого воспользуемся режимом graceful.
Для операционных систем семейства Linux:
Команда graceful дает сигнал родительскому процессу Apache оповестить дочерние процессы о необходимости завершения работы после обслуживания текущего запроса. Новые запросы при этом сразу начинают обрабатываться новыми процессами с обновленной конфигурацией.
sudo apache2ctl graceful
Если ваша система использует System V или старые версии дистрибутивов, можно применить следующую команду:
sudo service apache2 graceful
Для операционных систем Windows:
В среде Windows работа с Apache осуществляется через исполняемый файл службы. Для мягкого перезапуска выполним команду в командной строке (cmd), запущенной от имени администратора, перейдя в папку bin установленного Apache:
httpd.exe -k restart
Или, если исполняемый файл называется иначе:
apache.exe -k restart
Важно помнить, что структура URL для HTTP-сервисов, находящихся в расширениях, отличается от стандартных сервисов основной конфигурации. Если мы обратимся по старому шаблону, то получим ошибку 404. Рассмотрим правильный формат формирования пути:
http://{Сервер}/{Имя_Публикации}/hs/{Имя_Расширения}/{Корневой_URL_Сервиса}/{Относительный_Путь}
Проанализируем пример: если база опубликована как trade, расширение называется Integration, а корневой URL сервиса — v1, то запрос должен уходить на адрес: http://server/trade/hs/Integration/v1/getData.
Рассмотрим несколько важных технических моментов, которые часто упускаются из виду при ручной правке конфигурации:
default.vrd через nano или vi под учетной записью root, права на файл могут измениться. Убедитесь, что пользователь, от которого запущен Apache (например, www-data), имеет права на чтение этого файла. Проверим права командой: ls -l default.vrd.
tail -f /var/log/apache2/error.log
mod_1c может удерживать состояние конфигурации. Если graceful не помог, попробуйте временно переименовать файл default.vrd, обратиться к серверу (получить ошибку), вернуть имя обратно и снова выполнить graceful.Authorization в конфигурационном файле httpd.conf, иначе 1С не сможет аутентифицировать пользователя HTTP-сервиса:
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
Таким образом, мы выяснили, что добавление нового сервиса из расширения не требует прерывания работы пользователей. Достаточно корректно настроить XML-структуру файла публикации и отправить веб-серверу сигнал на мягкое обновление конфигурации. Это позволяет поддерживать высокую доступность сервисов 1С даже в процессе активной разработки и внедрения новых функций.