UMGUM.COM (лучше) 

Инсталляция Jabberd 2 ( Инсталляция Jabberd 2. )

25 марта 2010  (обновлено 1 февраля 2015)

Эта публикация отнесена в архив. Она неактуальна.
Ресурс по следующей ссылке является преемником: Инсталляция XMPP-сервера Jabberd2.

OS: Debian Lenny.

В Debian 5 (Lenny) нет пакета Jabberd2 от более или менее официального "мэйнтеймера". Да если бы и был, то "свежесть" оставляла желать бы лучшего. В случае развёртывания ответственных и стабильных сервисов, вроде серверов точного времени, DNS, веб-сервера, почтового сервера и тому подобное имеет смысл доверится профессионалам и использовать готовые пакеты; но не в нашем случае - будем ставить из исходных файлов. Устанавливать и настраивать будем по официальной инструкции от разработчиков по адресу http://jabberd2.xiaoka.com/wiki/InstallGuide. Правда, сопровождение документации у разработчиков явно в несколько меньшем приоритете, чем модернизация программного обеспечения как такового, и порядок инсталляции и настройки иной раз уточняется методом проб и ошибок; лично у меня в трёх случаях установки jabberd2 за последние два года последовательность действий каждый раз отличалась, да ещё и имелась возможность решить проблемы при инсталляции в нескольких вариантах. Конфигурационные файлы в формате XML спасают ситуацию своей "говорящей" структурой и вкрапленными комментариями.

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

# groupadd jabber
# useradd --home-dir /var/jabber --shell /bin/false --gid jabber jabber

Создаем директории, необходимые для работы jabberd2, и приводим в соответствие права доступа к ним:


# mkdir -p /var/jabberd/pid
# chown -R jabber:jabber /var/jabberd/pid
# mkdir -p /var/jabberd/log
# chown -R jabber:jabber /var/jabberd/log

Инсталлируем openssl:

# aptitude install openssl libssl-dev

Инсталлируем библиотеки Cyrus-SASL (Simple Authentication and Security Layer - простая аутентификация и слой безопасности):

# aptitude install libsasl2-2 libsasl2-dev libsasl2-modules-gssapi-heimdal

Если я верно все понял, то библиотека SASL используется Jabberd2 в качестве прослойки для аутентификации и идентификации подключающихся клиентов, как модуль, исходя из данных, размещённых в устройстве хранения (в нашем случае - базе MySQL), в соответствии с общим принципом модульного решения сервера.

Устанавливаем необходимые библиотеки, свежие версии:

# aptitude install libidn11-dev libexpat-dev

Устанавливаем СУБД MySQL:

# aptitude install mysql-server libmysqlclient15-dev

С MySQL сервером потянется клиент и необходимые библиотеки.

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

# aptitude install checkinstall

На свежеустановленной системе инсталлятор потянет, кроме указанных продуктов, ещё как минимум, build-essential, bzip, dpkg-dev, g++, make.

Скачиваем пакет исходных кодов с сайта разработчиков Jabberd2 (на данный момент версия 2.2.9):

# cd /usr/src
# wget http://codex.xiaoka.com/pub/jabberd2/releases/jabberd-2.2.9.tar.bz2

Распаковываем архив:

# tar -xvf jabberd-2.2.9.tar.bz2

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

# cd /usr/src/jabberd-2.2.9

Поинтересуемся, не придумали ли разработчики чего нового, нет ли несовместимых с прежней конфигурацией ключей:

# ./configure --no-create --help

По умолчанию Jabberd2 размещает свои исполняемые и конфигурационные файлы в группе директорий "/usr/local". Мы в Debian, где такое не принято, так что меняем "префикс" на "/usr" с помощью ключа "--prefix=/usr", месторасположения конфигурационных файлов обозначаем как "--sysconfdir=/etc/jabberd" и месторасположения логов определяем с помощью ключа "--localstatedir=/var/jabberd".
Особое внимание обращаем на ключ "--with-sasl=cyrus"; указанный ключ инициирует замену библиотеки GNU-SASL (gsasl), применённой в последних версиях программного обеспечения проекта Jabberd2 по умолчанию в качестве "прослойки" простой аутентификации и защиты процесса аутентификации, на Cyrus-SASL (cyrus-sasl). GNU-SASL разрабатывается практически в любительском порядке, в отличии от Cyrus-SASL, которой занимается университетская команда; насколько я понял, в текущей версии GNU-SASL часть необходимого функционала ещё не реализована или не в полной мере поддерживается. С одной стороны разработчики Jabberd2 отказались от применения Cyrus-SASL, но, с другой стороны, Cyrus-SASL пока, вроде как, лучше. Так что, применим более функциональную библиотеку на своё усмотрение, рискуя, при этом, получить проблемы при последующем обновлении программного обеспечения.

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

