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

6
19

В последнее время связка Linux + 1C,  становится, все более и более популярной среди любителей сэкономить на ПО. Действительно с выходом 1С8 в данном сегменте, многое изменилось. Появились полноценные версии восьмерки под популярные дистрибутивы линукс, Etersoft выпустила профиксинные Wine и PostgreSQL, появились положительные отзывы в интернете о внедрении данных решений в российских компаниях, что говорит о том, что бесплатное ПО, может быть вполне конкурентно способным по сравнению с аналогичными коммерческими решениями.

Что касается меня как простого админа, человека подневольного и не обремененного финансовой частью вопроса, интересно посмотреть, на сколько данное решение в действительности  является производительным или напротив уступает аналогичным на базе того же MS, удобно ли в администрировании, хотя тут наверно больше вопрос предпочтений и привычки (linux vs win) и т д. Многие скажут, что если есть деньги на MS, то лучше не заморачиваться и ставить все под виндой, и наверно будут правы, все-таки изначально 1С была всегда заточена под win, в силу низкой распространенности open-source операционок, среди обычных пользователей. И здесь наверняка стоит ожидать более высокой производительности и стабильности в работе, что как, в  последствии, покажут  тесты, так и будет, но пока не будем забегать вперед и  на практике  посмотрим, насколько сервер на базе Linux применительно к 1С уступает в плане производительности решениям на базе Windows и так ли это на самом деле.

В качестве конечной оценки производительности того или иного сервера будем использовать уже известный  тест от Вечеслава Гилева. Все манипуляции будем производить при помощи виртуальной машины Oracle VirtualBox. На клиентском компьютере будет запускаться последняя актуальная на момент выхода статьи версия 1с 8.2, где будет запускаться тест.

В данной обзоре будем настраивать связку Centos 6.2 x64 Minimal + Postgre@Etersoft9 + 1C 8.2 различных релизов. Итак начнем.

1) Подготовка сервера

Настройка сети:

NETWORKING=yes
HOSTNAME=1cserv

Настройка eth0 Iface. Раскоментируем строчку BOOTPROTO=dhcp и закоментируем IPADDR, NETMASK, NETWORK, BROADCAST, GATEWAY, если хотим получать адрес от DHCP-сервера.

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:

nameserver 192.168.1.3
nameserver 192.168.1.5
127.0.0.1 localhost localhost.localdomain
192.168.1.8 1cserv 1cserv.localdomain

Обновить CentOS включая все приложения:

Дополнительные утилиты которые могут понадобятся в работе:

Добавляем репозитарии:

Ставим библиотеки необходимые для правильной работы 1С:

Ставим  TrueType Шрифты msttcorefonts.

Либо вручную создаем репозитарий и ставим через yum. :)

[puias-unsupported]
name=PUIAS Unsupported
baseurl=http://elders.princeton.edu/data/puias/unsupported/5/i386/
enabled=1
gpgcheck=0

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

Устанавливаем:

Инициализируем базу PostgreSQL:

Добавляем сервер в автозагрузку и запускаем его:

Задаем пароль локальному пользователю postgres:

Даем юзеру postgres писать в /var/lib/pgsql иначе ругнется что нет файла .history_pqsql

Задаем пароль внутреннему пользователю PostgreSQL, предварительно авторизировавшись под пользователем postgres:

Файл  /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.

Переходим в каталог с pgtune, выполняем команду:

где,

-i — путь до входного, текущего файла настроек postgresql.conf,

-o — путь до выходного, нового файла настроек postgresql.conf.

В результате выполнения команды получим идентичный исходному файл настроек, за исключением нескольких новых pg_tune-параметров в самом конце файла.

$PGDATA- переменная указывающая на /var/lib/pgsql/data. Если не задана, указать можно в /etc/environment.

Более полную информацию по настройке postgresql.conf смотрим у Etersoft или применительно к 1С на сайте Вечеслава Гилева. Для тех, кто хочет углубится более подробно в процесс изучения PostgreSQL существует замечательный, подробный мануал от Алексея Васильева. :)

Наиболее часто используемые команды Postgresql:

Изменить root-пароль:

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

Проверить, все ли пакеты установлены можно с помощью команды:

Далее устанавливаем glibc x86:

Делаем символьную ссылку, для нормальной отработки скрипта конфига сервера 1С:

Запускаем:

Данный скрипт проверит наличие всех необходимых библиотек для работы сервера, зарегистрирует установленные TrueType шрифты в ImageMagick. В случае отсутствия шрифтов, скрипт потребует явно указать каталог, в котором находятся ttf-файлы. В случае успеха, в каталоге /opt/1C/v8.2/x86_64/conf/grcmncfg должен появится файл type.xml. 

Проверяем корректность старта службы:

Должно высветится:

В случае проблем, необходимо убедится, что на каталог /opt/1C и /home/usr1cv82 выставлены права на запуск от пользователя usr1cv82 входящего в группу grp1cv82. Если нет, то выполняем:

Перезапуск:

На файрволе для работы сервера 1С должны быть открыты следующие порты:

tcp:1540 — агент сервера (ragent)
tcp:1541 — главный менеджер кластера (rmngr)
tcp:1560-1591 — диапазон сетевых портов для динамического распределения рабочих процессов. (достаточно открыть tcp:1560)

Проверка работоспособности рабочих процессов сервера:

Должны получить примерно такую картинку:

Так как клиент 1С цепляются к серверу по имени, то нам необходимо, разрешить на сервере возможность опознавать и пинговать его по имени машины. В этом нам поможет samba.

Запускаем и добавляем в автозагрузку:

На файрволе должен быть открыт UDP:137 порт.

После чего, должен отрабатывать пинг по имени компа/сервера.

Проверка работоспособности:

На клиенте, если 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.

Вставляем ключ, перегружаем сервер. Работоспособность ключей проверяем командой:

Должны быть запущенны: aksusbd, winehasp, hasplm, hasplmd.

4. Публикация на веб-сервере

Ставим Apache.

Редактируем /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 — имя базы к которой мы будем предоставлять доступ.

Теперь нам необходимо, запустить специальный скрипт для публикации базы на веб-сервере:

Переходим в /opt/1C/v8.2/x86_64/ Запускаем скрипт со следующими параметрами:

Проверяем корректность внесенных изменений. В конфиге 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";

Выдаем права на директорию:

Перезапускаем Apache:

И получаем ошибку:

Данная проблема решается, отключением SElinux, а в идеале отключением какой-то определенной политики, список которых можно получить с помощью команды:

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

Для временного отключения SElinux воспользуемся командой:

Для полного и постоянного отключения 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.

В /mnt/net у меня смонтирована виндовая шара, с помощью команды:

iocharset=utf8,codepage=cp866,uid=500,gid=500,rw,user=test%11111111
Отмонтировать, принудительно закрыв все подключения, если нужно:

Резервное копирование (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):

В новую базу:

где, template0 — шаблон означающий, что это абсолютна пустая база

Например:

pg_restore -d mynewbase /mnt/net/my_old_base.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):

crontab -e //добавить задание
crontab -l //просмотр заданий
crontab -r //удалить задание

# запустить в 18:50 минут

50 18 * * * sh /home/scripts/backup.sh

# запускать каждые 15 минут

*/15 * * * * sh /home/scripts/backup.sh