Суббота, 05 Февраль 2022 02:10

Настройка сервера 1С 8.3.20 на CentOS 9

Автор
Оцените материал
(14 голосов)

Вообще, про настройку сервера 1С на Линуксе я уже писал: 

https://typical-admin.ru/obshaya/linux-fedora/1c-linux

Но та статья уже весьма устарела. Та ещё про версию 8.2. А здесь я хочу попробовать настроить сервер 1С на свежей платформе 8.3.20.1674, установленной на свежую CentOS 9. На момент написания статьи это самые свежие версии ОС и 1С. PostgreSQL будет версии 13.4-6.1C — это тоже самая свежая версия, доступная на портале 1С на момент написания статьи. 

Этап 1. Установка ОС и общая подготовка. 

Начну с установки CentOS. Скачиваю образ с оф.сайта: 

https://centos.org/download/

Перехожу к установке. На первом шаге выбираю язык:

На следующем шаге предлагается обозначить разные параметры и источники:

Начну по порядку. Меню «Клавиатура» не трогаю, там всё и так нормально. «Источник установки» тоже не трогаю. Захожу в меню «Место установки», там указываю диск, на который будет ставиться система и выбираю собственное разбиение, затем жму «Готово»:

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

Затем выбираю «Стандартный раздел» и жму «создать автоматически»:

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

Меня так не устраивает. Отдельный раздел под /home мне не нужен, удаляю его. Потом увеличиваю размер корневого раздела. В итоге имею такие разделы:

Жму «Готово», затем «Применить изменения».

Вообще, если по уму, то PostgreSQL надо ставить отдельный диск (либо дисковый массив). А также, у 1С есть такая штука, как журнал регистрации, который, по умолчанию, находится в домашней директории системного пользователя 1С (в Линуксе это usr1cv8). Так вот под журнал регистрации желательно тоже выделить отдельный диск. Я обычно под весь домашний каталог пользователя usr1cv8 выделяю. Но сейчас сервер тестовый, поэтому всё будет на одном диске находиться.

После разметки диска, установщик меня возвращает в основное меню. Там «Языковую поддержку» я не трогаю. Перехожу в «Выбор программ». Там выбираю Minimal Install и ставлю крыж Standard, затем жму «Готово»:

После чего меня снова возвращает в основное меню. На очереди у меня KDUMP — его отключаю. Для диагностики и анализа причин сбоев ядра разработчиками компании RedHat был разработан специализированный инструмент — kdump. Можно и не отключать конечно. Но я отключу.

Следующим будет «Дата и время» — там всё понятно. «Имя сети и узла» — там прописываю сетевое имя сервера и статический IP-адрес:

И

DNS-сервером указал контроллер домена Active Directory. После применения всех настроек снова возвращаюсь в основное меню. «Securuty Profile» не трогаю. Осталось только задать «Пароль root». Там ставлю галку, чтобы можно было рутом заходить по SSH:

Вообще, доступ по SSH для рута не рекомендуется открывать. Рекомендуется по SSH заходить обычным бесправным пользователем, а уже потом повышать его до рута командой «su». Но для тестовой настройки можно и так.

После задания всех параметров, станет активной кнопка «Начать установку». Жму её.

Когда установка закончится, установщик попросит перезагрузить сервер.

Подключаюсь к серверу через SSH по заданному IP-адресу при установке. Сразу ставлю компоненты для комфортной работы: 

dnf -y install mc nano ntsysv chkconfig 

Не забываю про webmin:

wget https://prdownloads.sourceforge.net/webadmin/webmin-1.984-1.noarch.rpm
dnf -y install perl-Encode-Detect perl-File-Basename perl-lib perl-Authen-OATH perl
rpm -ivh webmin-1.984-1.noarch.rpm
 

Возможно, кстати, что Вэбмин и не пригодится, но я его всегда ставлю.

После этого, нужно обновить систему: 

dnf -y update 

Когда обновление завершится, то перезагружать систему не спешу. Сразу же надо отключить SELinux. Нахожу файл /etc/selinux/config и в нём заменяю строчку: 

SELINUX=enforcing 

на: 

SELINUX=disabled 

Также, выполняю команду: 

grubby --update-kernel ALL --args selinux=0 

И вот после этого перезагружаю систему. 

Этап 2. Сборка PostgreSQL и установка 1C. 

Начну с PostgreSQL. На портале 1С выложены уже готовые rpm-пакеты для установки. Насколько я понимаю, эти пакеты собраны универсально под все rpm-дистрибутивы Линукса. Можно попробовать поставить их. Но, как и в статье про настройку сервера 1С 8.2, я пойду путём сборки пакетов из src.rpm. На портале 1С скачиваю вот этот архив с патчем:

Загружаю этот файл на сервер через Webmin:

В этом архиве меня интересует файл postgresql13-1c-13.4-6.el7.src.rpm. Извлекаю его куда-нибудь, например в каталог /home/distrib. Затем устанавливаю все (почти все) необходимые пакеты для сборки: 

dnf -y install bison clang-devel e2fsprogs-devel flex krb5-devel libicu-devel libselinux-devel libuuid-devel libxml2-devel libxslt-devel llvm-devel openldap-devel openssl-devel pam-devel perl-generators python3-devel readline-devel systemd-devel tcl-devel zlib-devel rpm-build 

Для сборки ещё не хватает пакета pgdg-srpm-macros. Но проблема в том, что его нет в репозитории. Его я скачаю и установлю со стороннего ресурса: 

wget https://download.postgresql.org/pub/repos/yum/common/redhat/rhel-9-x86_64/pgdg-srpm-macros-1.0.22-1.rhel9.noarch.rpm
rpm -ivh pgdg-srpm-macros-1.0.22-1.rhel9.noarch.rpm
 

Перезагружу сервер на всякий случай. Слишком много пакетов установилось по зависимостям, возможна их некорректная работа. После этого пробую запустить сборку PosgreSQL: 