Поиск библиотек можно произвести с помощью следующей команды (пример для MySQL, установленного в отличное от принятого в текущей версии дистрибутива место):

# ldconfig -p | grep mysql

Ключ конфигуратора, указывающие на места расположения искомых заголовочных файлов:

--with-extra-include-path=/usr/include/mysql:/usr/include

Ключ конфигуратора, указывающие на места расположения искомых библиотек:

--with-extra-library-path=/usr/lib/mysql:/usr/lib

# ./configure --no-create --enable-mysql --enable-ssl --with-sasl=cyrus --enable-debug --prefix=/usr --sysconfdir=/etc/jabberd --localstatedir=/var/jabberd

Первая проблема из тех, что нельзя решить установкой свежих версий библиотек из дистрибутива Debian 5. В Debian Lenny нет библиотеки libudns. Совсем. Можно компилировать из исходного кода с сайта разработчиков http://www.corpit.ru/mjt/udns.html, а можно взять готовые пакеты:

# cd /usr/src
# wget http://www.corpit.ru/mjt/udns/libudns0_0.0.9_i386.deb
# wget http://www.corpit.ru/mjt/udns/libudns-dev_0.0.9_i386.deb
# dpkg -i ./libudns0_0.0.9_i386.deb
# dpkg -i ./libudns-dev_0.0.9_i386.deb

Возвращаемся в директорию с исходными кодами Jabberd2 и продолжаем тесты конфигурирования до удачного исхода:

Когда тестирование конфигурации завершено успешно - конфигурируем пакет исходного кода:

# cd /usr/src/jabberd-2.2.9
# ./configure --enable-mysql --enable-ssl --with-sasl=cyrus --enable-debug --prefix=/usr --sysconfdir=/etc/jabberd --localstatedir=/var/jabberd

# checkinstall -D --install=no --pkggroup=Jabber --pkgname=jabberd2-under-cyrussasl --pkgversion=2.2.9 --pkgrelease=1 --pkgsource=http://codex.xiaoka.com/pub/jabberd2 --maintainer=me@domain.name --nodoc make install

Очередное развлечение; прямо в исходных скриптах указание на то, что их нужно подправить, чтобы продолжить исполнение компиляции. Разработчики не поддерживают более реализации Cyrus-SASL, но оставляют возможность использовать её "смелым":

sasl_cyrus.c:23:2: error: #error Cyrus SASL implementation is not supported! It is included here only for the brave ones, that do know what they are doing. You need to remove this line to compile it.
make[1]: *** [sasl_cyrus.lo] Error 1

Что тут скажешь - делаем. Удалять строку не будем, а комментируем до следующего вида (вдруг ещё пригодится):

/* sasl_cyrus.c:23:2: error: #error Cyrus SASL implementation is not supported! It is included here only for the brave ones, that do know what they are doing. You need to remove this line to compile it. */

На выходе получаем пакет, можно его устанавливать:

# dpkg -i jabberd2-under-cyrussasl_2.2.9-1_i386.deb

Применяем рекомендуемые разрешения к файлам и директориям. В инструкции от разработчиков зачем-то указан собственником конфигурационных файлов пользователь "root"; мне непонятно, зачем такое и мы зададим владельцем пользователя "jabber":

# chown -R jabber:jabber /etc/jabberd
# chmod -R o-rwx /etc/jabberd

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

Нам ещё предстоит написать управляющий скрипт, чтобы он запускал Jabberd2 при старте операционной системы сервера и позволял осуществлять перезапуск и принудительную остановку службы jabberd2.

Выше мы заметили себе, что будем работать с несколькими доменными именами. В Jabberd2 это реализовано запуском индивидуального менеджера сессий "sm" для каждого доменного имени. Мы достигнем этого созданием индивидуального конфигурационного файла менеджера сессий для каждого домена именуя их по принципу: "sm-domain.name.xml". Для очевидной работы скрипта управления сервисами Jabberd2, что нам предстоит написать, создадим символические ссылки на исполняемый файл менеджера сессий, именуя его аналогично тому, как мы это сделали для конфигурационных файлов: "sm-doamin.name":

# cp /etc/jabberd/sm.xml /etc/jabberd/sm-jabber.local.xml
# cp /etc/jabberd/sm.xml /etc/jabberd/sm-jabber1.local.xml
# ln -s /usr/bin/sm /usr/bin/sm-jabber.local
# ln -s /usr/bin/sm /usr/bin/sm-jabber1.local

