poniedziałek, 20 września 2010

Ruby on Rails i klaster po indiańsku ;-)

Zacznę od tego, że winienem wszystkim, którzy czytali mój tutorial o początkach pracy z JRuby on Rails, kilka wyjaśnień. Trochę już napisałem we wcześniejszych postach, więc tutaj tematykę rozwinę (o ile mi się uda ją rozwinąć).

Otóż zrezygnowałem z Ruby'ego implementowanego na platformie Java nie dlatego, że okazał się do bani, lecz z zupełnie innego powodu. Otóż pracując z JRuby on Rails niejednokrotnie borykałem się z problemem niekompatybilności różnych wersji gemów (głównie rack, ale i innych paczek) a to z potężnym Glassfishem, a to z jego wersją deweloperską, stworzoną specjalnie do pisania i testowania aplikacji JRoR (glassfish-gem). Pomijam oczywiście fakt, że musiałem ciągle używać JRE/JDK w wersji 1.6.0_17, podczas gdy mamy już 1.6.0_21... Ale na nowszych Glassfish 3.0 (takiego używałem) padał na kolana. Przynajmniej u mnie, ale z tego, co czytałem, nie byłem jedynym użytkownikiem z tym problemem. Wszystko to przekładało się na konieczność testowania każdej istniejącej aplikacji po uaktualnieniu Rails i innych składników, ale jakoś sobie radziłem. Kolejny element to zmiana platformy roboczej - przeszedłem na Linuksa, a w związku z tym zamieniłem świetny SQL Server 2008 na MySQL (głównie ze względu na popularność tego ostatniego). Mogłem pozostać przy SQL Serverze, ale wiązało by się to z pracą z systemem Windows na maszynie wirtualnej, co raczej nie jest wygodne, jeśli nie jest konieczne :-) Owszem, w Linuksie wszystko działa, ale oprócz potężnego Glassfisha, jednego z najlepszych serwerów w swojej klasie, mamy do dyspozycji dużo lżejszego apache'a, który - w połączeniu z mongrelem - bardzo sprawnie serwuje aplikacje RoR. No i jest najpopularniejszym serwerem WWW. Tym bardziej zacząłem skłaniać się ku serwerowi apache, że Glassfish w środowisku produkcyjnym ma sens jedynie w przypadku, gdy jest optymalnie wykorzystany (J2EE!), a nie tylko do obsługi serwisów JRoR. Stąd, mając na uwadze oszczędność mocy i nie wytaczanie działa przeciwko pchle, zmieniłem zaplecze na natywnego Ruby, serwer mongrel z pakietem mongrel_cluster i starego, poczciwego apacza.

Jednak dwóch rzeczy nie zmieniłem na pewno:
  • po pierwsze zdania na temat JRuby on Rails i serwera Glassfish (tzn. że są świetnymi narzędziami); pod warunkiem, że - jak pisałem wyżej - Glassfish nie jest "stawiany" tylko dla aplikacji JRoR;
  • po drugie środowiska programistycznego - nadal pracuję w NetBeans (teraz w wersji 6.9.1).

To tyle w temacie nagłej "zmiany światopoglądu" :-)

A teraz wracam do wątku zasadniczego.


Napisałem sobie na próbę aplikację Rails, która ma mi pomóc w pracy (prezentuje informację o sprawozdaniach z ćwiczeń i uczniach, którzy już je oddali, ocenach itd. itd.). Oczywiście w nowym środowisku (Ruby 1.9, Rails 2.3.9, mongrel 1.2.0.pre2, mongrel_cluster 1.0.6, MySQL, apache). I tak: z poziomu NetBeans, jak i za pomocą polecenia script/server wszystko działało idealnie. No, może nie do końca - brakowało polskich znaków, więc:
  • skonfigurowałem MySQL do obsługi kodowania UTF-8 (Google i podręczniki do MySQL online)
  • zainstalowałem gema magic_encoding, za pomocą którego dodałem komentarz (podobny do tego w Pythonie) na początku każdego z plików źródłowych aplikacji informujący o zastosowanym kodowaniu ("# -*- encoding: utf-8 -*-")
OK, polskie znaki ruszyły. Potem nadszedł czas na wdrożenie aplikacji w środowisku produkcyjnym. Nie będę opisywał przygód po kolei, ważne, że się udało. Ale:
  • oczywiście przeczytałem instrukcję, co i jak zrobić (np. tutaj)
  • dodałem parę "łatek" na sterownik dla MySQL (link) i dla mongrela (dyskusja, link, plik mongrel.rb musi być skopiowany do katalogu config/initializers aplikacji)
  • napisałem własny skrypt uruchomieniowy i podpiąłem pod odpowiednie /etc/rcX.d (link)
  • a potem (bo przecież nie zadziałało...) dopisałem dwie linie w pliku config/environments.rb mojej aplikacji:
Encoding.default_external="UTF-8"
Encoding.default_internal="UTF-8"
  • w międzyczasie kilkukrotnie restartowałem system, bo - wyobraźcie sobie - po zrestartowaniu samego mongrela i klastra wszystko zawsze działało, a po restarcie systemu już nie (można by znaleźć rozwiązanie, ale mi się nie chciało)... 
  • ile się naprzeklinałem, to moje ;-)