rpmbuild --rebuild postgresql13-1c-13.4-6.el7.src.rpm 

Оговорюсь, что данную команду выполнял, находясь в каталоге с файлом postgresql13-1c-13.4-6.el7.src.rpm. На моё удивление, сборка прошла с первого раза. Помню, сколько ошибок словил при сборке postgresql-9.0.3-3.1C под Fedora 16, когда настраивал сервер 1С 8.2.

Итак, в каталоге /root/rpmbuild/RPMS/x86_64 наблюдаю следующий список файлов: 

postgresql13-1c-13.4-6.el9.x86_64.rpm
postgresql13-1c-contrib-13.4-6.el9.x86_64.rpm
postgresql13-1c-contrib-debuginfo-13.4-6.el9.x86_64.rpm
postgresql13-1c-debuginfo-13.4-6.el9.x86_64.rpm
postgresql13-1c-debugsource-13.4-6.el9.x86_64.rpm
postgresql13-1c-devel-13.4-6.el9.x86_64.rpm
postgresql13-1c-devel-debuginfo-13.4-6.el9.x86_64.rpm
postgresql13-1c-docs-13.4-6.el9.x86_64.rpm
postgresql13-1c-libs-13.4-6.el9.x86_64.rpm
postgresql13-1c-libs-debuginfo-13.4-6.el9.x86_64.rpm
postgresql13-1c-llvmjit-13.4-6.el9.x86_64.rpm
postgresql13-1c-llvmjit-debuginfo-13.4-6.el9.x86_64.rpm
postgresql13-1c-plperl-13.4-6.el9.x86_64.rpm
postgresql13-1c-plperl-debuginfo-13.4-6.el9.x86_64.rpm
postgresql13-1c-plpython3-13.4-6.el9.x86_64.rpm
postgresql13-1c-plpython3-debuginfo-13.4-6.el9.x86_64.rpm
postgresql13-1c-pltcl-13.4-6.el9.x86_64.rpm
postgresql13-1c-pltcl-debuginfo-13.4-6.el9.x86_64.rpm
postgresql13-1c-server-13.4-6.el9.x86_64.rpm
postgresql13-1c-server-debuginfo-13.4-6.el9.x86_64.rpm
postgresql13-1c-test-13.4-6.el9.x86_64.rpm
postgresql13-1c-test-debuginfo-13.4-6.el9.x86_64.rpm 

Копирую их куда-нибудь в отдельное место. И, находясь в этом месте, даю команду:

rpm -ivh postgresql13-1c-13.4-6.el9.x86_64.rpm postgresql13-1c-contrib-13.4-6.el9.x86_64.rpm postgresql13-1c-docs-13.4-6.el9.x86_64.rpm postgresql13-1c-libs-13.4-6.el9.x86_64.rpm postgresql13-1c-llvmjit-13.4-6.el9.x86_64.rpm postgresql13-1c-plperl-13.4-6.el9.x86_64.rpm postgresql13-1c-plpython3-13.4-6.el9.x86_64.rpm postgresql13-1c-pltcl-13.4-6.el9.x86_64.rpm postgresql13-1c-server-13.4-6.el9.x86_64.rpm postgresql13-1c-test-13.4-6.el9.x86_64.rpm postgresql13-1c-devel-13.4-6.el9.x86_64.rpm 

PostgreSQL установил. Теперь мне надо сделать так, чтобы база PostgreSQL создалась в нужном мне каталоге. Пусть это будет /postgresql. Создам его и назначу права: 

mkdir /postgresql
chown postgres:postgres /postgresql 

По уму, к этому каталогу должен быть примонтирован отдельный диск. Далее нахожу файл /usr/lib/systemd/system/postgresql-13.service. В нём меня интересует строка: 

Environment=PGDATA=/var/lib/pgsql/13/data/ 

Её надо заменить на: 

Environment=PGDATA=/postgresql/ 

Далее выполняю команду инициализации новой базы данных: 

/usr/pgsql-13/bin/postgresql-13-setup initdb 

Должно выйти сообщение: 

Initializing database ... OK 

А в каталоге /postgresql появятся файлы базы данных: 

ls -l
итого 52
drwx------ 5 postgres postgres 41 янв 30 03:03 base
drwx------ 2 postgres postgres 4096 янв 30 03:03 global
drwx------ 2 postgres postgres 6 янв 30 03:03 pg_commit_ts
drwx------ 2 postgres postgres 6 янв 30 03:03 pg_dynshmem
-rw------- 1 postgres postgres 4548 янв 30 03:03 pg_hba.conf
-rw------- 1 postgres postgres 1636 янв 30 03:03 pg_ident.conf
drwx------ 2 postgres postgres 6 янв 30 03:03 pg_log
drwx------ 4 postgres postgres 68 янв 30 03:03 pg_logical
drwx------ 4 postgres postgres 36 янв 30 03:03 pg_multixact
drwx------ 2 postgres postgres 6 янв 30 03:03 pg_notify
drwx------ 2 postgres postgres 6 янв 30 03:03 pg_replslot
drwx------ 2 postgres postgres 6 янв 30 03:03 pg_serial
drwx------ 2 postgres postgres 6 янв 30 03:03 pg_snapshots
drwx------ 2 postgres postgres 6 янв 30 03:03 pg_stat
drwx------ 2 postgres postgres 6 янв 30 03:03 pg_stat_tmp
drwx------ 2 postgres postgres 18 янв 30 03:03 pg_subtrans
drwx------ 2 postgres postgres 6 янв 30 03:03 pg_tblspc
drwx------ 2 postgres postgres 6 янв 30 03:03 pg_twophase
-rw------- 1 postgres postgres 3 янв 30 03:03 PG_VERSION
drwx------ 3 postgres postgres 60 янв 30 03:03 pg_wal
drwx------ 2 postgres postgres 18 янв 30 03:03 pg_xact
-rw------- 1 postgres postgres 88 янв 30 03:03 postgresql.auto.conf
-rw------- 1 postgres postgres 28134 янв 30 03:03 postgresql.conf 

