UMGUM.COM (лучше) 

Инсталляция Jabberd2 ( Инсталляция XMPP-сервера Jabberd2. )

17 июля 2012  (обновлено 31 января 2015)

Эта публикация отнесена в архив. Она неактуальна.

OS: Linux Debian Squeeze/Wheezy.
Application: XMPP server Jabberd2 (version 2.2.16/2.3.2).

В Linux Debian Lenny, Squeeze и Wheezy нет пакета Jabberd2 от более или менее официального "мэйнтеймера". Да если бы и был, то "свежесть" оставляла желать бы лучшего. Устанавливать и настраивать будем из исходных кодов по официальной инструкции от разработчиков, расположенной по адресу: https://github.com/Jabberd2/jabberd2/wiki/InstallGuide. С версии jabberd-2.2.9 документацию существенно переработали в сторону большей актуальности (ранее сопровождение документации у разработчиков было явно в несколько меньшем приоритете, чем модернизация программного обеспечения как такового, и порядок инсталляции и настройки иной раз уточняется методом проб и ошибок) и установка продукта прошла на этот раз "как по рельсам".


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

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

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

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

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

# aptitude install openssl libssl-dev

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

# aptitude install libidn11 libidn11-dev libexpat-dev libcppunit-dev

Инсталлируем библиотеки SASL (Simple Authentication and Security Layer - простая аутентификация и слой безопасности). Разработчики Jabberd2 поставили на GNU-SASL, полагая её боле соответствующей духу "свободного ПО", наверное; однако, если вам ближе "ценности, проверенные временем", то, возможно, вам захочется использовать более функциональные библиотеки Cyrus-SASL.

Устанавливаем пакеты GNU-SASL:

# aptitude install gsasl libgsasl7-dev

...или пакеты Cyrus-SASL:

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

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

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

# aptitude install mysql-server libmysqlclient-dev

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

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

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

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

# aptitude install checkinstall

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

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

# cd /usr/src
# wget https://github.com/downloads/Jabberd2/jabberd2/jabberd-2.2.16.tar.gz

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

# tar -xvf jabberd-2.2.16.tar.gz

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

# cd /usr/src/jabberd-2.2.16
# ./configure --no-create --help

По умолчанию Jabberd2 размещает свои исполняемые и конфигурационные файлы в группе директорий "/usr/local", в полном соответствии с политикой FHS (Filesystem Hierarchy Standard). Если это не так, то меняем "префикс" на "/usr/local" с помощью ключа "--prefix"; месторасположение конфигурационных файлов обозначаем как "--sysconfdir=/usr/local/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 пока, вроде как, лучше. Так что, применим более функциональную библиотеку на своё усмотрение, рискуя, при этом, получить проблемы при последующем обновлении программного обеспечения.

Вообще-то, если не стремится к избыточно высокому уровню защищённости процесса аутентификации просто ради достижения цели прыгнуть дальше (или глубже) всех, то можно вообще отказаться от применения SASL, удовлетворившись протоколом, встроенным в Jabberd2. На самом деле, я думаю, передачу пароля открытым текстом или в виде простого "хэша" нельзя считать уязвимостью, если заставить сервер принимать только соединения защищённые SSL/TLS. Однако, не буду принимать радикальных мер и оставлю предложенный GNU-SASL (просто никак не обозначая свой выбор), как основной из поддерживаемых методов аутентификации.

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

# cat /usr/src/jabberd-2.2.16/sx/sasl_cyrus.c

....
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. */
....

Запускаем тесты конфигурирования, пока без фиксирования результатов, просто, чтобы проверить, удовлетворены-ли все зависимости:

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

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

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

# ldconfig -p | grep mysql

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

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

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

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

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

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

# cd /usr/src/jabberd-2.2.16
# ./configure --prefix=/usr/local --sysconfdir=/usr/local/etc/jabberd --localstatedir=/var/jabberd --enable-debug --enable-mysql --enable-ssl

# checkinstall -D --install=no --pkggroup=Jabber --pkgname=jabberd2 --pkgversion=2.2.16 --pkgrelease=1 --pkgsource=https://github.com/Jabberd2/ --maintainer=admin@example.com --nodoc make install

Продолжим компиляцию. На выходе получаем пакет, можно его устанавливать:

# dpkg --install ./jabberd2_2.2.16-1_i386.deb

Применяем рекомендуемые разрешения к файлам и директориям:

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

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

Нам ещё предстоит написать управляющий скрипт, чтобы он запускал Jabberd2 при старте операционной системы сервера и позволял осуществлять перезапуск и принудительную остановку службы jabberd2. Вообще-то, разработчики уже приготовили скрипт на Perl (/usr/local/bin/jabberd), который управляет подсистемами XMPP-сервера, и даже уложили его в ряду с исполняемыми файлами самого сервера, явно позиционируя его как основной инструмент контроля, но мне показалось проще оставить этот функционал за собой. Потому, вырезаем всё ненужное, создавая своё:

# mkdir -p /usr/local/etc/jabberd/dist
# mv /usr/local/bin/jabberd /usr/local/etc/jabberd/dist
# mv /usr/local/etc/init/jabberd* /usr/local/etc/jabberd/dist
# mv /usr/local/etc/jabberd/jabberd.cfg /usr/local/etc/jabberd/dist
# mv /usr/local/etc/jabberd/*.dist /usr/local/etc/jabberd/dist
# mv /usr/local/etc/jabberd/*.conf /usr/local/etc/jabberd/dist

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

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

