Przydługi wstęp

Wcześniej, w temacie o zmianach, poruszałem temat Ejabberda. Oczywiście nie mogłem się zadowolić instalacją ejabberda z portage tylko musiałem udziwniać. Mój serwer XMPP miał mieć kilka dodatków niedostępnych domyślnie w wersji z portage, więc trzeba było kompilować wszystko ze źródeł. No i wszystko byłoby pięknie ładnie gdyby nie to, że utknąłem w jednym miejscu. Poległem przy konfiguracji Jorge czyli webowego frontendu dla mod_logdb. Po krótkiej wymianie maili z Panem Zbyszkiem i próbą przeanalizowania logów/crash dumpów ejabberda doszedłem do wniosku, że nie tyle sam Jorge co mod_xmlrpc coś nie bangla… No i zaczęło się główkowanie. Reinstalacja erlanga, przebudowanie całego ejabberda – nic nie działało. Zaczynałem już tracić nadzieje, że coś z tego będzie. Już rozglądałem się za alternatywnym serwerem XMPP, ale żaden nie spełniał moich wymagań. A jak już znalazłem – bleeding edge prosody, to okazało się, że XEP-0313 nie jest, w pełni i poprawnie, obsługiwany przez żadnego klienta… Całkowicie zdesperowany stwierdziłem, że spróbujemy przerzucić się na ejabberd_xmlrpc. Niestety to też nie działało (listener nie chciał się podnieść). Po zainstalowaniu ejabberd_xmlrpc, postanowiłem ostatni raz włączyć mod_xmlrpc i sprawdzić jak się zachowa serwer… I tu moje zdziwienie ejabberd się podniósł! Nie sypał żadnymi błędami!! No to wiele się nie zastanawiając odpaliłem w przeglądarce adres jorge i… Jeszcze większy szok!!! Jorge działa!!!!!

Ejabberd_xmlrpc

W sumie nie wiem dlaczego od razu nie zainstalowałem ejabberd_xmlrpc, w końcu na stronie mod_xmlrpc jest wyraźnie naipsane: Requirements: ejabberd 1.1.2 or newer, and XML-RPC-Erlang 1.13 with IP, Ruby and Xmerl 1.x patches (you can get it compiled for Erlang R12 or R13)Cóż ślepota nie boli tylko trzeba się nachodzić/zapłacić/powkurzać :)

Przejdźmy zatem do sedna. Czyli zainstalujmy ejabberd_xmlrpc