Теперь мне надо оптимизировать PostgreSQL под свой сервер. В моём случае, это AMD FX 8350 с 16gb ОЗУ и SSD диском. Использую рекомендации, написанные в ИТС: 

https://its.1c.ru/db/metod8dev/content/5866/hdoc

Надо заметить, в этой статье, судя по всему, подразумевается, что PostgreSQL стоит на выделенном сервере. У меня же на одной машине и PostgreSQL и 1С. Поэтому я буду немного отклоняться от значений, описанных по ссылке выше, в сторону меньших, чтобы для 1С тоже оставались ресурсы. Нахожу файл /postgresql/postgresql.conf. Ниже приведу только те параметры, которые я изменил:

# Количество одновременных соединений. 1C рекомендует не меньше 500.
max_connections = 500

# Количество памяти, выделенной PostgreSQL для совместного кеша страниц.
# Эта память разделяется между всеми процессами PostgreSQL.
# Задаётся из расчёта: RAM/4. Беру значение в два раза меньше от этого.
shared_buffers = 2GB

# Максимальное количество страниц для временных таблиц —
# верхний лимит размера временных таблиц в каждой сессии.
# Рекомендуется 256мб. Задаю в два раза меньше.
temp_buffers = 128MB

# Лимит памяти для обработки одного запроса.
# Эта память индивидуальна для каждой сессии.
# Рассчитывается: RAM/32..64 или 32MB..128MB — слишком размытая формула.
# При ОЗУ 1–4Gb рекомендуется устанавливать 32–128MB
# Значит при 16GB ОЗУ будет:
work_mem = 512MB

# Лимит памяти для обслуживающих задач, например вакуум, автовакуума или создания индексов.
# Рассчитывается RAM/16..32 или work_mem * 4 или 256MB..4GB
# Воспользуюсь вариантом work_mem * 4
maintenance_work_mem = 2GB

# Параметры процесса фоновой записи,
# который отвечает за синхронизацию страниц в shared_buffers с диском.
bgwriter_delay = 20ms
bgwriter_lru_maxpages = 400
bgwriter_lru_multiplier = 4.0

# Данный параметр отвечает за сброс данных из кэша на диск при завершении
# транзакций. Если установить его значение fsync=off, то данные не будут
# записываться на дисковые накопители сразу после завершения операций.
# Это может существенно повысить скорость операций insert и update, но
# есть риск повредить базу, если произойдет сбой (неожиданное отключение
# питания, сбой ОС, сбой дисковой подсистемы). Использовать эту возможность
# следует, только если имеются надежные ИБП и программное обеспечение,
# завершающее работу системы при низком заряде батарей.
fsync = off

# Выключение синхронной записи в WAL момент коммита транзакции.
# Создает риск потери последних нескольких транзакций (в течении 0.5-1" секунды),
# но гарантирует целостность базы данных. Может значительно увеличить производительность.
synchronous_commit = off

# Данный параметр ставится в off, если fsync=off
full_page_writes = off

# Минимальное и максимальный объем WAL файлов.
# Для их расчёта я воспользовался онлайн калькулятором:
# https://pgtune.leopard.in.ua/
max_wal_size = 16GB
min_wal_size = 4GB

# Стоимость чтения рандомной страницы. Практическое значение параметра
# должно зависеть от «seek time» дисковой системы: чем он меньше, тем
# меньше должно быть значение random_page_cost (но не менее 1.0) .
# Излишне большое значение параметра увеличивает склонность PostgreSQL
# к выбору планов со сканированием всей таблицы (PostgreSQL считает, что
# дешевле последовательно читать всю таблицу, чем рандомно индекс).
random_page_cost = 1.0

# Оценка планировщика запроса о размере дискового кеша, доступного для одного запроса.
# Это представление влияет на оценку стоимости использования индекса.
# Чем выше это значение, тем больше вероятность, что оптимизатором
# будет выбираться сканирование по индексу (Index Scan), чем ниже, тем
# более вероятно, что будет выбрано последовательное сканирование (Seq Scan).
# Рассчитывается RAM - shared_buffers. У меня это получается 8 - 2.
effective_cache_size = 6GB

# Задаёт максимальное число элементов в списке FROM, до которого
# планировщик будет объединять вложенные запросы с внешним запросом.
# При меньших значениях сокращается время планирования, но план запроса
# может стать менее эффективным.
from_collapse_limit = 20

# Задаёт максимальное количество элементов в списке FROM, до достижения которого
# планировщик будет сносить в него явные конструкции JOIN (за исключением FULL JOIN).
# При меньших значениях сокращается время планирования, но план
# запроса может стать менее эффективным.
join_collapse_limit = 20

# указываю писать логи в системный лог
log_destination = 'syslog'

# Включить автовакуум.
# его отключение приведет к росту размеров базы и серьезной деградации производительности.
autovacuum = on

# Количество процессов автовакуума. Чем больше запросов на
# запись выполняется в системе, тем больше процессов.
# Рассчитывается CPU cores/4..2 но не меньше 4.
autovacuum_max_workers = 4

# Время сна процесса автовакуума. Слишком большая величина будет приводить к тому,
# что таблицы не будут успевать «чиститься», что приведет у роста размера и снижению
# производительности работы. Малая величина приведет к бесполезной нагрузке.
autovacuum_naptime = 20s

# Не выдавать предупреждение об использовании символа \ для экранирования.
escape_string_warning = off

# Разрешить использовать символ \ для экранирования.
standard_conforming_strings = off

 Закончив редактировать конфиг пробую запустить демона PostgreSQL: 

systemctl start postgresql-13.service

И смотрю, что там в логе /var/log/messages: 

