Имеется windows-сервер c 1С 8.3 (БД — MSSQL).
Задача — настроить публикацию базы на линуксовом web-сервере.
Тонкости — модуль 1С для апача работает только с 2.0 и 2.2, а текущая версия в большинстве дистрибутивов — 2.4+
Пишется больше для себя, чтобы не забыть. Ну и мало ли, вдруг пригодится еще кому — не придется бегать по форумам в поисках нужных команд.

Железо — дал гигабайт оперативки, одно ядро и 20 гигабайт диска. Увеличить никогда не поздно.
ОС: Debian Stable, привык я к нему.

Ставлю минимум, включая ssh-сервер, но не включая web. К этому еще вернемся.
2016-01-08_091636

После установки базовая настройка по вкусу, я обычно ставлю локаль utf8, ставлю sudo, mc и vim, остальное по потребностям.
Дальше надо поставить apache 2.2. Причем сделать это правильным способом, а не просто скачав deb-пакет. :)

Сперва добавляем в /etc/apt/sources.list строчки со ссылкой на предыдущую версию дистрибутива.
deb http://mirror.yandex.ru/debian/  wheezy main
deb-src http://mirror.yandex.ru/debian/ wheezy main

Можно, конечно, написать oldstable — в настоящий момент тоже будет правильно. Но только в настоящий, потому рано или поздно выйдет новая стабильная версия и в oldstable и тогда вместо apache 2.2 там будет 2.4. Хотя, надеюсь, к тому времени 1С обновится и заработает с более новыми версиями апача. Но кто их знает? :)
Где mirror.yandex.ru — там пишется имя вашего любимого сервера с репозиторием.

Потом обновляем индексы — apt-get update — и смотрим, что у нас тут есть по apache командой apt-cache showpkg apache2
Там много всего выводится, но нас интересует только начало вывода:
Package: apache2
Versions:
2.4.10-10+deb8u3 (/var/lib/apt/lists/mirror.yandex.ru_debian_dists_stable_main_binary-i386_Packages)
Description Language:
                 File: /var/lib/apt/lists/mirror.yandex.ru_debian_dists_stable_main_binary-i386_Packages
                  MD5: d02426bc360345e5acd45367716dc35c
Description Language: en
                 File: /var/lib/apt/lists/mirror.yandex.ru_debian_dists_stable_main_i18n_Translation-en
                  MD5: d02426bc360345e5acd45367716dc35c
Description Language: ru
                 File: /var/lib/apt/lists/mirror.yandex.ru_debian_dists_stable_main_i18n_Translation-ru
                  MD5: d02426bc360345e5acd45367716dc35c

2.4.10-10+deb8u1 (/var/lib/apt/lists/security.debian.org_dists_stable_updates_main_binary-i386_Packages)
Description Language:
                 File: /var/lib/apt/lists/mirror.yandex.ru_debian_dists_stable_main_binary-i386_Packages
                  MD5: d02426bc360345e5acd45367716dc35c
Description Language: en
                 File: /var/lib/apt/lists/mirror.yandex.ru_debian_dists_stable_main_i18n_Translation-en
                  MD5: d02426bc360345e5acd45367716dc35c
Description Language: ru
                 File: /var/lib/apt/lists/mirror.yandex.ru_debian_dists_stable_main_i18n_Translation-ru
                  MD5: d02426bc360345e5acd45367716dc35c

2.2.22-13+deb7u6 (/var/lib/apt/lists/mirror.yandex.ru_debian_dists_wheezy_main_binary-i386_Packages)
Description Language:
                 File: /var/lib/apt/lists/mirror.yandex.ru_debian_dists_wheezy_main_binary-i386_Packages
                  MD5: d24f049cd70ccfc178dd8974e4b1ed01
Description Language: en
                 File: /var/lib/apt/lists/mirror.yandex.ru_debian_dists_wheezy_main_i18n_Translation-en
                  MD5: d24f049cd70ccfc178dd8974e4b1ed01
Description Language: ru
                 File: /var/lib/apt/lists/mirror.yandex.ru_debian_dists_wheezy_main_i18n_Translation-ru
                  MD5: d24f049cd70ccfc178dd8974e4b1ed01