Создадим и приведем к следующему виду исполняемый файл "/etc/init.d/jabberd2.sh":

#!/bin/bash

progs="router sm-jabber.local sm-jabber1.local c2s s2s"
progsPath="/usr/bin"
confPath="/etc/jabberd"
pidPath="/var/jabberd/pid"
logPath="/var/jabberd/log"

case "$1" in
  start)
    echo "Initializing jabberd2 processes ..."
    for prog in ${progs}; do
      if [ $( pidof -s ${prog} ) ]; then
        echo -ne "\tprocess [${prog}] already running"
        sleep 1
        continue
      fi
      echo -ne "\tStarting ${prog}... "
      rm -f ${pidPath}/${prog}.pid
      args="-c ${confPath}/${prog}.xml"
      # sudo -u jabber ${progsPath}/${prog} ${args} -D 2 &> ${logPath}/debug${prog}.log &
      /bin/su -s /bin/bash -l jabber -c "${progsPath}/${prog} ${args} -D 2 &> ${logPath}/debug${prog}.log &" > /dev/null
      echo
      sleep 1
    done
  ;;
  stop)
    echo "Terminating jabberd2 processes ..."
    for prog in ${progs} ; do
      if [ -f ${pidPath}/${prog}.pid ]; then
        echo -ne "\tStopping ${prog}... "
        kill $(cat ${pidPath}/${prog}.pid)
        echo
        sleep 1
      fi
      rm -f ${pidPath}/${prog}.pid
    done
  ;;
  restart)
    $0 stop
    sleep 3
    $0 start
  ;;
  *)
    echo "Usage: $0 {start|stop|restart}"
    exit 1
  ;;
esac

exit 0

Приведённый выше скрипт будет сыпать при работе приложений отладочными сообщениями в специально создаваемые лог файлы. Это полезно на начальном этапе, но после - лучше отключить исправлением строки "/bin/su -s /bin/bash -l jabber -c "${progsPath}/${prog} ${args} -D 2 &> ${logPath}/debug${prog}.log &" > /dev/null" до следующего вида:

/bin/su -s /bin/bash -l jabber -c "${progsPath}/${prog} ${args} &" > /dev/null

Для того, чтобы наш управляющий скрипт отрабатывался при исполнении операционной системой "run level" разных уровней, создаем соответствующие символические ссылки (думаю, что этих трёх уровней хватит):

# ln -s /etc/init.d/jabberd2.sh /etc/rc3.d/S85jabberd2.sh
# ln -s /etc/init.d/jabberd2.sh /etc/rc4.d/S85jabberd2.sh
# ln -s /etc/init.d/jabberd2.sh /etc/rc5.d/S85jabberd2.sh

Стоит обратить внимание на то, чтобы мы не заняли уже используемый порядковый номер, определяющий очерёдность запуска скриптов в директории. В нашем случае номер "85" оказался не занятым.

Запускать сервис рановато, так как конфигурационные файлы не готовы совсем.

Заранее генерируем, следуя инструкции разработчиков, "самоподписанный" (не имеющий подтверждения у коневых центров сертификации, но ничуть не теряющий от этого в функционале) сертификат для поддержания SSL соединений как между сервером и клиентами, так и между компонентами сервера (второе не особо нужно, так как все работает на localhost, но - пусть будет):

# cd /tmp
# openssl req -new -x509 -newkey rsa:1024 -days 3650 -keyout privkey.pem -out server.pem
# openssl rsa -in privkey.pem -out privkey.pem
# cat privkey.pem >> server.pem
# rm privkey.pem
# mv server.pem /etc/jabberd/server.pem
# chown jabber:jabber /etc/jabberd/server.pem
# chmod o-rwx /etc/jabberd/server.pem

Выше приведёнными командами генерируем ключ, применяем команду для удаления ключевой фразы из закрытого ключа, объединяем закрытый и открытые ключи, удаляем закрытый ключ, перемещаем готовый ключ на место, ему соответствующее и с применением требуемых прав доступа. В процессе конфигурирования сервиса Jabberd2 мы воспользуемся этим ключём.

Инсталляция Jabberd2 завершена, запуск и остановка производится созданным нами скриптом "/etc/init.d/jabberd2.sh"


Заметки и комментарии к публикации:


Оставьте свой комментарий ( выразите мнение относительно публикации, поделитесь дополнительными сведениями или укажите на ошибку )