Jan 31 00:59:37 1c-serv systemd[1]: Starting PostgreSQL 13 database server…
Jan 31 00:59:37 1c-serv postgres[2035]: [1-1] 2022-01-31 00:59:37.218 +05 [2035] СООБЩЕНИЕ: завершение вывода в stderr
Jan 31 00:59:37 1c-serv postmaster[2035]: 2022-01-31 00:59:37.218 +05 [2035] СООБЩЕНИЕ: завершение вывода в stderr
Jan 31 00:59:37 1c-serv postmaster[2035]: 2022-01-31 00:59:37.218 +05 [2035] ПОДСКАЗКА: В дальнейшем протокол будет выводиться в "syslog".
Jan 31 00:59:37 1c-serv postgres[2035]: [1-2] 2022-01-31 00:59:37.218 +05 [2035] ПОДСКАЗКА: В дальнейшем протокол будет выводиться в "syslog".
Jan 31 00:59:37 1c-serv postgres[2035]: [2-1] 2022-01-31 00:59:37.219 +05 [2035] СООБЩЕНИЕ: запускается PostgreSQL 13.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 11.2.1 20211203 (Red Hat 11.2.1-7), 64-bit
Jan 31 00:59:37 1c-serv postgres[2035]: [3-1] 2022-01-31 00:59:37.219 +05 [2035] СООБЩЕНИЕ: для приёма подключений по адресу IPv6 "::1" открыт порт 5432
Jan 31 00:59:37 1c-serv postgres[2035]: [4-1] 2022-01-31 00:59:37.219 +05 [2035] СООБЩЕНИЕ: для приёма подключений по адресу IPv4 "127.0.0.1" открыт порт 5432
Jan 31 00:59:37 1c-serv postgres[2035]: [5-1] 2022-01-31 00:59:37.219 +05 [2035] СООБЩЕНИЕ: для приёма подключений открыт Unix-сокет "/var/run/postgresql/.s.PGSQL.5432"
Jan 31 00:59:37 1c-serv postgres[2035]: [6-1] 2022-01-31 00:59:37.219 +05 [2035] СООБЩЕНИЕ: для приёма подключений открыт Unix-сокет "/tmp/.s.PGSQL.5432"
Jan 31 00:59:37 1c-serv postgres[2036]: [7-1] 2022-01-31 00:59:37.221 +05 [2036] СООБЩЕНИЕ: система БД была выключена: 2022-01-30 03:03:35 +05
Jan 31 00:59:37 1c-serv postgres[2035]: [7-1] 2022-01-31 00:59:37.227 +05 [2035] СООБЩЕНИЕ: система БД готова принимать подключения
Jan 31 00:59:37 1c-serv systemd[1]: Started PostgreSQL 13 database server. 

Всё в порядке, PostgreSQL запустился.

Сразу установлю пароль на пользователя postgres: 

su -l postgres
psql
alter user postgres with password 'тут мой пароль';
\q
exit 

Что ж, теперь надо установить 1С. Перехожу на портал и скачиваю свежую платформу:

У меня скачался файл server64_8_3_20_1674.tar.gz. Переношу его на сервер и распаковываю его содержимое в какой-нибудь каталог. Среди распакованных есть исполняемый файл setup-full-8.3.20.1674-x86_64.run. Пробую его запустить. Предлагается выбрать язык: 

Пожалуйста, выберите язык установки
[1] Arabic – العربية
[2] Azerbaijani — Azərbaycan
[3] Bulgarian - български език
[4] German — Deutsch
[5] Greek — Ελληνικά
[6] English — English
[7] Spanish — Español
[8] French — Français
[9] Hungarian — Magyar
[10] Italian — Italiano
[11] Kazakh - қазақ тілі
[12] Lithuanian - lietuvių kalba
[13] Latvian — Latvijas
[14] Polish — Polski
[15] Romanian — Română
[16] Russian — Русский
[17] Turkmen — Türkmençe
[18] Turkish — Türkçe
[19] Ukrainian — українська
[20] Vietnamese - Tiếng Việt
[21] Simplified Chinese – 简体中文
Пожалуйста, выберите опцию [16] : 16 

Мой язык 16-ый из этого списка. Далее мне предлагается выбрать компоненты. Мне нужен только сервер и модуль расширения web-сервера: 

Выберите компоненты

1С:Предприятие [Y/n] :n
1С:Предприятие - Тонкий клиент [y/N] : n
1С:Предприятие - Тонкий клиент, файловый вариант [y/N] : n
Сервер 1С:Предприятия 8 [y/N] : y
Модули расширения веб-сервера [y/N] : y
Администрирование сервера 1С:Предприятия [y/N] : n
Интерфейсы на различных языках : Y (Cannot be edited)
Интерфейсы на различных языках - Азербайджанский [y/N] : n
Интерфейсы на различных языках - Английский : Y (Cannot be edited)
Интерфейсы на различных языках - Арабский [y/N] : n
Интерфейсы на различных языках - Армянский [y/N] : n
Интерфейсы на различных языках - Болгарский [y/N] : n
Интерфейсы на различных языках - Венгерский [y/N] : n
Интерфейсы на различных языках - Греческий [y/N] : n
Интерфейсы на различных языках - Вьетнамский [y/N] : n
Интерфейсы на различных языках - Грузинский [y/N] : n
Интерфейсы на различных языках - Казахский [y/N] : n
Интерфейсы на различных языках - Китайский [y/N] : n
Интерфейсы на различных языках - Итальянский [y/N] : n
Интерфейсы на различных языках - Испанский [y/N] : n
Интерфейсы на различных языках - Латышский [y/N] : n
Интерфейсы на различных языках - Литовский [y/N] : n
Интерфейсы на различных языках - Немецкий [y/N] : n
Интерфейсы на различных языках - Польский [y/N] : n
Интерфейсы на различных языках - Румынский [y/N] : n
Интерфейсы на различных языках - Русский [Y/n] :y
Интерфейсы на различных языках - Турецкий [y/N] : n
Интерфейсы на различных языках - Туркменский [y/N] : n
Интерфейсы на различных языках - Французский [y/N] : n
Интерфейсы на различных языках - Украинский [y/N] : n
Сервер хранилища конфигураций 1С:Предприятия [y/N] : n
Дополнительные функции администрирования [y/N] : n
Дополнительно : Y (Cannot be edited)
Дополнительно - Liberica JRE [y/N] : n
Дополнительно - Контроль целостности [y/N] : n

