środa, 30 stycznia 2013

Bugzilla + nginx

Wszystko zaczęło się od pytań - Jaki system raportowania błędów jest najlepszy? Który mi najbardziej odpowiada? Padło na Bugzillę. Rozwiązanie - wydawałoby się - idealne dla potrzeb pojedynczego developera.

Instalacja samej aplikacji przebiegła dość sprawnie. Bugzilla została napisana w Perl'u więc do systemu musiałem doinstalować masę nowych modułów Perla gdyż nigdy go w taki sposób nie używałem. Po instalacji i radości z działającej konfiguracji przy użyciu SQLite, dość szybko okazało się że jedyny tryb w jakim Bugzilla może działać na moim serwerze to CGI. We wszystkich możliwych miejscach starałem się stosować uWSGI, w tym przypadku dążyłem do uruchomienia aplikacji na PSGI. Niestety wspierane są tylko cgi i mod_perl dla Apache. Na szczęście sam Nginx jak i uWSGI umożliwiają uruchamianie skryptów jako CGI. Niestety po skonfigurowaniu ich w taki sposób okazało się ze na otwarcie strony głównej Bugzilli trzeba czekać aż 3 sekundy (serwer nie jest aż tak słaby).

Rozpoczęła się walka :)

Google szybko odpowiedziało zgłoszeniem błędu do samej Bugzilli: https://bugzilla.mozilla.org/show_bug.cgi?id=316665 (można zwrócić uwagę że dodane zostało w 2005 roku ;) ). W zgłoszeniu znajduje się patch który umożliwia uruchomienie Bugzilli w trybie FastCGI (oraz możliwe PSGI).

Ten sam patch można znaleźć na GitHub'ie: https://github.com/Stackato-Apps/bugzilla/blob/master/psgi.patch . Po nagłówku łatki można stwierdzić że napisana została na podstawie wersji 4.0.3 (aktualnie najnowszą jest 4.2.4).

Łatka nie aplikowała się poprawnie dla najnowszej wersji więc na jej podstawie stworzyłem nową . Kolejnym krokiem było dobranie opcji dla uwsgi i uruchomienie serwisu. Aplikacja wstała - wszystko wyglądało na poprawnie działające - do chwili gdy zechciałem się zalogować. W logach zauważyłem występowanie jakiegoś błędu autentykacji "brak danych" dodatkowo strona która powinna była się wyświetlić (z informacją o niepoprawnym haśle/loginie) została ucięta w pół.

Podążając nowym tropem - brakiem danych w POST'ie po stronie serwera, szczęśliwym trafem dotarłem na kolejne zgłoszenie błędu, tym razem dla CGI-Emulate-PSGI.

Okazuje się że problemem jest właśnie to - aplikacja nie otrzymuje danych z POST'a gdy używane jest uWSGI, naprawienie tego wydaje się być proste.. ale kompletnie nie znam Perl'a :) Dochodzi jeszcze dziwny błąd obcinający stronę który może ale nie musi być związany z pierwszym.

Emulacja PSGI zastosowana w łatce używa modułów Plack'a więc została jeszcze możliwość uruchomienia aplikacji bez korzystania z uWSGI - czyli na FastCGI do którego wsparcie jest dodane do Nginx'a.

Na skróty

Czyli Bugzill'a działająca na FastCGI w szybki sposób.

  • Pobieramy kod Bugzill'i
  • Aplikujemy łatkę fastcgi
  • Konfigurujemy Bugzillę poprzez checksetup.pl
  • Konfigurujemy Nginx'a i uruchamiamy serwis Plack (pliki i komendy w dziale poniżej)

W systemach Gentoo można dodać glorpen-overlay w którym znajduje się ebuild aplikujący wspominaną wcześniej łatkę.

Końcowa konfiguracja

Dla Nginx:

#pozostałość z cgi - ale dlaczego by tego nie zostawić?
location ~ ^(.*\.(jpe?g|gif|css|js|png|ico))$ {
        alias /srv/bugzilla/app/$1;
}

location  /  {
        include        fastcgi_params;
        fastcgi_param  SCRIPT_NAME      "";
        fastcgi_pass   unix:///srv/bugzilla/fastcgi.socket;
}

Uruchomienie Plack'a:

#!/bin/bash

d="/srv/bugzilla"
plackup -s FCGI -S "${d}"/fastcgi.socket "${d}"/app/app.psgi --pid "${d}"/plackup.pid -D

i na koniec wyłączenie serwera Plack:

#!/bin/bash

kill `cat /srv/bugzilla/plackup.pid`