Имеется windows-сервер c 1С 8.3 (БД — MSSQL).
Задача — настроить публикацию базы на линуксовом web-сервере.
Тонкости — модуль 1С для апача работает только с 2.0 и 2.2, а текущая версия в большинстве дистрибутивов — 2.4+
Пишется больше для себя, чтобы не забыть. Ну и мало ли, вдруг пригодится еще кому — не придется бегать по форумам в поисках нужных команд.
Железо — дал гигабайт оперативки, одно ядро и 20 гигабайт диска. Увеличить никогда не поздно.
ОС: Debian Stable, привык я к нему.
Ставлю минимум, включая ssh-сервер, но не включая web. К этому еще вернемся.
После установки базовая настройка по вкусу, я обычно ставлю локаль utf8, ставлю sudo, mc и vim, остальное по потребностям.
Дальше надо поставить apache 2.2. Причем сделать это правильным способом, а не просто скачав deb-пакет. :)
Сперва добавляем в /etc/apt/sources.list строчки со ссылкой на предыдущую версию дистрибутива.
Можно, конечно, написать oldstable — в настоящий момент тоже будет правильно. Но только в настоящий, потому рано или поздно выйдет новая стабильная версия и в oldstable и тогда вместо apache 2.2 там будет 2.4. Хотя, надеюсь, к тому времени 1С обновится и заработает с более новыми версиями апача. Но кто их знает? :)
Где mirror.yandex.ru — там пишется имя вашего любимого сервера с репозиторием.
Потом обновляем индексы — apt-get update — и смотрим, что у нас тут есть по apache командой apt-cache showpkg apache2
Там много всего выводится, но нас интересует только начало вывода:
Видим, что кроме 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, а остальные зависимости уже подтянутся автоматом.
После этого ставим апачей на холд, чтобы не обновить случайно.
Можно запустить service apache2 start и стукнуть телнетом на 80 порт для проверки, если лень браузер запускать.
telnet localhost 80
Ругается — значит работает.
Теперь ставим 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 со следующими параметрами (публикую нашу тестовую базу):
-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
И несколько новых строк в файле конфигурации веб-сервера:
Перезапускаем апач (service apache2 restart) и идём смотреть, что там опубликовалось.
Опубликовалось, просит пароль.
И впускает в базу.
Работает. Дополнительные настройки публикации делаются через редактирование vrd-файлов (к примеру, включение отладки), а допиливанием интерфейса веб-клиента должны заниматься ваши программисты 1С.
Если будете дописывать опции, к примеру, с подключением сервисов руками, то не забудьте удалить в файле default.vrd последний слэш в строчке «base="/testlitupp" ib="Srvr=10.0.0.4;Ref=testlitupp;"/>», я с этим долго возился. Если не удалить и что-то дописать после, то вылетает «ошибка 500» без дополнительной информации.
Какая будет нагрузка на вебсервер — я ещё не знаю, у нас это пока в тестовом режиме работает и хватает выделенных ресурсов. Но добавить памяти или ядер по мере увеличения потребностей проблем не составит.
В целом, в других дистрибутивах linux всё делается аналогично, различия только в способах установки старой версии apache.
Задача — настроить публикацию базы на линуксовом web-сервере.
Тонкости — модуль 1С для апача работает только с 2.0 и 2.2, а текущая версия в большинстве дистрибутивов — 2.4+
Пишется больше для себя, чтобы не забыть. Ну и мало ли, вдруг пригодится еще кому — не придется бегать по форумам в поисках нужных команд.
Железо — дал гигабайт оперативки, одно ядро и 20 гигабайт диска. Увеличить никогда не поздно.
ОС: Debian Stable, привык я к нему.
Ставлю минимум, включая ssh-сервер, но не включая web. К этому еще вернемся.
После установки базовая настройка по вкусу, я обычно ставлю локаль 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) и идём смотреть, что там опубликовалось.
Опубликовалось, просит пароль.
И впускает в базу.
Работает. Дополнительные настройки публикации делаются через редактирование vrd-файлов (к примеру, включение отладки), а допиливанием интерфейса веб-клиента должны заниматься ваши программисты 1С.
Если будете дописывать опции, к примеру, с подключением сервисов руками, то не забудьте удалить в файле default.vrd последний слэш в строчке «base="/testlitupp" ib="Srvr=10.0.0.4;Ref=testlitupp;"/>», я с этим долго возился. Если не удалить и что-то дописать после, то вылетает «ошибка 500» без дополнительной информации.
Какая будет нагрузка на вебсервер — я ещё не знаю, у нас это пока в тестовом режиме работает и хватает выделенных ресурсов. Но добавить памяти или ядер по мере увеличения потребностей проблем не составит.
В целом, в других дистрибутивах linux всё делается аналогично, различия только в способах установки старой версии apache.
Комментарии (19)
k3NGuru
10.01.2016 15:21Один вопрос, почему на ГикТаймс, а не на Хабре?
aik
10.01.2016 16:07Не знаю. А есть разница?
Если разделили, значит хотят, чтобы на хабре было меньше контента.sashabeep
13.01.2016 21:59Сложный технический узкоспециализированный контент — на хабр
aik
14.01.2016 06:59А на гиктаймс тогда что?
Я вообще думал, что хабр решили оставить «для нормальных людей» — туда материалы, интересные потенциально всем. А на гиктаймс, наоброт, вынести специализированные вещи, которые интересны/полезны только гикам.
alexhemp
Сделайте лучше docker-контейнер — это гораздо удобнее чем инструкция с картинками.
aik
Картинки просто чтобы текст разбавить, вся нужная информация текстом идёт.
А что такое «docker-контейнер» — я не особо в курсе, не возникало такой необходимости (ну, знаю, что это какой-то вариант виртуальной машины, но не более).
alexhemp
Просто то что вы делаете вручную — это прошлый век :)
Гораздо полезнее оформить это в виде Dockerfile.
Автоматизация процесса развертывания, гарантия повторяемости результата + изоляция приложения от хост-системы.
Докер — это не «вариант виртуализации», это способ «упаковать» приложение и затем автоматически его разворачивать на любом хосте, где установлен докер (а сейчас он работает на любом современном linux-дистрибутиве).
prabhu
Подскажите, где можно почитать доступно с примерами про docker?
alexhemp
Так тут на хабре было очень много уже материалов на эту тему.
Один раз попробовав докер от него уже не отказаться.
Я, к примеру, даже сервер приложений 1С 8.2 и PostgreSQL с патчами 1С разворачиваю docker-контейнерами. Это очень удобно, потому что элементарно повторяемая установка — не нужно все делать вручную, один раз сделал Dockerfile, изоляция приложения — например Postgres-1С требует специфические версии библиотек.
А уже всякие специфические web-приложения, что требуют специфического окружения для запуска — тут докер просто спасение.
Представьте себе что вам нужно N разных версий Web-приложения 1С развернуть, например один боевой вариант и пару новых версий. Или например они выпустят модуль для Apache 2.4? Вам для теста придется разворачивать несколько машин, даже виртуальных.
С докером вы все это сделаете легко и непринужденно. и потом при миграции — опустите один контейнер, запустите другой.
aik
Только для начала надо понять, что это такое. Я читал несколько статей, но так и не понял, как этот докер использовать и где оно мне может пригодиться.
К примеру, как эти контейнеры с сетью общаются? На каждый контейнер виртуальная сетевая карта создаётся? Или надо их по разным портам растаскивать?
alexhemp
Обычно используется NAT.
При запуске контейнера указывается какой порт контейнера на какой порт хоста нужно замапить.
Докер — это возможность «упаковать» приложение со всеми потребными библиотеками и обращаться с ним примерно как с единым исполнимым файлом. При том что внутри там может быть много чего.
Это сложно объяснить в двух словах, это другой уровень абстракции. Вместо того чтобы каждый раз париться с установкой чего-то — достаточно сделать правильную «инструкцию» в виде Dockerfile. Далее это приложение может быть собрано в виде контейнера автоматически, отправлено в репозиторий, скачано на другие машины (хоть на миллион), запущено и остановлено как единое целое.
Сам контейнер обеспечивает уровень изоляции наподобии виртуальной машины, но из-за отсутствия слоя виртуализации — падения производительности нет.
aik
Ну ладно, допустим. Как это применимо к моему случаю? Надо опубликовать базу в вебе.
Мой вариант:
запустил виртуальную машину (само собой, никто её с нуля не ставил, просто достал образ с полки),
поставил нужный апач,
1С,
опубликовал базу.
Если надо опубликовать еще одну или ту же с другими настройками — редактируется vrd-файл и вставляется еще десяток строчек в конфиг апача. В корне вебсервера лежит скрипт, который показывает список опубликованных баз. Чтобы юзерам не приходилось рассылать ссылки.
Вариант с докером:
запустил виртуальную машину,
настроил там докер (у меня нет образа с настроенным докером),
поставил нужный апач,
1С,
опубликовал базу.
засунул в контейнер — а что именно засунул? По идее, у меня там должны быть апач и 1С. Ну если изолировать службу и зависимости. Ну или точнее, апач с подключенным модулем, файл default.vrd и строчка в конфиге.
Надо опубликовать еще одну базу или базу с другими настройками. Что делаю? Лезу в контейнер и меняю конфиги? Или делаю копию контейнера, лезу в копию и меняю конфиги?
alexhemp
Вариант с докером более «индустриальный»
На локальной машине — поставил какой-нить убунту, в нее докер.
Написал Dockerfile, в нем явно описываются папки с данными например.
Далее на этой-же машине — собрал образ контейнера.
Написал команду docker-run (или использовал docker-compose например)
Что в результате — полностью повторяемое окружение. Можешь послать другу Dockerfile по почте. Или развернуть на реальном железе — все будет ровно так-же.
Хочется второй контейнер — просто запускаешь, передаешь скажем другие папки.
Вариантов масса, они выглядят сложными, но это только кажется.
В реальности выходит полностью само-документированная конфигурация и легко запускаемые контейнеры с приложением.
Я тоже долго думал-думал, а теперь даже не представляю зачем бы мне хотелось все это руками делать каждый раз.
aik
Всё равно ничего не понял. Теперь еще папки с данными появились.
Так что в контейнере-то лежит? Апач с модулем 1С? Просто апач? Конфиги и модуль 1С я отдельно снаружи держу?
Может и кажется, но я пока не вижу никакого упрощения в сравнении с реальной машиной. Только лишние слои абстракции.
citius
Если вам надо 1 раз в жизни развернуть виртуалку под конкретную задачу и забыть про нее надолго, то докер конечно не нужен.
Современная манера пихать его везде где ни попадя есть зло.
Но вот если у вас задача не разовая, и инфраструктура требует стандартизации и повторяемости, то изучить стоит, контейнеры очень удобны в своей нише.
aik
Ну может и не один раз в жизни, но это явно не ежедневная задача. Поставил, запустил, отладил, работает. Всё.
Если надо повторить или «отправить товарищу» — написал инструкцию, благо все шаги тут минут пять занимают, если не считать установку ОС и скачивание дистрибутива 1С.
Не вижу я тут места для докера. Тем более, что нет понимания, что вообще должно быть в предложенном контейнере…
В общем, я пока что очередной раз записал его в «девелоперские штучки» и убрал на дальнюю полку.
Я старый солдат и не знаю…В смысле, я простой админ, а не разработчик. И пока что все слова на тему «а вот я познал докер и не понял как жил без него раньше» меня что-то не трогают. :)