Верно ли выбранное выше? [Y/n]: y 

Ну и дожидаюсь окончания установки: 

----------------------------------------------------------------------------
Программа готова к установке 1С:Предприятие на ваш компьютер.

Вы хотите продолжить? [Y/n]: y

----------------------------------------------------------------------------
Пожалуйста, подождите пока программа установит 1С:Предприятие на ваш компьютер.

Установка
0% ______________ 50% ______________ 100%
#########################################

----------------------------------------------------------------------------
Завершена установка 1С:Предприятие на ваш компьютер. 

Установилась 1С в каталог /opt/1cv8. Также наблюдаю каталог системного пользователя 1С /home/usr1cv8. По уму, к этому каталогу должен быть примонтирован отдельный диск, т.к. внутри будет журнал регистрации 1С. В каталоге /opt/1cv8/x86_64/8.3.20.1674 нахожу скрипт srv1cv83. Его надо скопировать в каталог /etc/rc.d/init.d. Затем пробую стартануть демона: 

service srv1cv83 start 

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

Starting 1C:Enterprise 8.3 server: Error: service failed to start!
FAILED 

При этом 1С-овские процессы запустились, в системном мониторе отображается множество процессов /opt/1cv8/x86_64/8.3.20.1674/rmngr. Хорошо, пробую остановить демона: 

service srv1cv83 stop 

Получаю вот такой ответ: 

Stopping 1C:Enterprise 8.3 server: Warning: server not running!
OK 

И процессы /opt/1cv8/x86_64/8.3.20.1674/rmngr никуда, при этом, не деваются. А решение данной проблемы очень простое: в файл /etc/hosts надо добавить запись: 

192.168.0.210 1c-serv.local.typical-admin.ru 1c-serv 

И перезагрузить сервер. После этого демон srv1cv83 будет стартовать и останавливаться нормально.

Ещё, в каталоге /opt/1cv8/x86_64/8.3.20.1674 есть файл srv1cv83.conf. Его надо скопировать в каталог /etc/sysconfig, переименовав в просто «srv1cv83». Вобщем, надо чтобы имена файлов совпадали — скрипта /etc/rc.d/init.d/ srv1cv83 и конфига /etc/sysconfig/srv1cv83.

Перед тем, как подключиться к серверу 1С откуда-либо, надо для него создать DNS-запись. Напомню, что у меня в сети есть контроллер домен AD.

Помимо этого, не забываю, что на CentOS включен фаервол под названием Firewalld. Для начала открываю порт 10000, чтобы к CentOS можно было подключиться через Webmin: 

firewall-cmd --add-port=10000/tcp 

Затем уже через Webmin захожу и прописываю в Firewalld все необходимые порты, которые надо открыть:

Далее, нахожу файл /postgresql/pg_hba.conf. В нём нахожу строчку: 

local all all peer 

И меняю её на: 

local all all trust 

Это для того, чтобы можно было подключаться к PostgreSQL через сокет, а не через сетевой стек. Не забываю перезапустить PostgreSQL после этого: 

service postgresql-13 restart 

И не забываю PostgreSQL и 1С поставить в автозапуск: 

systemctl enable postgresql-13.service
chkconfig srv1cv83 on 

Теперь пробую с какой-нибудь клиентской машины подключиться через консоль:

Ввожу имя сервера 1С «1c-serv.local.typical-admin.ru»:

Всё, подключиться получилось:

Теперь пробую создать базу:

Обращаю внимание, что вместо адреса сервера PostgreSQL я ввёл путь к каталогу с сокетом PostgreSQL, поскольку сервер приложений 1С и PostgreSQL находятся на одной машине. Жму ОК, и тут получаю ошибку: «Ошибка соединения с рабочим процессом. Ошибка загрузки компоненты: moxel». Эта проблема решается установкой пакета lcms2: 

dnf -y install lcms2 

После этого база успешно создастся. 

Этап 3. Установка HASP, решение проблем, настройка вэб-доступа.

Пробую зайти в созданную базу и получаю предупреждение об отсутствии лицензии.

Значит надо поставить HASP-драйвер и вставить ключи. Скачиваю пакеты с сайта https://download.etersoft.ru/: 

wget https://download.etersoft.ru/pub/Etersoft/HASP/7.90/x86_64/CentOS/7/haspd-7.90-eter2centos.x86_64.rpm
wget https://download.etersoft.ru/pub/Etersoft/HASP/7.90/x86_64/CentOS/7/haspd-modules-7.90-eter2centos.x86_64.rpm
 

Потом ставлю сперва пакет, который потребуется по зависимостям: 

dnf install glibc.i686 

И уже потом ставлю скачанные два пакета HASP-драйверов: 

rpm -ivh haspd-7.90-eter2centos.x86_64.rpm haspd-modules-7.90-eter2centos.x86_64.rpm 

Получаю вот такой лог об успешной установке: 

Verifying...                          ################################# [100%]
Подготовка...                         ################################# [100%]
Обновление / установка…
   1:haspd-7.90-eter2centos           ################################# [ 50%]
Loading HASP LPT kernel module...  (/dev/lp0 device has not found)                     [PASSED]
Check kernel for CONFIG_USB_DEVICEFS...                                                [PASSED]
Enable workaround for /proc/bus/usb (bind from /dev/bus/usb)                           [ DONE ]
                                                                                       [ DONE ]
Running aksusbd...                                                                     [ DONE ]
Running winehasp...                                                                    [ DONE ]
Running hasplm...                                                                      [ DONE ]
Running hasplmd...                                                                     [ DONE ]
   2:haspd-modules-7.90-eter2centos   ################################# [100%]
