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

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

Опубликовано: 28.06.2012
Время на чтение: 37 мин
17
307

Ранее, я уже делал обзор посвящённый установке 1С8 на CentoOS, теперь пришла очередь не менее популярной линукс-оси Ubuntu. На момент написания статьи, стабильной версией убунты является 12.04, ее и будем использовать.

Итак, в данной заметке будем настраивать связку Ubuntu Server x64 + Postgre@Etersoft9 + 1C 8.2.15.301. Не будем вдаваться в подробности установки операционной системы, там все предельно понятно, за исключением разве, что возможных граблей с некорректным отображением русских символов в командных диалогах (если во время установки был выбран русский язык). Но решение имеется. Так же во время установки, надо не забыть отметить чекбокс напротив устанавливать ssh-сервер (если нужен) и samba-server (нужен 1С-у) :)

1) Подготовка: 

Настроем сеть, будем использовать статическую адресацию:

[shell]sudo vi /etc/network/interfaces[/shell]

auto eth0
iface eth0 inet static
address 192.168.1.8
netmask 255.255.255.0
broadcast 192.168.1.255
gateway 192.168.1.1
dns-nameservers 192.168.1.4 192.168.1.6

где, auto eth0 - говорит системе, что интерфейс eth0 необходимо включать автоматически при загрузке системы с нижеуказанными параметрами.

iface eth0 inet static - указывает на то, что eth0 использует статический интерфейс. Если используется DHCP-сервер, то пишем  вместо  static - dhcp.

С 12.04 за конфигурацию DNS отвечает программа resolvconf (вместо файла /etc/resolv.conf) поэтому, если не используется DHCP-сервер, DNS-сервера для статических интерфейсов необходимо вносить в /etc/network/interfaces используя параметры  dns-nameservers, dns-search и dns-domain, соответствующие параметрам nameserver, search и domain в resolv.conf.

Рестарт службы:
[shell]sudo /etc/init.d/networking restart[/shell]

Обновляемся:
[shell]sudo apt-get update[/shell]

[shell]sudo apt-get dist-upgrade[/shell]

Ставим Midnight Commander (mc)
[shell]sudo apt-get install mc[/shell]

2. Установка и настройка сервера баз данных PostgreSQL

Для удобства, что бы не набирать каждый раз sudo перейдем в режим рута:
[shell]sudo -i[/shell]
Ставим пакеты необходимые для правильной работы PostgreSQL:
[shell]apt-get install  libicu-dev libxslt1.1 libxml2 libossp-uuid16 libreadline5[/shell]

Качаем последнию стабильную версию PostgreSQL отсюда.

Ставим пакеты командой:
[shell]dpkg -i *.deb[/shell]

После этого в системе появится пользователь postgres, будет создан скрипт /etc/init.d/postgresql для старта и остановки СУБД.

После, даем права на папку pgsql пользователю и группе postgres:
[shell]chown postgres:postgres /var/lib/pgsql[/shell]

Задаем пароль пользователю postgres:
[shell]passwd postgres[/shell]

Редактируем /etc/group, где существующий id группы tape:x:26: меняем на какой-нибудь другой, например 27 :). В итоге, должны быть следующие строки:

postgres:x:26:
tape:x:27:

Стартуем сервис командой, указываем значение переменной LANG. Необходимо для первичного создания базы:
[shell]LANG=ru_RU.utf—8 service postgresql start[/shell]

Может ругнутся, что текущее значения Shmmax слишком мало для запуска PostgreSQL и предложить указать своё, но мы поступим умнее и воспользуемся следующим скриптом, который посчитает и выведет нужный размер Shmmax и Shmall в байтах.

SHMMAX - это максимальный размер (в байтах) на сегменте shared memory равный половине всей доступной памяти на сервере.

SHMALL - общее количество разделяемой памяти (в страницах), какое все процессы на сервере могут использовать.

Затем пропишем полученные значения с помощью команды:
[shell]echo "kernel.shmmax = 521981952" >> /etc/sysctl.conf
echo "kernel.shmall = 127437" >> /etc/sysctl.conf[/shell]

Или пропишем в /etc/sysctl.conf вручную. Для того что бы изменения вступили в силу, набираем:
[shell]sysctl -p[/shell]
Авторизуемся под пользователем Postgres и назначим пароль внутреннему пользователю PostgreSQL:
[shell]su postgres[/shell]

[shell]psql postgres[/shell]

[shell]alter user postgres with password 'YOUR_PASSWORD';[/shell]

Набираем \q что бы выйти из консоли.

