Заметки сисадмина
Назад

Поднимаем сервер 1C 8.x на Linux (Centos + PostgreSQL)

Опубликовано: 29.05.2012
Время на чтение: 83 мин
6
1788

В последнее время связка 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

VACUUM

Дефрагментация БД

GRANT

Назначение привилегий

REVOKE

Отмена привилегий

3. Установка 1С Предприятие 8

Качаем технологическую платформу 1С8.2 для Linux (Redhut/Centos 6.x) с сайта .

Установку пакетов желательно производить в следующем порядке. Если устанавливать всё сразу по маске, могут возникнуть ошибки.

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С Предприятия

Создаем новую базу, либо прямо с помощью консоли управления, либо в самом клиенте 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/CentOS/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
, ,
Поделиться
Похожие записи