Stopping hasplmd... .                                                                  [ DONE ]
Stopping hasplm...                                                                     [ DONE ]
Stopping winehasp...                                                                   [ DONE ]
Stopping aksusbd...                                                                    [ DONE ]
Stopping skeyd...                                                                      [PASSED]
Stopping usbsentinel...                                                                [PASSED]
Stopping SntlKeysSrvrlnx...                                                            [PASSED]
Stopping workaround for /proc/bus/usb                                                  [ DONE ]
Unloading HASP LPT kernel module...                                                    [PASSED]
Loading HASP LPT kernel module...  (/dev/lp0 device has not found)                     [PASSED]
Check kernel for CONFIG_USB_DEVICEFS...                                                [PASSED]
Enable workaround for /proc/bus/usb (bind from /dev/bus/usb)                           [ DONE ]
                                                                                       [ DONE ]
Running aksusbd...                                                                     [ DONE ]
Running winehasp...                                                                    [ DONE ]
Running hasplm...                                                                      [ DONE ]
Running hasplmd...                                                                     [ DONE ]

Чтобы система корректно увидела ключ, надо перезагрузить сервер, но пока не буду это делать. Сразу же подправлю конфиг /etc/haspd/hasplm.conf. Добавлю в него строчку: 

NHS_IP_LIMIT = 192.168.0.0/24

Именно в этой строчке перечисляются сети и хосты, которые смогут видеть HASP-ключ. Также, нужно помнить про фаервол:

Пробую зайти в созданную базу и получаю предупреждение:

«На сервере отсутствуют шрифты из состава Microsoft Core»

И вроде как решение тут: 

http://mscorefonts2.sourceforge.net/

Но… Если попробовать установить зависимости, указанные на этом сайте, то ждёт разочарование: 

dnf install curl cabextract xorg-x11-font-utils fontconfig
Последняя проверка окончания срока действия метаданных: 2:02:43 назад, Пн 31 янв 2022 05:15:49.
Пакет curl-7.76.1-14.el9.x86_64 уже установлен.
Нет соответствия аргументу: xorg-x11-font-utils 

В репозиториях CentOS 9 (да и в CentOS 8) пакета xorg-x11-font-utils нет. Да и вообще, его нет для этих систем. Я не нашёл. Пришлось выкручиваться путём пересборки этого пакета из src.rpm от CentOS 7. А тот, в свою очередь, для сборки потребовал ещё несколько пакетов, среди которых опять был один отсутствующий в CentOS — его уже пришлось пересобирать из src.rpm от Федоры. Все эти процессы сборки я описывать не буду, а просто выложу готовые недостающие пакеты для CentOS 9: 

https://disk.yandex.ru/d/h4UTNe4BNxJnRA

Туда же положил и сам пакет msttcore-fonts-installer-2.6-1.noarch.rpm, чтобы всё в одном месте было. Итого, потребуется скачать файлы: libXfont-1.5.4-10.el9.x86_64.rpm, xorg-x11-font-utils-7.5-21.el9.x86_64.rpm и msttcore-fonts-installer-2.6-1.noarch.rpm. Ставлю сначала зависимости, имеющиеся в репозиториях: 

dnf -y install curl cabextract fontconfig libfontenc 

Затем устанавливаю три скачанных файла: 

rpm -ivh libXfont-1.5.4-10.el9.x86_64.rpm xorg-x11-font-utils-7.5-21.el9.x86_64.rpm msttcore-fonts-installer-2.6-1.noarch.rpm 

Пакет msttcore-fonts-installer-2.6-1.noarch.rpm, на самом деле, просто подгружает шрифты со стороннего ресурса и кладёт их в каталог /usr/share/fonts/msttcore. Т.е. теоретически, их можно было и вручную откуда-нибудь скачать и положить в этот каталог. Предупреждение о шрифтах после этого не выходит.

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

https://its.1c.ru/db/v8319doc#bookmark:usr:TI000000019

Там вижу, что требуется: ImageMagick, Fontconfig, FreeType, Libgsf, Glib, UnixOdbc и Kerberos.

Что касается ImageMagick, то по его установке на CentOS 9 у меня есть отдельная заметка: 

https://typical-admin.ru/moi-zametki/ustanovka-imagemagick-na-centos-9

Устанавливаю ImageMagick по своей же инструкции. С остальными пакетами проще, они есть в репозиториях. Причём некоторые уже наверняка стоят. Но если что-то отсутствует, то эта команда исправит:

dnf -y install fontconfig libgsf glib2 unixODBC krb5-libs krb5-workstation 

Ну и после этого, пожалуй, стоит перезагрузить сервер.

Теперь надо попробовать дать вэб-доступ какой-нибудь базе 1с. Для начала, ставлю apache: 

dnf -y install httpd

И, на всякий случай, если система сама не включила его в автозагрузку, выполняю команду: 

systemctl enable httpd.service 

Далее, надо определиться, где будет располагаться файл веб-интерфейса. Для каждой базы надо делать свой такой каталог. Файл вэб-интерфайса к моей базе будет располагаться вот тут: 

mkdir /var/www/testbase

Затем перехожу в каталог /opt/1cv8/x86_64/8.3.20.1674 и, находясь в нём, выполняю команду: 

./webinst -apache24 -wsdir mytest -dir '/var/www/testbase/' -connStr 'Srvr=1c-serv.local.typical-admin.ru;Ref=testbase1' -confPath /etc/httpd/conf/httpd.conf 

Где:

-wsdir – имя алиаса, используемого на веб-сервере для соединения с базой. В последствии будет обращение к ней в браузере http://адрес.сервера/mytest
-dir – директория где будет располагаться файл web-интерфейса 1с (файл default.vrd)
-connStr – строка соединения с базой 1С предприятия, в которой Srvr – адрес сервера 1С предприятия, а Ref – имя базы.
-confPath – расположение конфигурационного файла web-сервера apache 

Не забыть исправить права доступа к файлу default.vrd: 

