Как программно публиковать базы 1С на веб-сервере без перезапуска и отключения пользователей?

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

Часто перед системными администраторами и программистами встает задача автоматизировать процесс создания и публикации баз 1С на веб-сервере. Стандартный подход, при котором в файл конфигурации Apache (httpd.conf) дописываются новые алиасы, имеет серьезный недостаток: для применения настроек требуется перезапуск службы. В результате у всех активных пользователей веб-клиента 1С зависает интерфейс на 10-15 секунд, а новые подключения временно не обрабатываются. Разберем подробнее, как избежать этих прерываний и настроить систему для бесшовного добавления новых баз.

Почему команда Graceful Restart плохо работает с 1С под Windows?

Проанализируем ситуацию с плавным перезапуском. На серверах под управлением Unix-систем администраторы часто используют команду мягкого перезапуска Apache, которая позволяет старым процессам корректно завершить работу, а новым — сразу начать принимать запросы. В ОС Windows (которая часто используется для серверов 1С) тоже есть аналогичная команда: httpd -k graceful.

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

Рассмотрим несколько проверенных способов решения этой проблемы.

Решение 1: Пул резервных (пустых) публикаций

Самый простой и наименее затратный вариант для Apache — заранее создать резерв виртуальных каталогов. Суть метода заключается в том, что сам модуль веб-расширения 1С (wsisapi) способен перечитывать файл default.vrd на лету, без перезапуска веб-сервера. Перезапуск нужен только при изменении httpd.conf.

Разберем алгоритм по шагам:

  1. Вручную или скриптом один раз добавляем в httpd.conf нужное количество алиасов (например, 100 публикаций с именами вроде base1, base2... base100).
  2. Перезапускаем Apache один раз ночью, когда в базах нет пользователей.
  3. Внутри каталогов этих публикаций создаем файлы default.vrd.
  4. Когда возникает потребность программно опубликовать новую базу, мы просто берем свободную публикацию из пула и программно перезаписываем ее файл default.vrd.

Пример изменения строки подключения внутри файла default.vrd:


<?xml version="1.0" encoding="UTF-8"?>
<vrs:point xmlns:vrs="http://v8.1c.ru/8.2/virtual-resource-system"
           base="/base1"
           ib="Srvr=MyServer;Ref=MyNewDatabase;">
</vrs:point>

Когда база больше не нужна, она удаляется, а публикация остается нетронутой — ее можно перезаписать при следующем запросе на создание новой базы. Если пул резервных публикаций подходит к концу, скрипт может ночью добавить новые алиасы в httpd.conf и сделать плановый рестарт.

Решение 2: Переход на веб-сервер IIS

Если сервер работает на ОС Windows 10 или Windows Server, целесообразно отказаться от Apache в пользу штатного сервера IIS (Internet Information Services). Архитектура IIS идеально подходит для программного создания публикаций.

Посмотрим на преимущества IIS в контексте 1С:

Из 1С вы можете вызывать PowerShell-скрипты, использующие командлеты New-WebApplication, генерировать нужный default.vrd в папке назначения и сразу предоставлять доступ пользователям.

Решение 3: Сине-зеленое развертывание с помощью Nginx

Если по корпоративным стандартам требуется использовать именно Apache, мы можем построить отказоустойчивую схему балансировки с помощью прокси-сервера Nginx.

Настроим архитектуру из двух экземпляров Apache и одного Nginx:

  1. Устанавливаем два независимых сервера Apache на одном сервере, но на разных портах (например, порт 8081 и порт 8082).
  2. Перед ними ставится Nginx, который слушает стандартный 80/443 порт и проксирует трафик на основной Apache (например, на порт 8081).
  3. Когда нужно программно добавить новую базу, скрипт модифицирует httpd.conf резервного Apache (порт 8082).
  4. Резервный Apache перезапускается. Так как на него нет активного трафика, это происходит мгновенно и безопасно.
  5. После успешного старта резервного Apache, скрипт обновляет конфигурацию Nginx (меняет целевой порт проксирования на 8082) и выполняет команду nginx -s reload.

В отличие от Windows-версии Apache, команда перезагрузки конфигурации в Nginx работает безупречно: он не сбрасывает установленные TCP-соединения, а новые подключения моментально направляет на обновленный резервный Apache. После этого бывший основной сервер становится резервным до следующего обновления.

Подводя итог, можно сказать, что проблема прерывания работы пользователей при программной публикации решается выбором правильной архитектуры. Вы можете использовать предсозданные каталоги, если не хотите усложнять инфраструктуру; перейти на IIS для максимальной интеграции с Windows; либо настроить прозрачное проксирование через Nginx для высоконагруженных систем.

← На главную