W każdym razie od wczoraj aplikacja wymiata. Tym samym doszedłem dokładnie do tego punktu, w którym byłem używając Glassfisha i JRoR z tym, że proces uruchamiania serwerów i samej aplikacji jest teraz dużo krótszy, no i nie ma strat mocy :-) No i (2) jest bardziej linuksowo, a o to przecież chodziło.

O dodatkach, które musiałem zastosować, żeby aplikacja produkcyjna ruszyła, napisałem głównie dla tych, którzy czytali mój tutorial i chcieliby równie łatwo wdrażać aplikacje w natywnym Ruby on Rails na apache'u, jak w JRuby on Rails na Glassfishu. I żeby nie musieli szukać zbytnio, choć wujek Google jest szalenie cierpliwy :-)

wtorek, 7 września 2010

środa, 1 września 2010

Ruby 1.9.2 i przygód kilka...

Ponieważ repozytoria Ubuntu 10.04 są dosyć biedne jeśli chodzi o świeże wersje różnych programów, czasem trzeba sięgnąć po źródła. Rozczarowany ograniczeniami Ruby 1.8.7 dostarczanego przez repozytoria Ubuntu usunąłem go wraz z całą "świtą" pakietów (bezustannie dziwię się, dlaczego wszystko jest tak rozdrobnione w repozytoriach, podczas gdy w źródłach mamy all-in-one; czasem mam obawy, że wyrzucam coś, co może być gdzieś potrzebne), pobrałem sobie źródła wersji 1.9.2, przekompilowałem i szafa gra. Choć od razu pojawiły się problemy - o ile Rails 2.3.8 zostały poprawnie zainstalowane (plus jeszcze parę innych dodatków), mongrel wszedł jak nóż w masło, mongrel_cluster tak samo, o tyle okazało się, że ani sam mongrel, ani mongrel_cluster nie mogą pracować razem, ani też pod kontrolą Ruby 1.9... Już chciałem robić downgrade Ruby'ego, gdy znalazłem w serwisie github.com repozytoria źródeł nowych wersji obu wspomnianych pakietów. Po przebudowaniu "dżemów" i ich zainstalowaniu wszystko, co zostało opisane na stronach:
(z małymi przeróbkami - wszak każdy system ma jakieś tam swoje "cechy osobiste") zadziałało. Pozostaje tylko jeszcze uzupełnić skrypty startowe Ubuntu tak, żeby klaster uruchamiał się przed startem apache.
Repozytoria, o których wspominałem (to dla chcących się bawić):
Mongrela w wersji 1.2.0 beta można też zainstalować poleceniem:

gem install mongrel --pre

    Pożegnanie z Glassfishem i JRuby on Rails

    Tytuł straszny, ale nie jest tak źle. Po prostu wracam do Railsów bazujących na natywnym Ruby i do serwera Mongrel, tym bardziej, że do celów produkcyjnych można wykorzystać starego dobrego indianina. Wiem, że nie jest to odkrywcze, ale znalazłem bodaj jedyną sensowną metodę udostępniania aplikacji RoR poprzez właśnie serwer apache. Opis tej metody można znaleźć tutaj: Apache + JRuby + Rails + GlassFish = Easy Deployment!.
    Wcześniej żadna ze sztuczek nie skutkowała, ta zaś zaczyna działać w środowisku natywnym Ruby (trzeba ją troszkę doszlifować), mimo, że opis dotyczy JRoR. Poza tym - jak by nie było - apache jest dużo lżejszym serwerem, niż Glassfish, a instalowanie i obsługa tak potężnego narzędzia, jakim jest Glassfish, tylko po to, żeby serwować na nim aplikacje RoR jednak nie do końca ma sens. Chyba, że ktoś uruchamia jeszcze na nim javowskie aplikacje sieciowe.
    Kolejny powód rezygnacji z tego serwera, to wieczne problemy z kompatybilnością gemów i kolejnych wersji J2SE - od początku musiałem kombinować, jak postawić w miarę stabilną platformę serwerową i uniknąć niespodzianek (zresztą pisałem już o tym). Każdy upgrade gemów wiązał się z testowaniem wszystkich aplikacji i kombinowaniem, co się "sypie". Stwierdziłem więc, że szkoda mi na to czasu. Jednak - żeby nie było nieporozumień - sam Glassfish to potężne i IMHO niezastąpione narzędzie jeśli chodzi o szeroko pojęte, wydajne serwery aplikacyjne. Tylko z JRubym i Railsami coś się nie bardzo dogadują bez kilku zabiegów.
    Być może jeszcze wrócę do Glassfisha i JRoR - nigdy nie powinno się mówić "nigdy". Tymczasem dziękuję wszystkim, którzy pomogli mi w bojach (zwycięskich!) z kombinacją Glassfish + JRoR.

    Dodano później:
    Znalazłem jeszcze taki opis: Ruby on Rails - Apache - Mongrel autorstwa Pawła Kraszewskiego. Zapowiada się bardzo ciekawie.