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
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.
- Do
/etc/portage/make.conf
dodajemy wpisPHP_TARGETS="php5-3 php5-5"
- 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.
- 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 przezPHPSLOT="php5.3"
oraz komentujemy/usuwamy to co jest w instrukcjiif
. - Do głównego konfiga PHP-FPM 5.3 w
/etc/php/fpm-php5.3/php-fpm.conf
dodajemyinclude=/etc/php/fpm-php5.3/pools/* - Tworzymy katalog pools:
mkdir /etc/php/fpm-php5.3/pools
- 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" - Dodajemy nową instancję PHP do autostartu i uruchamiamy ją:
rc-update add fpm53 default ; /etc/init.d/fpm53 start
- 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;
}
} - 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
- Musimy jeszcze wprowadzić kilka zmian.
- Zmieniamy nazwę pliku config.php.inc na config.php
- Modyfikujemy
define("ENC_KEY","PleaseChangeMe");
- Uzupełniamy klucze reCAPTCHA
define("CAPTCHA_PRIVATE","");
define("CAPTCHA_PUBLIC",""); - W pliku
lib/recaptchalib.php
zmieniamyfunction recaptcha_get_html ($pubkey, $error = null, $use_ssl = false)na
function recaptcha_get_html ($pubkey, $error = null)
- 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