chown -R apache:apache /var/www/testbase 

и открыть 80-ый порт на Firewalld:

Затем, стартую апач: 

service httpd start 

А потом пробую зайти по адресу: 

http://1c-serv.local.typical-admin.ru/mytest 

Где, в моём случае, 1c-serv.local.typical-admin.ru — это адрес сервера 1C предприятие, а mytest — это вышеописанный алиас в апаче. Доступ есть, всё хорошо:

 Однако, это не совсем правильный доступ. Правильный доступ будет через SSL-сертификат. Но про настройку вэб-доступа через доверенный сертификат я хочу написать в отдельной статье или заметке, потому что там гораздо больше информации о получении самого сертификата. Частично я эту тему уже затрагивал в статье по настройке Zimbra 9: 

https://typical-admin.ru/item/86-zimbra-9-0-0

Этап 4. Настройка прозрачной авторизации пользователей через kerberos.

Внимание! Я думал, что на этом этапе у меня где-то ошибка, потому что kerberos авторизация работать никак не хотела.
Путём продолжительного общения с оф.поддержкой выяснилось, что 1С официально не поддерживает CentOS 9, поэтому ничем помочь не могут.
Официально 1С поддерживает лишь CentOS 7, на которой kerberos авторизация работать должна. У меня на CentOS 7 работает один сервер 1С в продакшене. Но платформа на нём стоит 8.3.16.1814. На нём я решил проверить, работает ли kerberos-авторизация.
Оказалось, что да, работает. Поэтому данный этап проверен на CentOS 7 с 1C 8.3.16.1814. Позже, я пробовал поставить 1С 8.3.16.1814 на CentOS 9 и настроить всё точно также, как на CentOS 7. Но на CentOS 9 всё равно не заработало.

Поскольку у меня есть Active Directory, то почему бы не настроить авторизацию пользователей 1C через неё? Тем более, что 1C это поддерживает. В линуксе это делается через kerberos.

Сперва-наперво, на контроллере домена надо создать keytab-файл и пользователя, с которым он будет ассоциироваться. Пользователь – это самый обычный пользователь без каких-либо особых привилегий. Называться он будет usr1cv83, и пароль у него будет pas1cv83.

Напомню, что у меня контроллер домена на Windows server 2019. После того как создал пользователя, открываю виндовую командную строчку и делаю вот такую команду: 

ktpass /crypto ALL /princ usr1cv8/1c-serv.local.typical-admin.ru@LOCAL.TYPICAL-ADMIN.RU /mapuser usr1cv83 /pass pas1cv83 /out C:\distrib\usr1cv8.keytab 

где параметр /crypto ALL позволяет использовать любой тип шифрования
параметр /princ usr1cv8/1c-serv.local.typical-admin.ru@LOCAL.TYPICAL-ADMIN.RU – это имя службы, с которой будет ассоциирован виндовый пользователь usr1cv83.
параметр /out C:\distrib\usr1cv8.keytab – название keytab-файла и путь, куда его положить.

Командную строку, при этом, надо запустить с повышенными привилегиями администратора. Так у меня выглядит отработка команды:

Итак, после выполнения этой команды появится файл C:\distrib\usr1cv8.keytab, который надо скопировать на линуховый сервер 1С в каталог /opt/1C/v8.3/x86_64. В этом каталоге 1С ищет его по умолчанию. И важно: файл должен называться usr1cv8.keytab, а никак иначе.

Если требуется, чтобы файл лежал в другом каталоге, то надо в конфиге /etc/sysconfig/srv1cv83 подправить параметр: 

SRV1CV8_KEYTAB=/opt/1cv8/x86_64 

Где /opt/1cv8/x86_64 - это место расположения файла usr1cv8.keytab. И не забыть перезапустить демон srv1cv83 после этого. 

Затем, если этого ещё не сделано, необходимо на сервере 1С установить пакет krb5-workstation

dnf -y install krb5-workstation 

Потом надо отредактировать конфиг /etc/krb5.conf. Приведу лишь те строчки, которые редактировал и добавлял: 

[libdefaults]
    default_realm = LOCAL.TYPICAL-ADMIN.RU

[realms]
 LOCAL.TYPICAL-ADMIN.RU = {
     kdc = 192.168.0.200
     admin_server = 192.168.0.200
 }

[domain_realm]
 .local.typical-admin.ru = LOCAL.TYPICAL-ADMIN.RU
 local.typical-admin.ru = LOCAL.TYPICAL-ADMIN.RU

Далее, надо поправить доступ к файлу usr1cv8.keytab: 

chown usr1cv8:grp1cv8 /opt/1C/v8.3/x86_64/usr1cv83.keytab
chmod 600 /opt/1C/v8.3/x86_64/usr1cv83.keytab 

Следующий шаг, который не указан в документации 1С, но который оказался очень важным. Требуется, чтобы имя сервера 1С было полным FQDN-именем, под которым он записан в домене Active Directory. И если это не так, то надо переименовать сервер. В моём случае оно было так, но вот команда, если что: 

hostnamectl set-hostname 1c-serv.local.typical-admin.ru 

Затем надо обратить внимание на файл /etc/hosts. У меня там есть запись: 

192.168.0.210 1c-serv 1c-serv.local.typical-admin.ru 

Из-за которой керберос авторизация работать не будет. Эту запись надо исправить, убрав из неё короткое имя: 

192.168.0.210 1c-serv.local.typical-admin.ru 

Вот теперь тестирую корректность keytab-файла: 

klist -e -k -t /opt/1C/v8.3/x86_64/usr1cv8.keytab 

Вывод должен быть такой: 