Учитывая то, что оригинальный конфигурационный файл менеджера сессий нам теперь не нужен, перемещаем его в архив:

# mv /usr/local/etc/jabberd/sm.xml /usr/local/etc/jabberd/dist

Создадим и приведем к следующему виду скрипт управления сервером XMPP:

# vi /etc/init.d/jabberd2 && chmod ugo+rx /etc/init.d/jabberd2

#!/bin/bash

### BEGIN INIT INFO
# Provides:          jabberd2
# Required-Start:    $local_fs $syslog $network
# Required-Stop:     $local_fs $syslog $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Script management of XMPP server Jabberd2
# Description:       Script management of XMPP server Jabberd2
### END INIT INFO

PROGS="router c2s s2s sm-jabber0.local sm-jabber1.local"
EXECS="/usr/local/bin"
CONFS="/usr/local/etc/jabberd"
PIDS="/var/jabberd/pid"
LOGS="/var/jabberd/log"

case "$1" in
  start)
    echo "Initializing jabberd2 processes ..."
    for PROG in ${PROGS}; do

      if [ $( pidof -s ${PROG} ) ]; then
        echo -e "\tprocess [${PROG}] already running"
        sleep 1
        continue
      fi

      echo -e "\tStarting [${PROG}]... "
      rm -f ${PIDS}/${PROG}.pid
      ARGS="-c ${CONFS}/${PROG}.xml"

      # Start Jabberd2 with debug logging
      # /bin/su -s /bin/bash -l jabber -c "${EXECS}/${PROG} ${ARGS} -D 2 &>> ${LOGS}/debug-${PROG}.log &" > /dev/null
      # Start Jabberd2 with simply logging
      /bin/su -s /bin/bash -l jabber -c "${EXECS}/${PROG} ${ARGS} &> ${LOGS}/debug-${PROG}.log &" >> /dev/null

      echo
      sleep 1
    done
  ;;
  stop)
    echo "Terminating jabberd2 processes ..."
    for PROG in ${PROGS} ; do
      if [ -f ${PIDS}/${PROG}.pid ]; then
        echo -e "\tStopping [${PROG}]... "
        kill $(cat ${PIDS}/${PROG}.pid)
        echo
        sleep 1
      fi
      rm -f ${PIDS}/${PROG}.pid
    done
  ;;
  restart)
    $0 stop
    sleep 3
    $0 start
  ;;
  *)
    echo "Usage: $0 {start|stop|restart}"
    exit 1
  ;;
esac

exit 0

Приведённый выше скрипт будет сыпать при работе приложений отладочными сообщениями, выдаваемыми на STDOUT (в соответствии с опцией "-D 2"), перенаправляемыми в специально создаваемые журнальные файлы. Это полезно на начальном этапе, но после - лучше отключить исправлением строки запуска, путём удаления указанной опции.

Прописываем наш скрипт для нужных уровней исполнения в системе:

# update-rc.d jabberd2 start 10 2 3 4 5 . stop 10 0 1 6 .

Запускать сервис ещё рановато, так как конфигурационные файлы не готовы совсем. Позже мы займёмся ими. А пока заранее генерируем, следуя инструкции разработчиков (http://www.jabberdoc.org/app_sslkey.html), "самоподписанный" (не имеющий подтверждения у коневых центров сертификации, но ничуть не теряющий от этого в функционале) сертификат для поддержания SSL/TLS соединений как между сервером и клиентами, так и между компонентами сервера (второе не особо нужно, так как все работает на 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 /usr/local/etc/jabberd/server.pem
# chown jabber:jabber /usr/local/etc/jabberd/server.pem
# chmod o-rwx /usr/local/etc/jabberd/server.pem

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

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

Устанавливаем приложение ротации текстовых файлов с одновременным их сжатием:

# aptitude install logrotate gzip

Создаем конфигурационный файл ротации журнальных файлов для Jabberd2:

# mkdir -p /etc/logrotate.d
# vi /etc/logrotate.d/jabberd

# шаблон указывающий объекты подлежащие "ротации"
/var/jabberd/log/*.log {
  # размер журнального файла, после которого он обрабатывается утилитой
  size 10M
  # отсутствие файла не вызывает ошибку
  missingok
  # количество хранимых отработанных резервных копий
  rotate 10
  # указание сжимать отрабатываемые резервные копии
  compress
  # указание не сжимать первую резервную копию, делать это при повторном проходе
  delaycompress
  # указание не отрабатывать пустые файлы
  notifempty
  # добавлять к наименованию файла резервной копии даты в формате "-YYYYMMDD"
  dateext
  # задать права доступа, владельца и группу создаваемого журнального файла
  create 640 jabber jabber
}

Проверяем корректность конфигурационного файла:

# logrotate -d /etc/logrotate.d/jabberd

Инсталляция Jabberd2 завершена, запуск и остановка будет производится созданным нами скриптом "/etc/init.d/jabberd2", но прежде всего следует откорректировать соответствующим образом конфигурационные файлы сервиса, чем мы и займёмся в следующих заметках.


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


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