Видим, что кроме 2.4.10 имеется версия 2.2.22-13+deb7u6 — то, что нужно.
Ставим: apt-get install apache2=2.2.22-13+deb7u6
Или, точнее: apt-get install apache2=2.2.22-13+deb7u6 apache2-mpm-worker=2.2.22-13+deb7u6 apache2.2-common=2.2.22-13+deb7u6 apache2.2-bin=2.2.22-13+deb7u6, а остальные зависимости уже подтянутся автоматом.

После этого ставим апачей на холд, чтобы не обновить случайно.

apt-mark hold apache2 apache2-mpm-worker apache2.2-common apache2.2-bin
apache2 помечен как зафиксированный.
apache2-mpm-worker помечен как зафиксированный.
apache2.2-common помечен как зафиксированный.
apache2.2-bin помечен как зафиксированный.

Можно запустить service apache2 start и стукнуть телнетом на 80 порт для проверки, если лень браузер запускать.

telnet localhost 80
Trying ::1... Connected to localhost. 
Escape character is '^]'. 
1 
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head> 
<title>501 Method Not Implemented</title> 
</head><body> 
<h1>Method Not Implemented</h1> 
<p>1 to /index.html not supported.<br /> 
</p> <hr> 
<address>Apache/2.2.22 (Debian) Server at 1cweb Port 80</address> 
</body></html> 
Connection closed by foreign host.


Ругается — значит работает.

Теперь ставим 1С.
Нужны только веб-сервисы 1С (пакет 1c-enterprise83-ws). И 1c-enterprise83-common, который в зависимостях прописан. И 1c-enterprise83-server, который в зависимостях не прописан, но без него утилита публикации пишет «Ошибка сегментирования».
В принципе, необходим только модуль для апача wsap22.so из пакета 1c-enterprise83-ws, а всё остальное можно через текстовый редактор сделать. Но я человек ленивый и лучше потрачу несколько мегабайт на 1С, чем буду руками вбивать строчки в конфиги. :)

Дальше надо создать папку для хранения настроек опубликованных БД 1С. Можно в дереве вебсервера, но я лучше отдельно сделаю, прямо в корне, /1с.
После этого из папки с установленными файлами 1С (/opt/1C/v8.3/i386) запускаем утилиту публикации webinst со следующими параметрами (публикую нашу тестовую базу):
./webinst -apache22 -wsdir testlitupp -dir /1c/testlitupp -connstr "Srvr=10.0.0.4;Ref=testlitupp;" -confPath /etc/apache2/apache2.conf
Публикация выполнена