Файл  /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 редактируем в соответствии со следующими данными: Усредненная настройка наиболее важных параметров:

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.
[shell]wget http://pgfoundry.org/frs/download.php/2449/pgtune-0.9.3.tar.gz[/shell]

[shell]tar xvfz *.tar.gz[/shell]

Переходим в каталог с pgtune, выполняем команду:
[shell]./pgtune −i $PGDATA/postgresql.conf −o $PGDATA/postgresql.conf.pgtune[/shell]

где,

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

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

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

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

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

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

Изменить root-пароль:
[shell]ALTER USER postgres WITH PASSWORD ‘newpassword’;[/shell]

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С Предприятие, установим следующие пакеты:
[shell]sudo apt-get install imagemagick libglib2.0-dev libgsf-1-dev texlive-base ttf-mscorefonts-installer libfreetype6 libfreetype6-dev unixodbc unixodbc-dev[/shell]

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

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

Если устанавливать всё сразу по маске, могут возникнуть ошибки.

1) 1c-enterprise82-common_8.2.15-319_amd64.deb // общие компоненты сервера
2) 1c-enterprise82-common-nls_8.2.15-319_amd64.deb // национальные ресурсы для общих компонент
3) 1c-enterprise82-server_8.2.15-319_amd64.deb // сервер 1С:предприятие 8.2 для Linux
4) 1c-enterprise82-server-nls_8.2.15-319_amd64.deb // Национальные ресурсы для сервера 1С
5) 1c-enterprise82-ws_8.2.15-319_amd64.deb // адаптер для публикации Web—сервисов 1С:Предприятия 8 на веб-сервере на основе Apache HTTP Server 2.0 или Apache HTTP Server 2.2;
6) 1c-enterprise82-ws-nls_8.2.15-319_amd64.deb // Национальные ресурсы для компонент веб-сервисов 1с8.2

Добавляем в автозагрузку:
[shell]update-rc.d srv1cv82 defaults[/shell]
Пользователю usr1cv82 разрешаем писать в /opt/1C и /home/usr1cv82
[shell]chown -R usr1cv82:grp1cv82 /opt/1C[/shell]
[shell]chown -R usr1cv82:grp1cv82 /home/usr1cv82[/shell]
Перезапускаем сервер. Проверяем корректность старта службы:
[shell]service srv1cv82 status[/shell]
Должно высветится:
[shell]init script: STARTED
Ragent: RUNNING[/shell]
На файрволе, если используется, для работы сервера 1С должны быть открыты следующие порты: tcp:1540 — агент сервера (ragent) tcp:1541 — главный менеджер кластера (rmngr) tcp:1560-1591 — диапазон сетевых портов для динамического распределения рабочих процессов. (достаточно открыть tcp:1560)
[shell]-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[/shell]
Проверка работоспособности рабочих процессов сервера:
[shell]netstat -tlnp | grep :15[/shell]
Должны получить примерно такую картинку:
[shell]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[/shell]
Но, получаем следующее:
[shell]tcp 0 0 0.0.0.0:1540 0.0.0.0:* LISTEN 960/ragent[/shell]
Так же просмотреть запущенные процессы можно с помощью команды:
[shell]ps aux|grep 1C[/shell]
Должны получить примерно следующее:
[shell]usr1cv82 931 0.0 1.8 338376 18612 ? Ssl Jul04 0:41 /opt/1C/v8.2/x86_64/ragent -daemon
usr1cv82 935 0.1 3.0 790496 31376 ? Sl Jul04 2:31 /opt/1C/v8.2/x86_64/rmngr -port 1541 -range 1560:1591
usr1cv82 948 0.4 11.5 720804 117412 ? Sl Jul04 6:21 /opt/1C/v8.2/x86_64/rphost -range 1560:1591 -reghost ubuntus12 -re[/shell]
Но запускается только ragent:
[shell]usr1cv82 931 0.0 1.8 338376 18612 ? Ssl Jul04 0:41 /opt/1C/v8.2/x86_64/ragent -daemon[/shell]

К сожалению танцы с бубном ни к чему не привели, и права выставлены везде корректно и сеть настроена должны образом. Нагуглил, что с 15 релизом у многих похожие проблемы, а у меня как раз  8.2.15-319. А 318 Помнится работал :)  Решил попробовать самый последний на момент написания обзора 8.2.16.362 и о чудо, с первого раза все завелось как надо.

Теперь необходимо  проверить корректность установки компонентов, которые мы установили в самом начале  с помощью проверяющего скрипта:

[shell]/opt/1C/v8.2/x86_64/utils/*config_server[/shell]

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

[shell]Cannot access /lib/libc-*.so: No such file or directory
Cannot access /lib64/libc-*.so: No such file or directory[/shell]
Посмотрим, где этот файл на самом деле сидит:
[shell]find / -name "libc-*.so" -print[/shell]
Получаем следующий выхлоп:
[shell]/lib/x86_64-linux-gnu/libc-2.15.so[/shell]
Неудивительно что скрипт его не находит, делаем поочередно два симлинка:
[shell]ln -s /lib/x86_64-linux-gnu/libc-2.15.so /lib/libc-2.15.so
ln -s /lib/x86_64-linux-gnu/libc-2.15.so /lib64/libc-2.15.so[/shell]
После чего, снова запускаем скрипт. Ошибка с "доступом" исчезает, но остается следующая:
[shell]./config_server: line 193: [: too many arguments
./config_server: line 193: [: too many arguments
./config_server: line 193: [: too many arguments
./config_server: line 193: [: too many arguments
./config_server: line 193: [: too many arguments[/shell]

В 193 строке содержится следующая запись, которая указывает на опрос переменной $SYSTEM_LIB_PATH, где видимо должны содержаться нужные 1су библиотеки.

[ ! -e $aliasFullName ] && return 1

Посмотрим, что конкретно не может обнаружить скрипт, запускаем:
[shell]echo $aliasFullName[/shell]
Получаем:
[shell]Can't detect SYSTEM_LIB_PATH, please set this environment variable manually!/libWand.so
Can't detect SYSTEM_LIB_PATH, please set this environment variable manually!/libfreetype.so
Can't detect SYSTEM_LIB_PATH, please set this environment variable manually!/libgsf-1.so
Can't detect SYSTEM_LIB_PATH, please set this environment variable manually!/libglib-2.0.so
Can't detect SYSTEM_LIB_PATH, please set this environment variable manually!/libodbc.so[/shell]

Как я понял,  SYSTEM_LIB_PATH должен обнаруживать искомые файлы в трех возможных директориях:

/usr/lib
/usr/lib32
/usr/lib64

Так же, необходимо вручную задать  SYSTEM_LIB_PATH в /etc/environment. Например пускай ищет библиотеки только в /usr/lib/

SYSTEM_LIB_PATH="/usr/lib"

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

/usr/lib/libWand.so
/usr/lib/libfreetype.so
Please install following package: FreeType
/usr/lib/libgsf-1.so
/usr/lib/libglib-2.0.so
Please install following package: libglib
/usr/lib/libodbc.so
Please install following package: UnixODBC

Файлы libWand.so и libgsf-1.so находятся там где нужно. Остальные файлы libfreetype.so, libglib-2.0.so и libodbc.so находятся в /usr/lib/x86_64-linux-gnu. Соответственно снова делаем смлинки:

[shell]ln -s /usr/lib/x86_64-linux-gnu/libfreetype.so /usr/lib/libfreetype.so
ln -s /usr/lib/x86_64-linux-gnu/libglib-2.0.so /usr/lib/libglib-2.0.so
ln -s /usr/lib/x86_64-linux-gnu/libodbc.so /usr/lib/libodbc.so[/shell]

Запускаем повторно скрипт, теперь видим, что все библиотеки в нужных нам директориях.
[shell]/usr/lib/libWand.so
/usr/lib/libfreetype.so
/usr/lib/libgsf-1.so
/usr/lib/libglib-2.0.so
/usr/lib/libodbc.so[/shell]

На клиенте, если Windows, заходим в консоль управления 1CV8 Servers (Администрирование серверов 1С Предприятия). Жмем, добавить Центральный сервер 1С:Преприятия 8.2, добавляем по имени. Во вкладке рабочие серверы должна появится запись.  Создаем новую базу, либо прямо с помощью консоли управления, либо в самом клиенте 1С выбираем опцию:

Добавить новую информационную базу.

Запускаем 1С. Тест Гилева выдает 13,05 балов.

По поводу HASP-ключей, если до 12 пользователей то нужен только сетевой ключ с маркировкой типа NETXX ORGL8, где XX — количество клиентских лицензий. Если более 12 пользователей, но необходим так же локальный ключ для сервера. Фиолетовый ключ HASP HL с маркировкой типа ENSR8 для 32x-битного сервера или зеленый ключ HASP HL Max маркировкой ENS8SA для 64-битного. Ключ HASP HL Max поддерживает так же 32-битный сервер.

Для нормальной работы HASP-ключей необходимо установить два пакета включающих драйвер ключа aksusbd и менеджер лицензий hasplm. Имеет смысл ставить модифицированные варианты драйверов от Entersoft. Для нормальной работы haspd, требуются поддержка 32-битных программ.

Поэтому добавляем ее установкой пакета ia32-libs.
[shell]apt-get install ia32-libs[/shell]

Теперь сам HASP и менеджер лицензий:
[shell]dpkg -i http://download.etersoft.ru/pub/Etersoft/HASP/stable/x86_64/Ubuntu/12.04/[/shell]

[shell]dpkg -i http://download.etersoft.ru/pub/Etersoft/HASP/stable/x86_64/Ubuntu/12.04/[/shell]

Вставляем ключ, перегружаем сервер. Работоспособность ключей проверяем командой:
[shell]sudo service haspd status[/shell]

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

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

Ставим apache:
[shell]apt-get install apache2[/shell]

Редактируем /etc/apache2/apache2.conf , где задаем директиву ServerName указывающую на имя сервера.
[shell]ServerName "ubuntus12"[/shell]
В противном случае при запуске apach'a получим сообщение:
[shell]httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName[/shell]

В корневом каталоге сайта, создаем директорию base, где base - имя базы к которой мы будем предоставлять доступ.

[shell]mkdir /var/www/base[/shell]

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

Переходим в /opt/1C/v8.2/x86_64/ Запускаем скрипт со следующими параметрами:
[shell]./webinst -apache22 -wsdir base -dir '/var/www/base' -connStr 'Srvr="ubuntus12";Ref="base";' -confPath /etc/apache2/httpd.conf[/shell]

Проверяем корректность внесенных изменений. В  /etc/apache2/httpd.conf  должны быть следующие строки:

LoadModule _1cws_module "/opt/1C/v8.2/i386/wsap22.so"

# 1c publication
Alias "base" "/var/www/base/"
<Directory "/var/www/base/">
AllowOverride None
Options None
Order allow,deny
Allow from all
SetHandler 1c-application
ManagedApplicationDescriptor "/var/www/base/default.vrd"

В /var/www/base/ так же должен появится файл default.vrd две последние строчки которого должны выглядеть примерно так:

base="/base"
ib="Srvr="ubuntus12";Ref="base";

Выдаем права на директорию, перезапускаем Apache:
[shell]chown -R www-data:www-data /var/www/base[/shell]

[shell]service apache2 restart[/shell]

Заходим браузером, предварительно отключив всплывающие окна.

http://ubuntus12/base

И получаем следующее сообщение:

Оно, и понятно, без специального сетевого ключа, работать не будет :)

5. Резервное копирование и восстановление:

Даем права пользователю postgres на тут папку куда будем выгружать backup.
[shell]chown postgres:postgres /mnt/net[/shell]

В /mnt/net у меня смонтирована виндовая шара, с помощью команды:
[shell]mount -t smbfs -o username=test,password=11111111,iocharset=utf8 //192.168.1.8/distr /mnt/net[/shell]

Отмонтировать, принудительно закрыв все подключения, если нужно:
[shell]umount -l /mnt/net[/shell]

Резервное копирование (Backup):
[shell]pg_dump -U postgres -Fc -Z9 dbname -f /mnt/net/Backup/Base/dbname.dump[/shell]

где:

-U (пользователь)
-F (формат извлекаемого файла)
с (custom - внутренний формат сжатия pg_dump, возможны так же варианты tar и plain text)
-Z (установить режим сжатия)
0 - 9 (0 - без сжатия, 9 - максимальный режим)
-f (извлекать в этот файл)

Если выгружаем на виндовую шару, необходимо полный доступ для Users.

Востановление (только из под пользователя postgres): В новую базу:
[shell]createdb -T template0 newdb[/shell]

где, template0 - шаблон означающий, что это абсолютно пустая база
[shell]pg_restore -d newdb db.dump[/shell]

Например:
[shell]createdb -T template0 mynewbase[/shell]

[shell]pg_restore -d mynewbase /mnt/net/my_old_base.dump[/shell]

С удалением базы и восстановлением ее из дампа:
[shell]pg_dump -Fc -Z9 dbname -f dbname.dump[/shell]

[shell]dropdb dbname[/shell]

[shell]pg_restore -C -d anydbname dbanme.dump[/shell]

где, С - создать базу

Например:

[shell]pg_dump -Fc -Z9 mybase -f /mnt/net/mybase.dump[/shell]

[shell]dropdb mybase[/shell]

[shell]pg_restore -C -d postgres /mnt/net/mybase.dump[/shell]

Здесь -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
, ,
Поделиться
Похожие записи