При администрировании инфраструктуры 1С нередко возникает ситуация, когда на одном веб-сервере Microsoft Internet Information Services (IIS) требуется одновременно предоставить доступ к базам, работающим на разных версиях платформы (например, часть баз остается на 8.3.9, а обновленные конфигурации требуют релиза 8.3.10 или выше). При попытке стандартной публикации новой базы системные администраторы часто сталкиваются с ошибками загрузки модуля ISAPI, падением веб-сервисов или ошибкой HTTP 500. Разберем причины такого поведения и пошагово настроим корректное сосуществование разных версий платформы 1С на одном веб-сервере IIS.
Проанализируем ситуацию: модуль расширения веб-сервера 1С wsisapi.dll при инициализации веб-приложения загружается в адресное пространство рабочего процесса IIS — w3wp.exe. Вместе с собой модуль подгружает набор вспомогательных динамических библиотек платформы (например, core83.dll). Имена этих базовых библиотек одинаковы для всех подверсий ветки 8.3.
Если в рамках одного пула приложений IIS (а значит, внутри одного процесса w3wp.exe) попытаться запустить две публикации, использующие разные релизы (например, 8.3.9.ХХХХ и 8.3.10.ХХХХ), операционная система не сможет одновременно загрузить в память процесса две разные версии DLL с одинаковыми именами. Это приводит к конфликту адресации памяти и сбою рабочего процесса.
Согласно руководству администратора 1С:Предприятия, модули расширения веб-сервера, которые различаются третьей и четвертой цифрами номера версии (то есть релизом и сборкой в рамках одной ветки 8.3), не могут исполняться в рамках одного пула приложений. Каждая версия платформы 1С требует полностью изолированного пула приложений со своим собственным процессом w3wp.exe.
Разберем по шагам, как правильно организовать работу нескольких версий платформы на одном веб-сервере IIS.
Запустим оснастку управления IIS (inetmgr), перейдем в раздел Пулы приложений (Application Pools) и добавим новый пул. Дадим ему понятное наименование, отражающее версию платформы, например 1C_Pool_8_3_10.
Откроем Дополнительные параметры (Advanced Settings) созданного пула и проверим ключевые настройки:
— Версия среды CLR .NET: выставляем значение Без управляемого кода (No Managed Code), так как модуль wsisapi.dll является нативной C++ библиотекой и не требует запуска среды .NET Framework.
— Разрешены 32-разрядные приложения (Enable 32-Bit Applications): если используется 64-разрядная платформа 1С (установленная в Program Files), параметр должен иметь значение False. Если установлена 32-разрядная версия (в каталоге Program Files (x86)), переключаем параметр в True. Несоответствие разрядности процесса и разрядности DLL приведет к сбою загрузки модуля.
Найдем виртуальный каталог опубликованной информационной базы в дереве IIS, перейдем в его Основные настройки (Basic Settings) и выберем созданный пул приложений 1C_Pool_8_3_10.
На уровне всего сервера IIS откроем раздел Ограничения ISAPI и CGI (ISAPI and CGI Restrictions). Убедимся, что для пути к wsisapi.dll новой версии платформы добавлено разрешающее правило со статусом Разрешено (Allowed). Если библиотека заблокирована, IIS вернет ошибку HTTP 404.2.
Учетная запись, от имени которой запускается пул приложений (по умолчанию IIS AppPool\1C_Pool_8_3_10 или локальная группа IIS_IUSRS), должна обладать правами на чтение и выполнение к двум каталогам:
— К папке исполняемых файлов платформы соответствующей версии: C:\Program Files\1cv8\8.3.10.2580\bin\;
— К физической директории веб-публикации базы, где сохраняются дескриптор default.vrd и конфигурационный файл web.config.
Посмотрим на пример корректного содержимого файла web.config, расположенного в каталоге публикации базы для 64-разрядной версии платформы:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers>
<remove name="1c crs" />
<remove name="1c cws" />
<add name="1C Web-service Extension_8_3_10_2580" path="*" verb="*" modules="IsapiModule" scriptProcessor="C:\Program Files\1cv8\8.3.10.2580\bin\wsisapi.dll" resourceType="Unspecified" requireAccess="None" preCondition="bitness64" />
<add name="1c cws" path="*.1cws" verb="*" modules="IsapiModule" scriptProcessor="C:\Program Files\1cv8\8.3.10.2580\bin\wsisapi.dll" resourceType="File" requireAccess="Execute" preCondition="bitness64" />
<add name="1c crs" path="*.1crs" verb="*" modules="IsapiModule" scriptProcessor="C:\Program Files\1cv8\8.3.10.2580\bin\wsisapi.dll" resourceType="File" requireAccess="Execute" preCondition="bitness64" />
</handlers>
</system.webServer>
</configuration>
В атрибуте scriptProcessor должен быть строго прописан путь к библиотеке wsisapi.dll той версии платформы, с которой работает информационная база.
Чтобы избежать ошибок ручного редактирования конфигурационных файлов при частых обновлениях версий, рекомендуется выполнять публикацию через консольную утилиту webinst, расположенную в каталоге bin необходимой версии платформы. Вызов утилиты сформирует файлы web.config и default.vrd с корректными путями:
"C:\Program Files\1cv8\8.3.10.2580\bin\webinst.exe" -publish -iis -wsdir "MyBase" -dir "C:\inetpub\wwwroot\MyBase" -connstr "Srvr=1c-server;Ref=MyBase;" -confpath "C:\Windows\System32\inetsrv\config\applicationHost.config"
После выполнения команды останется лишь назначить для созданного приложения выделенный пул в консоли управления IIS.