cd /usr/local/src/
wget https://www.ejabberd.im/files/contributions/xmlrpc-1.13-ipr2.tgz
tar xvf xmlrpc-1.13-ipr2.tgz
cd xmlrpc-1.13/src
make
cp ../ebin/* /lib/ejabberd/ebin/

Jorge

Projekt jest już w sumie dość stary, ostatnia aktualizacja w 2010 roku, ale działa sprawnie. Jedyny minus, który od razu rzuca się w oczy to to, że nie bardzo pragnie współdziałać z PHP 5.5, ale na PHP 5.3 działa ładnie. W samym Jorge do zmiany jest kilka linijek. “Trudniejszą” sprawą jest odpalenie 2 wersji PHP-FPM jednocześnie ale i to daje się zrobić. Zakładam, że domyślnie korzystasz z najnowszego PHP więc skupimy się na doinstalowaniu drugiej instancji PHP i jej uruchomieniu.

  1. Do /etc/portage/make.conf dodajemy wpis PHP_TARGETS="php5-3 php5-5"
  2. Instalujemy drugą wersje PHP po prostu wydając polecenie:
    emerge dev-lang/php

    PHP musi być skompilowane z obsługą gd, mcrypt i xmlrpc więc w razie konieczności należy zmienić flagi dla PHP.

  3. Kopiujemy skrypt startowy php pod nową nazwę
    cp /etc/init.d/php-fpm /etc/ini.t/fpm53

    W pliku zmieniamy funkcję set_phpvars. Linijkę PHPSLOT=${SVCNAME#php-fpm-} zastępujemy przez PHPSLOT="php5.3" oraz komentujemy/usuwamy to co jest w instrukcji if.

  4. Do głównego konfiga PHP-FPM 5.3 w /etc/php/fpm-php5.3/php-fpm.conf dodajemy
    include=/etc/php/fpm-php5.3/pools/*
  5. Tworzymy katalog pools:
    mkdir /etc/php/fpm-php5.3/pools
  6. W katalogu pools tworzymy poola dla PHP, np takiego
    [webapps]
    listen = /var/run/webapps-fpm53.sock
    listen.owner = webapps
    listen.group = webapps
    listen.mode = 0666
    user = webapps
    group = webapps
    pm = ondemand
    pm.start_servers = 0
    pm.max_children = 2
    pm.max_requests = 1024
    env[TMP] = /tmp
    env[TMPDIR] = /tmp
    env[TEMP] = /tmp
    php_value[short_open_tag] = "On"
    ;php_value[display_errors] = "On"
    ;php_value[error_reporting] = "E_ALL"
    php_value[date.timezone] = "Europe/Warsaw"
  7. Dodajemy nową instancję PHP do autostartu i uruchamiamy ją:
    rc-update add fpm53 default ; /etc/init.d/fpm53 start
  8. Przygotowujemy vhosta dla jorge. Ja standardowo używam NGiNX więc u mnie wygląda to tak:
    server {
    listen IP:80;
    server_name jorge.domena;
    root /var/www/jorge;
    access_log /var/log/nginx/jorge/access.log main;
    error_log /var/log/nginx/jorge/error.log info;
    client_max_body_size 5M;
    index index.php index.html;
    location = /favicon.ico {
    log_not_found off;
    access_log off;
    error_log off;
    }
    location / {
    try_files $uri $uri/ /index.php?$args;
    }
    location ~ \.php$ {
    include fastcgi.conf;
    fastcgi_pass unix:/var/run/webapps-fpm53.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
    }
  9. Przenosimy/kopiujemy uprzednio pobrany katalog z jorge do DOCROOT’a i zmieniamy ownera
    mv /usr/local/src/jorge/ /var/www && chown -R webapps:webapps /var/www/jorge
  10. Musimy jeszcze wprowadzić kilka zmian.
    1. Zmieniamy nazwę pliku config.php.inc na config.php
    2. Modyfikujemy
      define("ENC_KEY","PleaseChangeMe");
    3. Uzupełniamy klucze reCAPTCHA
      define("CAPTCHA_PRIVATE","");
      define("CAPTCHA_PUBLIC","");
    4. W pliku lib/recaptchalib.php zmieniamy
      function recaptcha_get_html ($pubkey, $error = null, $use_ssl = false)

      na

      function recaptcha_get_html ($pubkey, $error = null)
  11. Resetujemy NGiNX i cieszymy się działającym Jorge

Podsumowanie

No działa wszystko co było zaplanowane. Walcząc z ejabberdem doszedłem do wniosku, że to jednak nie wszytko co będę chciał mieć… W planach jest uruchomienie JMC- Jabber Mail Component oraz transporty do MSN i ewentualnie GG. No cóż, w takim układzie pozostała już tylko migracja z jabstera na własne śmiecie ;) Postaram się przygotować repo SVNa z przygotowanymi i już spatchowanymi źródłami ejabberda oraz (jeśli wiedzy, cierpliwości i czasu wystarczy) przygotuję jorge do poprawnego działania z PHP 5.5.

No to bierzcie i korzystajcie z tego wszyscy spragnieni własnego serwera XMPP.

P.S.
Do kompilacji Ejabberd 2.1.x wersja Erlanga nie może być wyższa niż 15.2.x, przy próbie kompilacji z Erlangiem 17.x powita nas piękny komunikat o braku libów do tls/ssl (mimo ich obecności). W związku z tym musimy zamaskować nowsze wersje erlanga

echo ">dev-lang/erlang-15.2.3.1" >> /etc/portage/package.mask

WykopShare