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`