Всем привет!
На этот раз, я хочу рассмотреть поднятие сервера для 1с 8.2 под линуксом. В этом мне очень помогла вот эта статья:
http://www.lissyara.su/archive/1c_8.2+postgresql
Начнём с установки операционной системы. Я для этого выбрал Fedora 16. При установке системы я выбрал самый минимальный набор пакетов и поставил галку, чтобы можно было вручную выбрать нужные пакеты для установки. Затем зашёл в «Базовую систему» и там отметил следующее:
- Основные
- acpid
- fedora-release-notes
- krb5-workstation
- man-pages
- nano
- nc
- pam-krb5
- sudo
- tree
- unzip
- wget
- yum-utils
- zip
- Поддержка оборудования
- Системные средства
- mc
- samba-client
Затем, жду, пока система установится. Надо заметить, что с таким небольшим набором пакетов, система ставится очень быстро. После установки перезагружаем комп и настраиваем в биосе, чтоб он грузился с жёсткого диска.
Этап 1. Общая подготовка сервера.
Далее, нужно обновить установленную систему. А для этого надо, чтобы система имела выход в интернет, поэтому нужно настроить сеть. Открываем консольный файловый менеджер:
mc
и переходим в каталог /etc/sysconfig/network-scripts. В более ранних версиях федоры сетевые интерфейсы назывались eth0, eth1, eth2 и так далее, но в шестнадцатой федоре обозначение сетевых карт изменилось. Поскольку, сетевух на сервере у меня две, то у себя я в этом каталоге обнаружил файлы с названиями ifcfg-p2p1 и ifcfg-em0. И решил я их использовать обе на пользу. О том, как это сделать, я прочитал вот тут:
http://ru.gentoo-wiki.com/wiki/HOWTO_%CD%E0%F1%F2%F0%EE%E9%EA%E0_Bonding
http://techgurulive.com/2008/09/08/how-to-configure-bonding-in-fedora
Создаём файл /etc/modprobe.d/bonding.conf и наполняем его вот таким содержимым:
alias bond0 bonding
options bonding mode=6 miimon=100
Для себя, я решил использовать шестой режим объединения двух сетевых карт. Затем создаю файл /etc/sysconfig/network-scripts/ifcfg-bond0 и наполняю его вот таким содержимым:
DEVICE="bond0"
BOOTPROTO="none"
ONBOOT="yes"
IPADDR=192.168.0.201
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
DNS1=192.168.0.200
Сохраняю. Потом, в этом же каталоге, файл ifcfg-em0 привожу вот в такой вид:
DEVICE="em0"
HWADDR="00:1E:67:34:87:08"
BOOTPROTO="none"
ONBOOT="yes"
# NM_CONTROLLED="yes"
MASTER=bond0
SLAVE=yes
И файл ifcfg-p2p1 — в такой же идентичный вид:
DEVICE="p2p1"
HWADDR="08:00:27:7D:71:7C"
BOOTPROTO="none"
ONBOOT="yes"
# NM_CONTROLLED="yes"
MASTER=bond0
SLAVE=yes
После редактирования всех этих файлов, надо перезагрузить сервер. Когда он загрузится, то две сетевухи у нас будут работать как одна, обеспечивая бóльшую пропускную способность и отказоустойчивость.
Далее, находим файл /etc/resolv.conf и в него добавляем строчку:
nameserver 192.168.0.200
Таким образом, мы указали DNS-сервер нашей системе.
После этого, нужно обновить систему. Для начала обновим сам установщик yum:
yum -y update yum
А потом всю систему целиком:
yum -y update
Когда обновление завершится, то перезагружать систему не спешим. Сразу же подправим один конфиг, чтобы отключить SELinux. Находим файл /etc/selinux/config и в нём заменяем строчку:
SELINUX=enforcing
на:
SELINUX=disabled
И вот после этого перезагружаем систему. Кстати, если у вас после перезагрузки пропала запись о DNS-сервере в файле resolv.conf, то пропишите DNS-сервер снова, а потом дайте команду:
chattr +i /etc/resolv.conf
Это чтобы файл нельзя было изменять.
Вообще, надо сказать, что я начал статью с общей подготовки сервера, которую я уже ни раз описывал в других своих статьях. Повторяться не хочется, поэтому о том, как подкрутить sshd, настроить adcupsd, ntp и установить webmin читайте вот на этих страничках:
http://technotrance.su/index.php/moi-stati/linux-fedora/item/2-router-linux-part1
http://technotrance.su/index.php/moi-stati/linux-fedora/item/9-server-mail-ftp-jabber%20mail-gateway1
http://technotrance.su/index.php/moi-stati/linux-fedora/item/17-single-address-space
В Fedora 16 исключением станут лишь некоторые моменты, связанные с включением и запуском сервисов. Эти моменты я упомянул тут:
http://technotrance.su/index.php/moi-zametki/9-fedora-ntsysv
Однако, процесс ввода сервера в домен AD я опишу ещё раз. Прежде всего, заходим на сервер AD (у меня это win srv 2008 r2) и в оснастке DNS создаём «узел А» для нашего сервера 1с:

И обязательно ставим галочку, как это показано на скриншоте.
Далее, уже на 1с-сервере, ставим необходимые пакеты:
yum -y install samba samba-winbind samba-common samba-client samba-winbind-clients
Потом находим файл /etc/krb5.conf и приводим его вот к такому содержимому:
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
default_realm = MYDOMAIN.DOMAIN
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
[realms]
MYDOMAIN.DOMAIN = {
kdc = 192.168.0.200
admin_server = 192.168.0.200
}
[domain_realm]
.mydomain.domain = MYDOMAIN.DOMAIN
mydomain.domain = MYDOMAIN.DOMAIN
где 192.168.0.200 — это адрес контроллера домена. Регистр соблюдаем! Далее, находим файл /etc/samba/smb.conf и приводим его вот к такому виду:
[global]
log file = /var/log/samba/log.%m
socket options = TCP_NODELAY SO_SNDBUF=8192 SO_RCVBUF=8192
null passwords = yes
interfaces = p2p1
hosts allow = 192.168. 127.0.0.1
winbind uid = 50-99999999
winbind gid = 50-99999999
auth methods = winbind
winbind enum groups = yes
winbind enum users = yes
winbind use default domain = yes
name resolve order = hosts wins bcast lmhosts
case sensitive = no
dns proxy = no
server string = Linux
netbios name = 1cserv
password server = 192.168.0.200
realm = MYDOMAIN.DOMAIN
client signing = yes
local master = no
domain master = no
workgroup = MYDOMAIN
debug level = 2
security = ads
dos charset = 866
max log size = 50
os level = 0
Здесь также соблюдаем регистр! И последний файл, который надо отредактировать — это /etc/nsswitch.conf. Находим в нём следующие строчки:
passwd: files
shadow: files
group: files
initgroups: files
И правим их до такого вида:
passwd: files winbind
shadow: files
group: files winbind
initgroups: files winbind
После редактирования конфигов, надо не забыть открыть нужные порты на iptables:
-A INPUT -m state --state NEW -m udp -p udp --dport 137 -j ACCEPT
-A INPUT -m state --state NEW -m udp -p udp --dport 138 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 139 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 445 -j ACCEPT
-A INPUT -m state --state NEW -m udp -p udp --dport 631 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 631 -j ACCEPT
А уже потом надо запустить/перезапустить следующие сервисы:
service smb restart
service nmb restart
service winbind restart
И не забыть их включить в автозагрузку:
systemctl enable smb.service
systemctl enable nmb.service
systemctl enable winbind.service
Теперь получаем билет керберос:
kinit admin@MYDOMAIN.DOMAIN
Где admin — это администратор домена в AD. Появится запрос пароля доменного администратора. И после ввода пароля команда должна отработать без вывода всяких сообщений — это означает, что билет получен корректно. Потом вводим сервер 1с в домен:
net ads join -U admin
Эта команда также попросит пароль доменного админа. И при её корректной отработке должно выйти сообщение:
Using short domain name -- MYDOMAIN
Joined '1CSERV' to realm 'mydomain.domain'
После этого, перезагружаем сервер. И после его загрузки тестируем, корректно ли он зашёл в домен AD. Делаем это вот такими командами (я сразу буду показывать какой вывод после них должен быть):
wbinfo -t
checking the trust secret for domain MYDOMAIN via RPC calls succeeded
wbinfo -p
Ping to winbindd succeeded
wbinfo -u
admin
гость
krbtgt
user1
user2
user3
......и т.д. пользователи домена
wbinfo -g
компьютеры домена
контроллеры домена
администраторы схемы
администраторы предприятия
издатели сертификатов
администраторы домена
пользователи домена
гости домена
владельцы-создатели групповой политики
серверы ras и ias
группа с разрешением репликации паролей rodc
группа с запрещением репликации паролей rodc
контроллеры домена - только чтение
контроллеры домена предприятия - только чтение
.............и т.д. группы домена
id admin
uid=50(admin) gid=56(администраторы домена) группы=56(администраторы домена),57(группа с запрещением репликации паролей rodc),59(администраторы схемы),60(администраторы предприятия),61(владельцы-создатели групповой политики),62(пользователи домена)
Всё, на этом общую настройку сервера можно считать завершённой.
Этап 2. Сборка PostgreSQL и установка 1C.
После общей настройки сервера приступим к установке PostgreSQL. На сайте 1С выложены готовые rpm-пакеты уже пропатченого PostgreSQL. Но я не решился их ставить. Потому как, там же есть и src.rpm-ка, которую можно пересобрать под свою систему. На момент написания статьи, это был пакет postgresql-9.0.3-3.1C.src.rpm. Итак, приступим к его пересборке. В этом мне помогли вот эти ресурсы:
http://www.alsigned.ru/?p=329
http://bugs.etersoft.ru/show_bug.cgi?id=4458
http://www.alsigned.ru/?p=1129
Сначала установим программу rpm-build, с помощью которой и будем делать пересборку:
yum -y install rpm-build
После чего, на сервер надо скопировать postgresql-9.0.3-3.1C.src.rpm. Я такие вещи делаю через webmin в меню Others → Upload and Download. Затем, перехожу в папку, в которую скопировал и выполняю вот такую команду:
rpmbuild --rebuild postgresql-9.0.3-3.1C.src.rpm
Сразу получаю вот такую ошибку:
ошибка: Неудовлетворенные зависимости сборки:
glibc-devel нужен для postgresql-9.0.3-3.1C.x86_64
bison нужен для postgresql-9.0.3-3.1C.x86_64
flex нужен для postgresql-9.0.3-3.1C.x86_64
readline-devel нужен для postgresql-9.0.3-3.1C.x86_64
zlib-devel >= 1.0.4 нужен для postgresql-9.0.3-3.1C.x86_64
openssl-devel нужен для postgresql-9.0.3-3.1C.x86_64
pam-devel нужен для postgresql-9.0.3-3.1C.x86_64
Это значит, что перед сборкой PostgreSQL, нам надо установить недостающие вышеперечисленные пакеты. Ставим их:
yum -y install glibc-devel bison flex readline-devel zlib-devel openssl-devel pam-devel
Затем, снова пробуем выполнить предыдущую команду. И, на этот раз, получим вот такую ошибку:
1 out of 5 hunks FAILED -- saving rejects to file src/Makefile.global.in.rej
Чтобы исправить эту ошибку открываем файл /usr/lib/rpm/macros находим в нем строчку
%_default_patch_fuzz 0
и заменяем ее на
%_default_patch_fuzz 2
Потом, снова пытаемся запустить сборку постгре-скуля. И получаем очередную ошибку:
configure: error: in `/root/rpmbuild/BUILD/postgresql-9.0.3':
configure: error: no acceptable C compiler found in $PATH
Эта ошибка означает, что у нас не установлен компилятор. Поэтому, ставим пакеты, которые обычно необходимы для сборки:
yum -y install gcc gcc-c++ automake cmake make
После этого, я решил, на всякий случай, перезагрузить сервер и почистить каталог /root/rpmbuild. А потом снова пробую запустить сборку пакетов:
rpmbuild --rebuild postgresql-9.0.3-3.1C.src.rpm
На этот раз, сборка вроде пошла, но через какое-то время выходит очередная ошибка:
mchar.h:7:27: fatal error: unicode/uchar.h: No such file or directory
compilation terminated.
make[1]: *** [mchar_io.o] Error 1
make[1]: Leaving directory `/root/rpmbuild/BUILD/postgresql-9.0.3/contrib/mchar'
Решается она установкой вот этих пакетов:
yum -y install libicu libicu-devel
Потом пробуем запустить сборку снова, почистив перед этом каталог /root/rpmbuild. И после этого, всё равно, вылезет уже другая ошибка:
pg_regress: initdb failed
Examine /root/rpmbuild/BUILD/postgresql-9.0.3/src/test/regress/log/initdb.log for the reason.
Ошибка говорит о том, что надо посмотреть, что написано в логе /root/rpmbuild/BUILD/postgresql-9.0.3/src/test/regress/log/initdb.log. Заглянув в него, чётко видно следующее: initdb: cannot be run as root. Сие означает, что оказывается сборку надо запускать не от рута, а от обычного пользователя. Поэтому, создаём пользователя:
adduser admin1
passwd admin1
Логинимся в систему под созданным пользователем, и уже под ним точно такой же командой запускаем сборку. Но рано радоваться!
Сборка продвинется дальше, однако всё равно закончится вот такой ошибкой:
install: cannot stat `/usr/local/lib64/libicuuc.so.46': No such file or directory
И это, как выяснилось, он просто не может найти вот эти библиотеки: libicuuc.so.46, libicui18n.so.46 и libicudata.so.46. Тем не менее, если пройтись по системе поиском, то мы обнаружим, что все эти библиотеки есть, но находятся в каталоге /usr/lib64. Чтобы обойти проблему, мы просто сделаем вот такие символические ссылки:
ln -s /usr/lib64/libicuuc.so.46.0 /usr/local/lib64/libicuuc.so.46
ln -s /usr/lib64/libicui18n.so.46.0 /usr/local/lib64/libicui18n.so.46
ln -s /usr/lib64/libicudata.so.46.0 /usr/local/lib64/libicudata.so.46
Затем, снова запустим сборку под обычным пользователем, не забыв, при этом, почистить папку ~/rpmbuild. И вот оно! Да! Наконец то, сборка завершилась удачно!
Готовые к установке rpm-ки можно найти в каталоге ~/rpmbuild/RPMS/x86_64. Собственно, прямо от туда, их можно и установить, выполнив команду, находясь в каталоге с rpm-ками:
rpm -ivh *.rpm
Многие спросят, а зачем всё это было нужно, если уже есть готовые rpm-пакеты от 1с. Я же считаю, что postgresql, собранный под конкретно свою ОС будет работать лучше, тем более что пересобрать src.rpm, на самом деле, очень легко. Просто я специально расписал все те грабли, на которые можно наткнуться при сборке под федору. Однако, если же перед сборкой сразу провести всю необходимую подготовку, а именно:
yum -y install glibc-devel bison flex readline-devel zlib-devel openssl-devel pam-devel gcc gcc-c++ automake cmake make libicu libicu-devel
ln -s /usr/lib64/libicuuc.so.46.0 /usr/local/lib64/libicuuc.so.46
ln -s /usr/lib64/libicui18n.so.46.0 /usr/local/lib64/libicui18n.so.46
ln -s /usr/lib64/libicudata.so.46.0 /usr/local/lib64/libicudata.so.46
и в файле /usr/lib/rpm/macros поменять «%_default_patch_fuzz 0» на «%_default_patch_fuzz 2», то сборка пройдёт с первого раза. Ну, и запускать сборку надо от простого пользователя.
После установки postgresql запустим вот такую команду:
service postgresql initdb
чтобы инициализировалась база данных. Когда команда отработает, то в каталоге /var/lib/pgsql/data появятся конфигурационные файлы. После чего, можно перейти к редактированию конфига postgresql. В этом мне помогли вот эти материалы:
http://www.lissyara.su/archive/1c_8.2+postgresql
http://wiki.etersoft.ru/PostgreSQL/Optimum
Ниже буду приводить лишь те строчки, которые я менял в файле postgresql.conf:
# Дополнительный буфер между диском и процессами Postgre SQL.
# Не следует указывать слишком большой объем,
# т.к. еще существует системный Кэш, контролируемый ОС.
# Значения:
# Средний объём данных и 256–512 МБ доступной памяти: 16–32 МБ
# Большой объём данных и 1–4 ГБ доступной памяти: 64–256 МБ
shared_buffers = 128MB
# Буфер под временные объекты, в основном для временных таблиц.
# Можно установить порядка 16 МБ
temp_buffers = 8MB
# Специальная память, используется для сортировки и
# кэширования таблиц, для одного запроса.
# При задании этого параметра следует учитывать количество
# конкурентых запросов, выполняемых в один момент времени.
# При памяти 1–4Gb рекомендуется устанавливать 32–128MB
work_mem = 16MB
# Память использующаяся для операций VACUUM, CREATE INDEX,
# ALTER TABLE и FOREGIN KEY.
# Следует устанавливать большее значение, чем для work_mem.
# Слишком большие значения приведут к использованию свопа.
# При памяти 1–4Gb рекомендуется устанавливать 128–512MB
maintenance_work_mem = 32MB
# Специальный стек для сервера, в идеале он должен совпадать
# с размером стека, выставленном в ядре ОС. Установка большего значения
# чем в ядре может привести к ошибкам. Рекомендуется устанавливать 2–4MB
max_stack_depth = 2MB
# Данный параметр отвечает за сброс данных из кэша на диск при завершении
# транзакций. Если установить его значение fsync=off, то данные не будут
# записываться на дисковые накопители сразу после завершения операций.
# Это может существенно повысить скорость операций insert и update, но
# есть риск повредить базу, если произойдет сбой (неожиданное отключение
# питания, сбой ОС, сбой дисковой подсистемы). Используйте эту возможность
# только если у вас имеются надежные ИБП и программное обеспечение,
# завершающее работу системы при низком заряде батарей.
fsync = off
# Установите данный параметр в off, если fsync=off
full_page_writes = off
# Количество памяти используемое в SHARED MEMORY для ведения транзакционных
# логов. При доступной памяти 1–4GB рекомендуется устанавливать 256–1024kb
wal_buffers = 2048kB
# увеличиваем этот параметр до 16. (в своё время, когда я уже настроил сервер,
то система в логах сама просила увеличить этот параметр)
checkpoint_segments = 16
# Передает данные планировщику запросов об объеме памяти, которая используется
# ОС для кэширования файлов, для одного запроса.
# (Устанавливаем в половину оперативки)
effective_cache_size = 1024MB
# Включает или отключает использование планером ограничений CONSTRAINT в
# таблицах при построении запросов. Рекомендуется установить значение on,
# при этом, если Вы изменяете CONSTRAINT у таблиц, необходимо обновить их
# статистику выполнив ANALYZE, в противном случае будут построены неверные
# планы запросов.
constraint_exclusion = on
# указываем писать логи в системный лог
log_destination = 'syslog'
# Включать ли автовакуум, устанавливать on
autovacuum = on
# Пауза между запусками Автовакуума. Зависит от того, как часто обновляются
# данные в ваших таблицах. Может составлять порядка 5min, по умолчанию 1min
autovacuum_naptime = 3min
# Продолжительность времени в секундах между проверками на дедлок. Для загруженных серверов имеет смысл это значение увеличить. По умолчанию − 1s.
deadlock_timeout = 2s
# Количество блокировок за одну транзакцию: установить порядка 200-250
max_locks_per_transaction = 250
# Чтобы вновь создаваемые таблицы посредством клиента psql автоматически включали столбец OID.
default_with_oids = on
# Отключаем вывод предупреждений при нахождении слэша в запросе
escape_string_warning = off
После редактирования конфига пробуем запустить postgresql:
service postgresql start
Однако, он, скорей всего, не запустится и в логах выдаст примерно во такую ошибку:
[1-1] FATAL: could not create shared memory segment: Недопустимый аргумент
[1-2] DETAIL: Failed system call was shmget(key=5432001, size=148946944, 03600).
[1-3] HINT: This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter. You can either reduce the request size or reconfigure the kernel with larger SHMMAX. To reduce the request size (currently 148946944 bytes), reduce PostgreSQL's shared_buffers parameter (currently 16384) and/or its max_connections parameter (currently 104).
[1-4] #011If the request size is already small, it's possible that it is less than your kernel's SHMMIN parameter, in which case raising the request size or reconfiguring SHMMIN is called for.
[1-5] #011The PostgreSQL documentation contains more information about shared memory configuration.
Здесь надо обратить внимание на цифру 148946944. Это означает, что необходимо увеличить параметр SHMMAX в системе. Но встаёт вопрос о том, как же его правильно задать. В этом мне помогла статья, которую я нашёл сразу на двух ресурсах. Уж не знаю, кто из них первоисточник, поэтому привожу ссылки на оба этих ресурса:
http://wiki.ayac.ru/skripty/nastrojka-shared-memory
http://leopard.in.ua/2011/02/05/nastrojka-shared-memory-dlya-postgresql-sovety
Выложу этот скрипт и у себя тоже:
#!/bin/bash
# simple shmsetup script
page_size=`getconf PAGE_SIZE`
phys_pages=`getconf _PHYS_PAGES`
shmall=`expr $phys_pages / 2`
shmmax=`expr $shmall \* $page_size`
echo kernel.shmmax = $shmmax
echo kernel.shmall = $shmall
Загрузив скрипт и запустив его, я, для своего сервера, получил вот такие значения:
kernel.shmmax = 1050689536
kernel.shmall = 256516
Затем, скопировал эти строчки и добавил их в конец файла /etc/sysctl.conf. Перезагружаю сервер и снова пробую запустить postgresql. На этот раз postgresql запустился удачно.
Поэтому сразу установим пароль на пользователя postgres:
su -l postgres
psql
alter user postgres with password 'YOUR_PASSWORD';
\q
exit
Теперь настало время установить саму 1С. Копируем готовые rpm-ки в какой-нибудь каталог:
1C_Enterprise82-common-8.2.15-310.x86_64.rpm
1C_Enterprise82-server-nls-8.2.15-310.x86_64.rpm
1C_Enterprise82-common-nls-8.2.15-310.x86_64.rpm
1C_Enterprise82-ws-8.2.15-310.x86_64.rpm
1C_Enterprise82-server-8.2.15-310.x86_64.rpm
1C_Enterprise82-ws-nls-8.2.15-310.x86_64.rpm
И устанавливаем их вот такой командой:
rpm -ivh *.rpm
Обратим внимание, что в системе у нас появится пользователь usr1cv82 и группа grp1cv82, а демон 1С-сервера будет называться srv1cv82. И сама 1С-ка установилась в каталог /opt/1C. Нужно пользователя usr1cv82 сделать владельцем этого каталога, а группу grp1cv82 сделать владеющей группой этого каталога:
chown -R usr1cv82:grp1cv82 /opt/1C
Затем надо включить логи для сервера 1С. Для этого, сначала, создадим каталог для хранения логов:
mkdir /var/log/1c
chown usr1cv82:grp1cv82 /var/log/1c
А затем, в папку /opt/1C/v8.2/x86_64/conf надо поместить конфиг с названием logcfg.xml. Именно с таким названием. А содержимое конфига будет вот такое:
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="/var/log/1c/" history="168">
<event>
<eq property="name" value="EXCP"/>
</event>
<property name="all