Поднимаем сервер 1C 8.x на Linux (Centos + PostgreSQL)
В последнее время связка Linux + 1C, становится, все более и более популярной среди любителей сэкономить на ПО. Действительно с выходом 1С8 в данном сегменте, многое изменилось. Появились полноценные версии восьмерки под популярные дистрибутивы линукс, Etersoft выпустила профиксинные Wine и PostgreSQL, появились положительные отзывы в интернете о внедрении данных решений в российских компаниях, что говорит о том, что бесплатное ПО, может быть вполне конкурентно способным по сравнению с аналогичными коммерческими решениями.
В рамках данной статьи посмотрим на сколько связка 1С + Linux имеет место быть, в частности Centos 6.2 x64 Minimal + Postgre@Etersoft9 + 1C 8.2., дабы сравнить, есть ли отличия от win. Померим производительность при помощи теста Вечеслава Гилева. Все манипуляции будем производить при помощи виртуальной машины Oracle VirtualBox. На клиентском компьютере будет запускаться последняя актуальная на момент выхода статьи версия 1с 8.2, где и будет запускаться тест.
1) Подготовка сервера
Включим сеть, пропишем имя хоста правкой конфига /etc/sysconfig/network
NETWORKING=yes HOSTNAME=1cserv
Раскоментируем строчку BOOTPROTO=dhcp и закоментируем IPADDR, NETMASK, NETWORK, BROADCAST, GATEWAY, если хотим получать адрес от DHCP-сервера в конфиге /etc/sysconfig/network-scripts/ifcfg-eth0
;BOOTPROTO=dhcp IPADDR=192.168.1.8 NETMASK=255.255.255.0 NETWORK=192.168.1.0 BROADCAST=192.168.1.255 GATEWAY=192.168.1.1 HWADDR=00:0C:29:43:5B:3D ONBOOT=yes
Пропишем DNS-серверы в /etc/resolv.conf
nameserver 192.168.1.3 nameserver 192.168.1.5
Перезапустим сеть.
service network restart
Установим дополнительные пакеты, которые могут понадобятся в работе:
yum update yum install mc crontabs tmpwatch sudo wget
Добавляем репозитарии:
rpm -ihv http://dl.atrpms.net/el6-x86_64/atrpms/stable/atrpms-repo-6-5.el6.x86_64.rpm rpm -ihv ftp://ftp.pbone.net/mirror/download.fedora.redhat.com/pub/fedora/epel/beta/6/x86_64/epel-release-6-5.noarch.rpm
Добавим пакеты необходимые для правильной работы 1С:
yum install xorg-x11-xfs chkfontpath ttf2pt1 unixODBC yum install gtk2 yum install ImageMagick
Ставим TrueType Шрифты msttcorefonts.
rpm -ihv http://elders.princeton.edu/data/puias/unsupported/5/i386/msttcorefonts-2.0-1.noarch.rpm
Либо вручную создаем репозитарий и ставим через yum. :)
vi /etc/yum.repos.d/puias-unsupported.repo
[puias-unsupported] name=PUIAS Unsupported baseurl=http://elders.princeton.edu/data/puias/unsupported/5/i386/ enabled=1 gpgcheck=0
yum install msttcorefonts reboot
2. Установка сервера баз данных PostgreSQL
Качаем PostgreSQL от Etersoft, отсюда.
Нам понадобятся:
libpq5.2-9.0eter-9.0.4-eter8rhel.x86_64.rpm postgre-etersoft9.0-9.0.4-eter8rhel.x86_64.rpm postgre-etersoft9.0-contrib-9.0.4-eter8rhel.x86_64.rpm postgre-etersoft9.0-server-9.0.4-eter8rhel.x86_64.rpm
Устанавливаем:
yum localinstall --nogpgcheck *.rpm
Инициализируем базу PostgreSQL:
su postgres initdb -D /var/lib/pgsql/data --locale=ru_RU.UTF-8 exit
Добавляем postgresql в автозагрузку и запускаем его:
chkconfig postgresql on service postgresql start
Задаем пароль локальному пользователю postgres:
passwd postgres
Даем юзеру postgres писать в /var/lib/pgsql иначе ругнется что нет файла .history_pqsql
chown postgres:postgres /var/lib/pgsql
Задаем пароль внутреннему пользователю PostgreSQL, предварительно авторизировавшись под пользователем postgres: su postgres
psql postgres alter user postgres with password 'YOUR_PASSWORD';
Файл /var/lib/pgsql/data/pg_hba.conf приводим к виду:
#IPv4 local connections:F host all postgres 0.0.0.0/0 md5
В конфиге /var/lib/pgsql/data/postgresql.conf первое что я сразу меняю это параметр effective_cache_size , который рекомендуют выставлять не менее половины от объема всей оперативной памяти сервера, а точнее размер кэша можно посмотреть в самой системе, набрав в командной строке free. Необходимое значение будет в столбце cached (в kB).
Усредненная настройка наиболее важных параметров:
shared_buffers = 1/8 RAM или больше (но не более 1/4) work_mem = в 1/20 RAM maintenance_work_mem = в 1/4 RAM max_fsm_relations = в планируемое кол-во таблиц в базах * 1.5 max_fsm_pages в max_fsm_relations * 2000; fsync = true wal_sync_method = fdatasync commit_delay = от 10 до 100 commit_siblings = от 5 до 10 effective_cache_size = 0.9 от значения cached, которое показывает free random_page_cost = 2 для быстрых cpu, 4 для медленных cpu_tuple_cost = 0.001 для быстрых cpu, 0.01 для медленных cpu_index_tuple_cost = 0.0005 для быстрых cpu, 0.005 для медленных.
Для оптимизации настроек рассчитанных на максимальную производительность, можно попробовать воспользоваться веб конфигуратором pgtune.
В результате выполнения команды получим идентичный исходному файл настроек, за исключением нескольких новых pg_tune-параметров в самом конце файла.
$PGDATA- переменная указывающая на /var/lib/pgsql/data. Если не задана, указать можно в /etc/environment.
Более полную информацию по настройке postgresql.conf смотрим у Etersoft или применительно к 1С на сайте Вечеслава Гилева. Для тех, кто хочет углубится более подробно в процесс изучения PostgreSQL существует замечательный, подробный мануал от Алексея Васильева. :)
Наиболее часто используемые команды Postgresql:
Изменить root-пароль:
ALTER USER postgres WITH PASSWORD ‘newpassword’;
Shell-команда |
Интерактивный режим psql |
Описание |
createdb name |
CREATE DATABASE name; |
Создание новой базы данных |
ALTER DATABASE name; |
Изменение параметров БД |
|
dropdb |
DROP DATABASE name; |
Удаление базы данных |
createuser |
CREATE USER name [ [ WITH ] option [ ... ] ] |
Создание нового пользователя |
ALTER USER name [ [ WITH ] option [ ... ] ] |
Изменение параметров пользователя |
|
dropuser |
DROP USER [ IF EXISTS ] name [, ...] |
Удаление пользователя |
vacuumdb |
Дефрагментация БД |
|
Назначение привилегий |
||
Отмена привилегий |
3. Установка 1С Предприятие 8
Качаем технологическую платформу 1С8.2 для Linux (Redhut/Centos 6.x) с сайта 1С.
Установку пакетов желательно производить в следующем порядке. Если устанавливать всё сразу по маске, могут возникнуть ошибки.
1) 1C_Enterprise82-common-8.2.15-319.x86_64.rpm // общие компоненты сервера
2) 1C_Enterprise82-common-nls-8.2.15-319.x86_64.rpm // национальные ресурсы для общих компонент
3) 1C_Enterprise82-server-8.2.15-319.x86_64.rpm // сервер 1С:предприятие 8.2 для Linux
4) 1C_Enterprise82-server-nls-8.2.15-319.x86_64.rpm // Национальные ресурсы для сервера 1С
5) 1C_Enterprise82-ws-8.2.15-319.x86_64.rpm // Компоненты веб-сервисов 1с8.2
6) 1C_Enterprise82-ws-nls-8.2.15-319.x86_64.rpm // Национальные ресурсы для компонент веб-сервисов 1с8.2
или так:
1) 1C_Enterprise82-common-8.2.15-319.x86_64.rpm // общие компоненты сервера
2) 1C_Enterprise82-server-8.2.15-319.x86_64.rpm // сервер 1С:предприятие 8.2 для Linux
3) 1C_Enterprise82-ws-8.2.15-319.x86_64.rpm // Компоненты веб-сервисов 1с8.2
4) 1C_Enterprise82-common-nls-8.2.15-319.x86_64.rpm // национальные ресурсы для общих компонент
5) 1C_Enterprise82-server-nls-8.2.15-319.x86_64.rpm // Национальные ресурсы для сервера 1С
6) 1C_Enterprise82-ws-nls-8.2.15-319.x86_64.rpm // Национальные ресурсы для компонент веб-сервисов 1с8.2
Проверить, все ли пакеты установлены можно с помощью команды:
yum list '1c*'
Далее устанавливаем glibc x86:
yum install glibc.i686
Делаем символьную ссылку, для нормальной отработки скрипта конфига сервера 1С:
ln -s /lib64/libglib-2.0.so.0.2200.5 /usr/lib64/libglib-2.0.so
Запускаем:
/opt/1C/v8.2/x86_64/utils/*config_server
Данный скрипт проверит наличие всех необходимых библиотек для работы сервера, зарегистрирует установленные TrueType шрифты в ImageMagick. В случае отсутствия шрифтов, скрипт потребует явно указать каталог, в котором находятся ttf-файлы. В случае успеха, в каталоге /opt/1C/v8.2/x86_64/conf/grcmncfg должен появится файл type.xml.
Проверяем корректность старта службы:
service srv1cv82 status
Должно высветится:
init script: STARTED Ragent: RUNNING
В случае проблем, необходимо убедится, что на каталог /opt/1C и /home/usr1cv82 выставлены права на запуск от пользователя usr1cv82 входящего в группу grp1cv82. Если нет, то выполняем:
chown usr1cv82:grp1cv82 /opt/1C chown usr1cv82:grp1cv82 /home/usr1cv82
Перезапуск:
service srv1cv82 restart
На файрволе для работы сервера 1С должны быть открыты следующие порты:
tcp:1540 - агент сервера (ragent)
tcp:1541 - главный менеджер кластера (rmngr)
tcp:1560-1591 - диапазон сетевых портов для динамического распределения рабочих процессов. (достаточно открыть tcp:1560)
-A INPUT -p tcp -m state --state NEW -m tcp --dport 1540 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 1541 -j ACCEPT -A INPUT -p tcp -m multiport --dports 1560:1591 -j ACCEPT
Проверка работоспособности рабочих процессов сервера:
netstat -tlnp | grep :15
Должны получить примерно такую картинку:
tcp 0 0 0.0.0.0:1560 0.0.0.0:* LISTEN 2814/rphost tcp 0 0 0.0.0.0:1540 0.0.0.0:* LISTEN 2799/ragent tcp 0 0 0.0.0.0:1541 0.0.0.0:* LISTEN 2802/rmngr
Так как клиент 1С цепляются к серверу по имени, то нам необходимо, разрешить на сервере возможность опознавать и пинговать его по имени машины. В этом нам поможет samba.
yum install samba samba-client
Запускаем и добавляем в автозагрузку:
yum install nmb start chkconfig nmb on
На файрволе должен быть открыт UDP:137 порт.
-A INPUT -p udp -m state --state NEW -m udp --dport 137 -j ACCEPT
После чего, должен отрабатывать пинг по имени компа/сервера.
Проверка работоспособности:
На клиенте, если Windows, заходим в консоль управления 1CV8 Servers (Администрирование серверов 1С Предприятия).
Жмем, добавить Центральный сервер 1С:Преприятия 8.2, добавляем по имени. Во вкладке рабочие серверы должна появится запись.
Создаем новую базу, либо прямо с помощью консоли управления, либо в самом клиенте 1С выбираем опцию: Добавить новую информационную базу.
По поводу HASP-ключей, если до 12 пользователей то нужен только сетевой ключ с маркировкой типа NETXX ORGL8, где XX - количество клиентских лицензий. Если более 12 пользователей, но необходим так же локальный ключ для сервера. Фиолетовый ключ HASP HL с маркировкой типа ENSR8 для 32x-битного сервера или зеленый ключ HASP HL Max с маркировкой ENS8SA для 64-битного. Ключ HASP HL Max поддерживает так же 32-битный сервер. Для нормальной работы HASP-ключей необходимо установить два пакета включающих драйвер ключа aksusbd и менеджер лицензий hasplm. Имеет смысл ставить модифицированные варианты драйверов от Entersoft.
rpm -ihv https://download.etersoft.ru/pub/Etersoft/HASP/stable/Scientific/6/
Вставляем ключ, перегружаем сервер. Работоспособность ключей проверяем командой:
service haspd status
Должны быть запущенны: aksusbd, winehasp, hasplm, hasplmd.
4. Публикация на веб-сервере
Ставим Apache.
yum install httpd
Редактируем /etc/httpd/conf/httpd.conf где задаем значение директиве ServerName.
Servername 1cserv
В противном случае при запуске apach'a получим сообщение:
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName.
В корневом каталоге сайта, создаем директорию base, где base - имя базы к которой мы будем предоставлять доступ.
mkdir /var/www/html/base
Теперь нам необходимо, запустить специальный скрипт для публикации базы на веб-сервере:
Переходим в /opt/1C/v8.2/x86_64/ Запускаем скрипт со следующими параметрами:
./webinst -apache22 -wsdir base -dir '/var/www/html/base' -connStr 'Srvr="1cserv";Ref="base";' -confPath /etc/httpd/conf/httpd.conf
Проверяем корректность внесенных изменений. В конфиге Apache должны быть следующие строки:
LoadModule _1cws_module "/opt/1C/v8.2/i386/wsap22.so" # 1c publication Alias "base" "/var/www/html/base/" Directory "/var/www/html/base/" AllowOverride None Options None Order allow,deny Allow from all SetHandler 1c-application ManagedApplicationDescriptor "/var/www/html/base/default.vrd"
В /var/www/base/ так же должен появится файл default.vrd две последние строчки которого должны выглядеть примерно так:
base="/base" ib="Srvr="1cserv";Ref="base";
Выдаем права на директорию:
chown -R apache:apache /var/www/html/base
Перезапускаем Apache:
service httpd restart
И получаем ошибку:
"Starting httpd: httpd: Syntax error on line 200 of /etc/httpd/conf/httpd.conf: Cannot load /opt/1C/v8.2/x86_64/wsap22.so into server: /opt/1C/v8.2/x86_64/wsap22.so: failed to map segment from shared object: Permission denied"
Данная проблема решается, отключением SElinux, а в идеале отключением какой-то определенной политики, список которых можно получить с помощью команды:
getsebool -a
Мне так и не удалось идентифицировать, какая политика разрешает грузить библиотеку из апача посредством другой библиотеки из 1С :) Но, поскольку сервер предназначен исключительно для работы в локалке, то возможно полное отключение Selinux не так уж и критично.
Для временного отключения SElinux воспользуемся командой:
setenforce 0
Для полного и постоянного отключения Selinux правим файлик /etc/selinux/config, где параметру SELINUX задаем disabled, но лучше все таки поставить permissive. Так же полностью отключить SElinux, можно в загрузчике Grub. Правим /boot/grub/grub.conf в конце строки вида: kernel /boot/vmlinuz-2.6.18-92.el5PAE ro root=LABEL=/ rhgb quiet selinux=0 вытавить selinux=0. (либо enforcing=0)
Итак, заходим браузером на сайт публикации, предварительно отключив всплывающие окна. http://1cserv/base
И получаем следующее сообщение:
Оно, и понятно, без специального сетевого ключа, работать не будет :)
5. Резервное копирование и восстановление:
Даем права пользователю postgres на тут папку куда будем выгружать backup.
chown postgres:postgres /mnt/net
В /mnt/net у меня смонтирована виндовая шара, с помощью команды:
mount -t cifs //192.168.1.9/G /mnt/net -o iocharset=utf8,codepage=cp866,uid=500,gid=500,rw,user=test%11111111
Отмонтировать, принудительно закрыв все подключения, если нужно:
umount -l /mnt/net
Резервное копирование (Backup):
pg_dump -U postgres -Fc -Z9 dbname -f /mnt/net/Backup/Base/dbname.dump
где:
-U (пользователь)
-F (формат извлекаемого файла) с (custom - внутренний формат сжатия pg_dump, возможны так же варианты tar и plain text)
-Z (установить режим сжатия) 0 - 9 (0 - без сжатия, 9 - максимальный режим)
-f (извлекать в этот файл)
Если выгружаем на виндовую шару, необходимо в виндах выставить права, Users (Полный доступ)
Востановление (только из под пользователя postgres):
В новую базу:
createdb -T template0 newdb
где, template0 - шаблон означающий, что это абсолютна пустая база
pg_restore -d newdb db.dump
Например:
createdb -T template0 mynewbase pg_restore -d mynewbase /mnt/net/my_old_base.dump
С удалением базы и восстановлением ее из дампа:
pg_dump -Fc -Z9 dbname -f dbname.dump dropdb dbname pg_restore -C -d anydbname dbanme.dump
где, С - создать базу
Например:
pg_dump -Fc -Z9 mybase -f /mnt/net/mybase.dump dropdb mybase pg_restore -C -d postgres /mnt/net/mybase.dump
Здесь -d postgres указание на любую базу данных существующую в кластере база данных. pg_restore использует ее только чтобы выполнить команду CREATE DATABASE для mydb (mybase)
Скрипт автобэкапа:
В .gz
#!/bin/sh BKPDIR="/mnt/net" DATEYMD=`date "+%Y-%m-%d-%a"` // а - указывает на день недели в формате Пн, Вт, Ср...пишет по русски? mkdir -p ${BKPDIR}/PostgreSQL 2>/dev/null // - можно не указывать, если предварительно создать директорию и выставить права. pg_dump mydb <"${BKPDIR}/PostgreSQL/${DATEYMD}-mydb-PostgreSQL.gz" EOF
В .dump
#!/bin/sh BKPDIR="/mnt/net/PostgreSQL" DATEYMD=`date "+%Y-%m-%d"` pg_dump -Fc -Z9 mydb -f "${BKPDIR}/${DATEYMD}-mydb-PostgreSQL.dump"
Запись в crontab (из под пользователя postgres):
su postgres
crontab -e //добавить задание
crontab -l //просмотр заданий
crontab -r //удалить задание
# запустить в 18:50 минут
50 18 * * * sh /home/scripts/backup.sh
# запускать каждые 15 минут
*/15 * * * * sh /home/scripts/backup.sh