В последнее время связка Linux + 1C, становится, все более и более популярной среди любителей сэкономить на ПО. Действительно с выходом 1С8 в данном сегменте, многое изменилось. Появились полноценные версии восьмерки под популярные дистрибутивы линукс, Etersoft выпустила профиксинные Wine и PostgreSQL, появились положительные отзывы в интернете о внедрении данных решений в российских компаниях, что говорит о том, что бесплатное ПО, может быть вполне конкурентно способным по сравнению с аналогичными коммерческими решениями.
Что касается меня как простого админа, человека подневольного и не обремененного финансовой частью вопроса, интересно посмотреть, на сколько данное решение в действительности является производительным или напротив уступает аналогичным на базе того же MS, удобно ли в администрировании, хотя тут наверно больше вопрос предпочтений и привычки (linux vs win) и т д. Многие скажут, что если есть деньги на MS, то лучше не заморачиваться и ставить все под виндой, и наверно будут правы, все-таки изначально 1С была всегда заточена под win, в силу низкой распространенности open-source операционок, среди обычных пользователей. И здесь наверняка стоит ожидать более высокой производительности и стабильности в работе, что как, в последствии, покажут тесты, так и будет, но пока не будем забегать вперед и на практике посмотрим, насколько сервер на базе Linux применительно к 1С отстает от традиционного виндового и так или это на самом деле.
В качестве конечной оценки производительности того или иного сервера будем использовать уже известный тест от Вечеслава Гилева. Все манипуляции будем производить при помощи виртуальной машины Oracle VirtualBox. На клиентском компьютере будет запускаться последняя актуальная на момент выхода статьи версия 1с 8.2, где будет запускаться тест.
В данной обзоре будем настраивать связку Centos 6.2 x64 Minimal + Postgre@Etersoft9 + 1C 8.2 различных релизов. Итак начнем.
1) Подготовка сервера
Настройка сети:
vi /etc/sysconfig/network |
NETWORKING= yes HOSTNAME=1cserv |
Настройка eth0 Iface. Раскоментируем строчку BOOTPROTO=dhcp и закоментируем IPADDR, NETMASK, NETWORK, BROADCAST, GATEWAY, если хотим получать адрес от DHCP-сервера.
vi /etc/sysconfig/network-scripts/ifcfg-eth0 |
DEVICE=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:
vi /etc/resolv .conf |
nameserver 192.168.1.3 nameserver 192.168.1.5 |
vi /etc/hosts |
127.0.0.1 localhost localhost.localdomain 192.168.1.8 1cserv 1cserv.localdomain |
service network restart |
Обновить CentOS включая все приложения:
yum update |
Дополнительные утилиты которые могут понадобятся в работе:
yum install mc crontabs tmpwatch sudo wget file |
Добавляем репозитарии:
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 |
Добавляем сервер в автозагрузку и запускаем его:
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: 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.
wget http: //pgfoundry .org /frs/download .php /2449/pgtune-0 .9.3. tar .gz |
tar xvfz *. tar .gz |
Переходим в каталог с pgtune, выполняем команду:
. /pgtune −i $PGDATA /postgresql .conf −o $PGDATA /postgresql .conf.pgtune |
где, -i — путь до входного, текущего файла настроек postgresql.conf,
-o — путь до выходного, нового файла настроек postgresql.conf.
В результате выполнения команды получим идентичный исходному файл настроек, за исключением нескольких новых 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 http: //download .etersoft.ru /pub/Etersoft/HASP/stable/x86_64/CentOS/6/haspd-3 .3-eter2scientific.x86_64.rpm |
rpm -ihv http: //download .etersoft.ru /pub/Etersoft/HASP/stable/x86_64/CentOS/6/haspd-modules-3 .3-eter2scientific.x86_64.rpm |
Вставляем ключ, перегружаем сервер. Работоспособность ключей проверяем командой:
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 |
Источник http://sanotes.ru/podnimaem-server-1c-linux-centos-postgresql/