-apache22 — наша версия вебсервера
-wsdir testlitupp — папка на вебсервере, в которой будет доступна опубликованная база (http://вашсервер/testlitupp)
-dir /1c/testlitupp — папка, в которой будет храниться файл default.vrd с настройками публикации
-connstr «Srvr=10.0.0.4;Ref=testlitupp;» — ip сервера 1С и имя публикуемой базы данных
-confPath /etc/apache2/apache2.conf — путь к конфигу apache

Если было написано «Публикация выполнена», значит всё прошло удачно. Если пишет «Ошибка сегментирования», то вы, скорее всего, забыли поставить 1c-enterprise83-server.
По результатам имеем файл default.vrd
<?xml version="1.0" encoding="UTF-8"?> 
<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="/testlitupp" ib="Srvr=10.0.0.4;Ref=testlitupp;"/>

И несколько новых строк в файле конфигурации веб-сервера:

LoadModule _1cws_module "/opt/1C/v8.3/i386/wsap22.so"

# 1c publication
Alias "/testlitupp" "/1c/testlitupp/"
<Directory "/1c/testlitupp/"> 
AllowOverride All 
Options None 
Order allow,deny 
Allow from all 
SetHandler 1c-application 
ManagedApplicationDescriptor "/1c/testlitupp/default.vrd" 
</Directory>

Перезапускаем апач (service apache2 restart) и идём смотреть, что там опубликовалось.
Опубликовалось, просит пароль.
2016-01-08_115425

И впускает в базу.
2016-01-08_115604

Работает. Дополнительные настройки публикации делаются через редактирование vrd-файлов (к примеру, включение отладки), а допиливанием интерфейса веб-клиента должны заниматься ваши программисты 1С.
Если будете дописывать опции, к примеру, с подключением сервисов руками, то не забудьте удалить в файле default.vrd последний слэш в строчке «base="/testlitupp" ib="Srvr=10.0.0.4;Ref=testlitupp;"/>», я с этим долго возился. Если не удалить и что-то дописать после, то вылетает «ошибка 500» без дополнительной информации.
Какая будет нагрузка на вебсервер — я ещё не знаю, у нас это пока в тестовом режиме работает и хватает выделенных ресурсов. Но добавить памяти или ядер по мере увеличения потребностей проблем не составит.

В целом, в других дистрибутивах linux всё делается аналогично, различия только в способах установки старой версии apache.

Комментарии (19)


  1. alexhemp
    09.01.2016 13:36

    Сделайте лучше docker-контейнер — это гораздо удобнее чем инструкция с картинками.


    1. aik
      09.01.2016 13:58
      +1

      Картинки просто чтобы текст разбавить, вся нужная информация текстом идёт.
      А что такое «docker-контейнер» — я не особо в курсе, не возникало такой необходимости (ну, знаю, что это какой-то вариант виртуальной машины, но не более).


      1. alexhemp
        09.01.2016 14:40
        +1

        Просто то что вы делаете вручную — это прошлый век :)
        Гораздо полезнее оформить это в виде Dockerfile.
        Автоматизация процесса развертывания, гарантия повторяемости результата + изоляция приложения от хост-системы.

        Докер — это не «вариант виртуализации», это способ «упаковать» приложение и затем автоматически его разворачивать на любом хосте, где установлен докер (а сейчас он работает на любом современном linux-дистрибутиве).


        1. prabhu
          09.01.2016 15:48
          +1

          Подскажите, где можно почитать доступно с примерами про docker?


          1. alexhemp
            09.01.2016 16:29

            Так тут на хабре было очень много уже материалов на эту тему.

            Один раз попробовав докер от него уже не отказаться.

            Я, к примеру, даже сервер приложений 1С 8.2 и PostgreSQL с патчами 1С разворачиваю docker-контейнерами. Это очень удобно, потому что элементарно повторяемая установка — не нужно все делать вручную, один раз сделал Dockerfile, изоляция приложения — например Postgres-1С требует специфические версии библиотек.
            А уже всякие специфические web-приложения, что требуют специфического окружения для запуска — тут докер просто спасение.

            Представьте себе что вам нужно N разных версий Web-приложения 1С развернуть, например один боевой вариант и пару новых версий. Или например они выпустят модуль для Apache 2.4? Вам для теста придется разворачивать несколько машин, даже виртуальных.

            С докером вы все это сделаете легко и непринужденно. и потом при миграции — опустите один контейнер, запустите другой.


        1. aik
          09.01.2016 16:51
          +1

          Только для начала надо понять, что это такое. Я читал несколько статей, но так и не понял, как этот докер использовать и где оно мне может пригодиться.
          К примеру, как эти контейнеры с сетью общаются? На каждый контейнер виртуальная сетевая карта создаётся? Или надо их по разным портам растаскивать?


          1. alexhemp
            09.01.2016 16:56

            Обычно используется NAT.
            При запуске контейнера указывается какой порт контейнера на какой порт хоста нужно замапить.

            Докер — это возможность «упаковать» приложение со всеми потребными библиотеками и обращаться с ним примерно как с единым исполнимым файлом. При том что внутри там может быть много чего.

            Это сложно объяснить в двух словах, это другой уровень абстракции. Вместо того чтобы каждый раз париться с установкой чего-то — достаточно сделать правильную «инструкцию» в виде Dockerfile. Далее это приложение может быть собрано в виде контейнера автоматически, отправлено в репозиторий, скачано на другие машины (хоть на миллион), запущено и остановлено как единое целое.

            Сам контейнер обеспечивает уровень изоляции наподобии виртуальной машины, но из-за отсутствия слоя виртуализации — падения производительности нет.


            1. aik
              09.01.2016 19:10

              Ну ладно, допустим. Как это применимо к моему случаю? Надо опубликовать базу в вебе.
              Мой вариант:
              запустил виртуальную машину (само собой, никто её с нуля не ставил, просто достал образ с полки),
              поставил нужный апач,
              1С,
              опубликовал базу.
              Если надо опубликовать еще одну или ту же с другими настройками — редактируется vrd-файл и вставляется еще десяток строчек в конфиг апача. В корне вебсервера лежит скрипт, который показывает список опубликованных баз. Чтобы юзерам не приходилось рассылать ссылки.

              Вариант с докером:
              запустил виртуальную машину,
              настроил там докер (у меня нет образа с настроенным докером),
              поставил нужный апач,
              1С,
              опубликовал базу.
              засунул в контейнер — а что именно засунул? По идее, у меня там должны быть апач и 1С. Ну если изолировать службу и зависимости. Ну или точнее, апач с подключенным модулем, файл default.vrd и строчка в конфиге.
              Надо опубликовать еще одну базу или базу с другими настройками. Что делаю? Лезу в контейнер и меняю конфиги? Или делаю копию контейнера, лезу в копию и меняю конфиги?


              1. alexhemp
                09.01.2016 19:23

                Вариант с докером более «индустриальный»

                На локальной машине — поставил какой-нить убунту, в нее докер.

                Написал Dockerfile, в нем явно описываются папки с данными например.

                Далее на этой-же машине — собрал образ контейнера.
                Написал команду docker-run (или использовал docker-compose например)

                Что в результате — полностью повторяемое окружение. Можешь послать другу Dockerfile по почте. Или развернуть на реальном железе — все будет ровно так-же.
                Хочется второй контейнер — просто запускаешь, передаешь скажем другие папки.
                Вариантов масса, они выглядят сложными, но это только кажется.
                В реальности выходит полностью само-документированная конфигурация и легко запускаемые контейнеры с приложением.

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


                1. aik
                  09.01.2016 20:19
                  +1

                  Всё равно ничего не понял. Теперь еще папки с данными появились.

                  Хочется второй контейнер — просто запускаешь, передаешь скажем другие папки.

                  Так что в контейнере-то лежит? Апач с модулем 1С? Просто апач? Конфиги и модуль 1С я отдельно снаружи держу?

                  Вариантов масса, они выглядят сложными, но это только кажется.

                  Может и кажется, но я пока не вижу никакого упрощения в сравнении с реальной машиной. Только лишние слои абстракции.


                  1. citius
                    10.01.2016 00:19

                    Если вам надо 1 раз в жизни развернуть виртуалку под конкретную задачу и забыть про нее надолго, то докер конечно не нужен.
                    Современная манера пихать его везде где ни попадя есть зло.
                    Но вот если у вас задача не разовая, и инфраструктура требует стандартизации и повторяемости, то изучить стоит, контейнеры очень удобны в своей нише.


                    1. aik
                      10.01.2016 05:10

                      Ну может и не один раз в жизни, но это явно не ежедневная задача. Поставил, запустил, отладил, работает. Всё.
                      Если надо повторить или «отправить товарищу» — написал инструкцию, благо все шаги тут минут пять занимают, если не считать установку ОС и скачивание дистрибутива 1С.

                      Не вижу я тут места для докера. Тем более, что нет понимания, что вообще должно быть в предложенном контейнере…
                      В общем, я пока что очередной раз записал его в «девелоперские штучки» и убрал на дальнюю полку. Я старый солдат и не знаю… В смысле, я простой админ, а не разработчик. И пока что все слова на тему «а вот я познал докер и не понял как жил без него раньше» меня что-то не трогают. :)


  1. Tonna
    09.01.2016 13:57

    Про тещу (жену): Ругается — значит работает.


  1. k3NGuru
    10.01.2016 15:21

    Один вопрос, почему на ГикТаймс, а не на Хабре?


    1. aik
      10.01.2016 16:07

      Не знаю. А есть разница?
      Если разделили, значит хотят, чтобы на хабре было меньше контента.


      1. sashabeep
        13.01.2016 21:59

        Сложный технический узкоспециализированный контент — на хабр


        1. aik
          14.01.2016 06:59

          А на гиктаймс тогда что?
          Я вообще думал, что хабр решили оставить «для нормальных людей» — туда материалы, интересные потенциально всем. А на гиктаймс, наоброт, вынести специализированные вещи, которые интересны/полезны только гикам.


          1. sashabeep
            14.01.2016 11:54

            совершенно с точностью наоборот


            1. aik
              15.01.2016 17:28

              То есть хабр для гиков, гиктаймс — для простых людей, а мегамозг — для «mentally challenged» (или какой там сейчас принят термин).