Keytab name: FILE:/opt/1C/v8.3/x86_64/usr1cv8.keytab
KVNO Timestamp Principal
---- ------------------- ------------------------------------------------------
3 01.01.1970 05:00:00 usr1cv8/1c-serv.local.typical-admin.ru@LOCAL.TYPICAL-ADMIN.RU (DEPRECATED:des-cbc-crc)
3 01.01.1970 05:00:00 usr1cv8/1c-serv.local.typical-admin.ru@LOCAL.TYPICAL-ADMIN.RU (DEPRECATED:des-cbc-md5)
3 01.01.1970 05:00:00 usr1cv8/1c-serv.local.typical-admin.ru@LOCAL.TYPICAL-ADMIN.RU (DEPRECATED:arcfour-hmac)
3 01.01.1970 05:00:00 usr1cv8/1c-serv.local.typical-admin.ru@LOCAL.TYPICAL-ADMIN.RU (aes256-cts-hmac-sha1-96)
3 01.01.1970 05:00:00 usr1cv8/1c-serv.local.typical-admin.ru@LOCAL.TYPICAL-ADMIN.RU (aes128-cts-hmac-sha1-96)
 

Теперь указываю керберосу, что надо использовать данный keytab-файл: 

kinit -k -t /opt/1C/v8.3/x86_64/usr1cv8.keytab usr1cv8/1c-serv.local.typical-admin.ru@LOCAL.TYPICAL-ADMIN.RU 

команда должна отработать без вывода каких-либо сообщений – это означает, что всё хорошо. Затем смотрю полученный билет: 

klist 

вывод должен быть примерно таким: 

Ticket cache: KCM:0
Default principal: usr1cv8/1c-serv.local.typical-admin.ru@LOCAL.TYPICAL-ADMIN.RU

Valid starting Expires Service principal
01.02.2022 20:59:50 02.02.2022 06:59:50 krbtgt/LOCAL.TYPICAL-ADMIN.RU@LOCAL.TYPICAL-ADMIN.RU
renew until 08.02.2022 20:59:50
 

Собственно, на этом всё. Осталось проверить, работает ли прозрачная авторизация на практике. Важным моментом является то, что в её свойствах аутентификации надо выставить крыж «выбирать автоматически»: 

Далее, в свойствах пользователя 1С, надо сопоставить его с пользователем AD. Прописываться он должен вот в таком формате:

Этап 5. Настройка резервного копирования баз.

Резервное копирование я буду проводить средствами PostgreSQL. Для этого создам файлик: 

nano /home/distrib/back-psql 

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

#!/bin/bash

PATH=/sbin:/usr/sbin:/bin:/usr/bin

# остановка демона 1С
/etc/init.d/srv1cv83 stop

# выгрузка дампа testbase1 в локальный каталог
pg_dump -Upostgres -w -Ft -b -EUTF8 -v -f "/home/dumps/testbase1_`date '+%d.%m.%y'`.psql" "testbase1"

# сжатие дампа testbase1 в локальном каталоге
bzip2 "/home/dumps/testbase1_`date '+%d.%m.%y'`.psql"

# выгрузка дампа testbase2 в локальный каталог
pg_dump -Upostgres -w -Ft -b -EUTF8 -v -f "/home/dumps/testbase2_`date '+%d.%m.%y'`.psql" "testbase2"

# сжатие дампа testbase2 в локальном каталоге
bzip2 "/home/dumps/testbase2_`date '+%d.%m.%y'`.psql"

# запуск демона 1С
/etc/init.d/srv1cv83 start

# копирование сжатых дампов в каталог с примонтированным сетевым диском
cp "/home/dumps/testbase1_`date '+%d.%m.%y'`.psql.bz2" "/home/backup/"
cp "/home/dumps/testbase2_`date '+%d.%m.%y'`.psql.bz2" "/home/backup/"

# удаление дампов из локального каталога
rm -f "/home/dumps/testbase1_`/bin/date '+%d.%m.%y'`.psql.bz2"
rm -f "/home/dumps/testbase2_`/bin/date '+%d.%m.%y'`.psql.bz2" 

Где:

/home/dumps — это локальный каталог на сервер для выгрузки дампов баз.
/home/backup — это каталог с примонтированным сетевым диском, на который и будут складываться ежедневные ночные бэкапы баз. 

Сохраняю и делаю файл исполняемым: 

chmod +x /home/distrib/back-psql 

Затем в файл /etc/crontab добавляю строчку: 

0 2 * * * root /home/distrib/back-psql 

Это значит, что скрипт, делающий резервные копии баз, будет запускаться каждый день в 2 часа ночи.

Если же мне потом понадобится восстановить базу из бэкапа, то действия мои будут следующие:

- Для начала, копирую бэкап в какой-нибудь локальный каталог на сервер 1С. Пусть это будет файл testbase1_04.02.22.psql.bz2.

- Затем я распаковываю этот файл командой: 

bunzip2 testbase1_04.02.22.psql.bz2 

И получаю тем самым файл testbase1_04.02.22.psql — это дамп базы.

- Далее, я становлюсь пользователем postgres: 

su postgres 

И выполняю команду: 

psql

чтобы начать работать с базами через консольный клиент PostgreSQL.

- После этого мне надо сначала удалить ту базу, бэкап которой я хочу восстановить: 

DROP DATABASE "testbase1"; 

- Потом заново создаю пустую базу с таким же именем: 

CREATE DATABASE "testbase1"; 

- Далее выхожу из консольного клиента:

\q

и выхожу из пользователя postgres: 

exit

- И теперь мне надо залить дамп testbase1_04.02.22.psql в базу testbase1. Делается это вот такой командой: 

pg_restore -Upostgres -d "testbase1" -w -v "testbase1_04.02.22.psql" 

Всё.

Донаты принимаются на кошельки:

Yoomoney:
4100118091867315

Карта Т-Банк (бывший Тиньков):
2200 7017 2612 2077

Карта Альфа-Банк:
2200 1539 1357 2013

Прочитано 6473 раз Последнее изменение Понедельник, 18 Ноябрь 2024 18:03

You have no rights to post comments

Вы здесь: Home Мои статьи Linux Fedora/CentOS/RedHat Настройка сервера 1С 8.3.20 на CentOS 9