Problem z Phusion Passenger

Witajcie,

Mam problem z modułem Phusion Passenger pod Apache2. Po uruchomieniu aplikacji Rails otrzymuje poniższy błąd.

[code]Ruby (Rack) application could not be started
A source file that the application requires, is missing.

* It is possible that you didn't upload your application files correctly. Please check whether all your application files are uploaded.
* A required library may not installed. Please install all libraries that this application requires.

Further information about the error may have been written to the application’s log file. Please check it in order to analyse the problem.

Error message:
no such file to load – bundler
Exception class:
LoadError
Application root:
/home/slawek/RailsApp/firneo
Backtrace:
# File Line Location
0 lib/rubygems/custom_require> 29:in require' 1 lib/rubygems/custom_require> 29:inrequire’
2 /home/slawek/.rvm/gems/ruby-1.9.2-p0/gems/passenger-2.2.15/lib/phusion_passenger/utils.rb 221 in setup_bundler_support' 3 /home/slawek/.rvm/gems/ruby-1.9.2-p0/gems/passenger-2.2.15/lib/phusion_passenger/rack/application_spawner.rb 105 inblock in run’
4 /home/slawek/.rvm/gems/ruby-1.9.2-p0/gems/passenger-2.2.15/lib/phusion_passenger/utils.rb 323 in report_app_init_status' 5 /home/slawek/.rvm/gems/ruby-1.9.2-p0/gems/passenger-2.2.15/lib/phusion_passenger/rack/application_spawner.rb 87 inrun’
6 /home/slawek/.rvm/gems/ruby-1.9.2-p0/gems/passenger-2.2.15/lib/phusion_passenger/rack/application_spawner.rb 65 in `block in spawn_application’
…[/code]
Jak mogę to rozwiązać ?

No gemów mu brakuje wygląda na to, a na pewno krzyczy o brak bundlera

gem install bundler ??

bundler jest.
gem install bundler nie pomogło
gem install bundler --pre tez nie pomogło

Ale czy zainstalowałeś gem bundler globalnie? Jeśli nie to odpalając z innego usera aplikację nie widzisz gemów innych userów (czyli tych instalowanych bez uprawnień roota).

Zatem sprawdź: sudo gem install bundler.

Sprawdź w configu apacha z jakiego rubiego korzysta passenger i jakiego masz w linii poleceń.

a

[quote]Application root:
/home/slawek/RailsApp/firneo[/quote]
nie powinno być

[quote]Application root:
/home/slawek/RailsApp/firneo/public[/quote]
?
W ustawieniach apacha oczywiście.

po pierwsze sprawdziłbym prawa plików aplikacji rails. Ustawa chown www-data:www-data na caly katalog
po drugie passenger nie lubi config.ru => na serverze produkcyjnym go usun
komunikat wskazuje ze ruby jest prawidlowy(w koncu skrypt probowal sie wykonac)… ale dla swiętego spokoju polecam zainstalwoanie via rvm najnowszego ree zamiast 1.9.2
po instalacji ree zainstaluj na nowo wszystkie gemy wlacznie z bundlerem

w configu apache cos w stylu:
DocumentRoot “/home/slawek/RailsApp/firneo/public”
RailsEnv production
RailsAllowModRewrite off
<directory “/home/slawek/RailsApp/firneo/public”>
Order allow,deny
Allow from all

no i… cos jeszcze ale teraz sobie nie moge przypomniec czemu ostatnio mialem podobny problem :slight_smile:

edit: a jeszcze po instalacji gemow, jak zainstalujesz juz passenger-mod

wyswietl plik :/etc/apache2# cat apache2.conf

sprawdz czy podane lokalizacje są mniej więcej takie… (domyślne są przeważnie złe) tutaj Debian Lenny:

LoadModule passenger_module /usr/local/rvm/gems/ree-1.8.7-2010.02/gems/passenger-2.2.15/ext/apache2/mod_passenger.so
PassengerRoot /usr/local/rvm/gems/ree-1.8.7-2010.02/gems/passenger-2.2.15
PassengerRuby /usr/local/bin/passenger_ruby

ps. instaluj ree z root-a bo pewnie bedziesz potrzebowal budowac native extension dla open-ssl albo czegos w tym stylu, wiec w systemie tez dobrze miec juz zainstalowane ruby 1.8.x z bibliotek dla danego distro

O shit, pirat poleciał ostro.

Nie, nie usuwaj config.ru. Jeśli Twoja aplikacja napisana jest w Ruby 1.9.2 to zapewne nie będzie działać w Ruby Enerprise Edition. Budowanie jako root również nie jest konieczne aby zainstalować Ruby z wymaganymi bibliotekami, wystarczy je zainstalować.

Jednakże dziwny wydaje mi się fakt, żę instalujesz Ruby w katalogu danego użytkownika. Prawdopodobnie będziesz miał więcej niż 1 aplikację na swoim serwerze. W takim wypadku najlepiej zainstalować Ruby gdzieś w systemie, a każdą aplikację wdrażać własnym koncie użytkownika. W ten sposób jedna aplikacja nie będzie mogła modyfikować plików innej, zabezpieczysz się przed ewentualnymi problemami spowodowanymi jedną, ale podatną na włamania aplikacją.

Wracając do sedna, zainstaluj Ruby globalnie w systemie, nie w katalogu użytkownika. Jeśli nie możesz tego zrobić, prawdopodobnie musisz sprecyzować GEM_PATH i GEM_HOME w pliku na który wskazuje PassengerRuby. Jak taki plik wygenerować? Tu jest odpowiedź, jeśli nie chcesz go stworzyć z palca: http://rvm.beginrescueend.com/integration/passenger/

Moje doświadczenie podpowiada mi że RVM ma pewne problemy, kiedy jest instalowany globalnie w systemie. Na swoich maszynach mam Ruby kompilowany z palca i skrypty które ustawiają środowisko. Ale może sytuacja się zmieniła, ostatnio bawiłem się RVM na serwerach jakieś pół roku temu.

[quote=hubertlepicki]O shit, pirat poleciał ostro.

Nie, nie usuwaj config.ru. Jeśli Twoja aplikacja napisana jest w Ruby 1.9.2 to zapewne nie będzie działać w Ruby Enerprise Edition.[/quote]
Ok… a teraz troszkę lektury:
http://blog.phusion.nl/2010/01/08/phusion-passenger-2-2-9-released/

“Smart spawning (the mechanism with which REE’s 33% memory reduction is implemented) is not supported for Rack apps. This means that if you want to utilize smart spawning with Rails 3, then you should remove your config.ru file.”

Z ree confi.ru nie ma sensu…

I jeszcze jedno… Rails 3 całe działa pod ree, co więcej uruchomienie obecnie na produkcji rails 2.3.5, 2.3.8 i 3.0 może zostać osiągnięte jedynie po instalacji ree jakowoż passenger umożliwia korzystanie tylko z jednego Rubiego (sic - rvm nic nie rozwiązuje)… a stare rails 2.3.5 lub 2.3.4 wysypie się na 1.9.2

co więcej … gemy prędzej są kompatybilne z ree niż jakimikolwiek 1.9 --pre

rozwiązanie to polecono mi na irc #RVM… i na debian lenny działa bezproblemowo (jedyna aplikacja z jaką miałem problem to cudowny redmine, jakowoż leci pod 2.3.5 i wykorzystuje starszy i18n gem a Rails 3 nowszy) http://www.redmine.org/issues/5608 (oczywiście mały fix tutaj wszystko rozwiązuje - ale jest to problem źle napisanej aplikacji a nie kompatybilności)

pozdrawiam
Piotr Mąsior

Ruby Enterprise Edition to Ruby 1.8.7!!! Zakładam że kolega wie co robi instalując 1.9.2. Aha, i to nie jest --pre tylko wyszło już 1.9.2 stabilne. Rails 2.3.5 śmiga za to pięknie na 1.9.2 (2.3.4 nie koniecznie, to prawda). Mówiłem o kodzie aplikacji, nie Railsów, który nie koniecznie musi być kompatybilny z 1.8.7 jeśli jest napisany pod 1.9.2.

wszystko zależy od tego co chcemy osiągnąć… jeżeli elastyczność to proponuje 1.8.7 jeżeli elastyczność i wydajność to ree. Jeżeli ktoś potrzebuje nowinek to oczywiście niech próbuje 1.9.2 :slight_smile:

pozdrawiam
Piotr Mąsior

Nie za bardzo rozumiem w tym momencie “elastyczność”. Jeśli chodzi o wydajność to REE w porównaniu z 1.9 wypada bardzo blado, i to nie tylko potwierdzone benchmarkami (http://programmingzen.com/2010/07/19/the-great-ruby-shootout-july-2010/) ale również doświadczeniem w przenoszeniu aplikacji z 1.8 na 1.9. 1.9.2 działa szybciej. REE żre mniej pamięci i tylko tyle.

Ale już jesteśmy bardzo daleko od tematu.

Generalnie postanowiłem zrezygnować z instalacji Rugiego przy pomocy RVM. Wywaliłem cały katalog ~/.rvm
W tej chwili robie to tak: (podaje linuxowe komendy)

  1. cd /opt/ruby
  2. sudo wget ftp://ftp.ruby-lang.org//pub/ruby/1.9/ruby-1.9.2-p0.tar.gz
  3. sudo tar -xvvf ruby-1.9.2-p0.tar.gz
  4. cd ruby-1.9.2-p0
  5. sudo ./configure make install

Następnie tworze dowiązania symboliczne:

  1. ln -s /opt/ruby/ruby-1.9.2-p0/ruby /usr/local/bin/ruby
  2. ln -s /opt/ruby/ruby-1.9.2-p0/bin/gem /usr/local/bin/gem

Jednak po wpisaniu w konsoli: $ gem env
Dostaje:

[code]RubyGems Environment:

  • RUBYGEMS VERSION: 1.3.7
  • RUBY VERSION: 1.9.2 (2010-08-18 patchlevel 0) [i686-linux]
  • INSTALLATION DIRECTORY: /home/slawek/.rvm/gems/ruby-1.9.2-p0
  • RUBY EXECUTABLE: /usr/local/bin/ruby
  • EXECUTABLE DIRECTORY: /home/slawek/.rvm/gems/ruby-1.9.2-p0/bin
  • RUBYGEMS PLATFORMS:
    • ruby
    • x86-linux
  • GEM PATHS:
    • /home/slawek/.rvm/gems/ruby-1.9.2-p0
    • /home/slawek/.rvm/gems/ruby-1.9.2-p0@global
  • GEM CONFIGURATION:
    • :update_sources => true
    • :verbose => true
    • :benchmark => false
    • :backtrace => false
    • :bulk_threshold => 1000
  • REMOTE SOURCES:
    • http://rubygems.org/[/code]
      Czemu INSTALLATION DIRECTORY, EXECUTABLE DIRECTORY oraz GEM PATHS wskazują na katalog ~/.rvm/… ? Jak mam pozbyć się rvm ? \

Jeśli chodzi o samego Passengera to po instalacji tego gema i wydaniu w konsoli: $ passenger-install-apache2-module
dostaje:

passenger-install-apache2-module: command not found

Widzę że teraz w ogóle się wszystko pokomplikowało. Albo czeka mnie przeinstalowanie Ubuntu albo rozwiązać to w jakiś bardziej przyjazny sposób. Dodam że jestem dość początkującym jeśli chodzi o linuxa :confused:


Po za tym czemu jak chce wysłać posta tutaj, muszę przełączać się na Windowsa :confused: Na linuxie po wysłaniu posta otrzymuje tylko możliwość zapisu pliku post.php (forum się sypie)

Tak ogólnie to Passenger nie słynie z dobrej współpracy z kombosem Ruby 1.9.2 i Railsami 3. Póki nie wyjdzie Passenger 2 lepiej postaw sobie klasyczny serwer aplikacji (Thin, Mongrel) i z Apacza zrób zaledwie Proxy.

Oraz:

Jeszcze przeprosisz :wink:

Spróbuj zrobić make uninstall w ruby 1.9.2, zainstaluj rvm i zrób tak jak napisał Tomash - używaj mongrela lub thina + apache/nginx jako proxy.

Jaka to przeglądarka? Może otwierasz pod czymś egzotycznym?

Prawdopodobnie zostały Ci wpisy z RVMa w systemie w bashrc albo bash_profile?

Ten prosty fakt powoduje, że REE jest szybsze od cruby 1.8. Im więcej pamięci Ruby przydzieli dla swojej wewnętrznej sterty tym dłużej trwa odśmiecanie i tym wolniej działa aplikacja na railsach. Proste “Hello World” nie ma znaczenia, ale aplikacja zużywająca > 100MB pamięci już tak.

REE wraz z lepszym śmieciarzem przynosi też kilka własnych bugów i niekompatybilności z gemami. Generalnie się sparzyłem, jeśli ktoś potrzebuje wydajności niech się przesiądzie na JRuby albo 1.9.

I na produkcji ma jechać na mongrelu ? Świetna rada ^^

Jeżeli zadowoli Cię mongrel to nie czytaj dalej oczywiście…

Dla dobra dalszej dyskusji, nie będę rozważał wyższości marchewki nad pietruszką. Jeżeli komuś rozwiązanie passenger + ree nie pasuje bo kilka gemów jakiś matoł źle napisał trudno… wasza wola. Po konfiguracji 100 domen dla czegoś w rodzaju mongrel + apache proxy i napisaniu tony kodu który to wszystko po każdym resecie stawia… może ktoś zrozumie, że nie tędy droga…

tak więc rozwiązanie które działa, powinno wyglądać tak od strony root-a:

RubyGems Environment:

  • RUBYGEMS VERSION: 1.3.7
  • RUBY VERSION: 1.8.7 (2010-04-19 patchlevel 253) [x86_64-linux]
  • INSTALLATION DIRECTORY: /usr/local/rvm/gems/ree-1.8.7-2010.02
  • RUBY EXECUTABLE: /usr/local/rvm/rubies/ree-1.8.7-2010.02/bin/ruby
  • EXECUTABLE DIRECTORY: /usr/local/rvm/gems/ree-1.8.7-2010.02/bin
  • RUBYGEMS PLATFORMS:
    • ruby
    • x86_64-linux
  • GEM PATHS:
    • /usr/local/rvm/gems/ree-1.8.7-2010.02
    • /usr/local/rvm/gems/ree-1.8.7-2010.02@global

Teraz, jak to osiągnąć… (od zawsze używam Debiana, więc ubuntu w którymś miejscu może się różnić… ale liczę na to że tak nie jest jakowoż są podobne :slight_smile: )

przypominam że jesteśmy na koncie root…

Krok pierwszy… zainstaluj RVM tak jak to jest powiedziane … http://rvm.beginrescueend.com/rvm/install/ … i dojdź do cholernego kroku “type rvm | head -n1” aby rvm zwracał komunikat “rvm is a function” … mała rzecz a cieszy, bo nie ma później problemów
krok drugi… z poziomu systemu zainstaluj cruby 1.8.7 (tak potrzebne jest do poprawnego zainstalowania ree bo sam instalator ree jest w ruby)
krok trzeci… z poziomu rvm zainstaluj cruby 1.8.7 (tak dla świętego spokoju)
krok czwarty… wybierz w rvm zainstalowanego rubiego
krok piąty… zainstaluj REE (rvm install ree) [jeżeli gdzieś się wysypie, znaczy że nie masz czegoś w systemie… czego… pisz będziemy analizowali]
Krok szósty… zmien sie na ree [rvm ree]
krok siódmy … rvm list (upewnij sie ze ree jest aktywnie wybrane poprzez rvm)
krok ósmy… rvm install passenger
krok osiem i pół … gem list (upewnij sie czy ten passenger jest)
krok dziewiąty … passenger-install-apache2-module [ na tym etapie zawsze coś nie gra, zobacz dokładnie co mówi instalator, jeżeli brakuje mu pewnych bibliotek musisz je dograć i uruchomić to polecenie raz jeszcze] (wiecej tutaj http://articles.slicehost.com/2008/5/1/ubuntu-hardy-mod_rails-installation)
krok dziesiąty… nie należy słuchać instalki passenger-a i wyedytować(dodać na koniec) apache2.conf w inny sposób mianowicie:

LoadModule passenger_module /usr/local/rvm/gems/ree-1.8.7-2010.02/gems/passenger-2.2.15/ext/apache2/mod_passenger.so
PassengerRoot /usr/local/rvm/gems/ree-1.8.7-2010.02/gems/passenger-2.2.15
PassengerRuby /usr/local/bin/passenger_ruby

!ścieżki pewnie będą się różniły… ale wiesz czego szukać w systemie

pozostaje konfiguracja VH o której było we wcześniejszych postach i reset apache

… jeszcze raz uczulam na chown ! jeżeli aplikacja rails 3 bedzie miala za szerokie prawa lub za wąskie to sypie irracjonalnymi błędami (nie wiem dlaczego tak jest, ale na 2.3.5 nie doświadczyłem takiego zachowania. Zawsze railsy informowały jasno że coś nie tak z uprawnieniami… myślę, że za to odpowiedzialny bezpośrednio jest bundler)

więc przyda się chown www-data:www-data -R katalogRails (po synchronizacji z git lub innego repo warto dodać to do rake task)

no i powinno śmigać…

jeżeli gdzieś będzie coś nie grało to pisz… damy rade :slight_smile:

pozdrawiam
Piotr Mąsior

ps. powodzenia

[quote=pirat]I na produkcji ma jechać na mongrelu ? Świetna rada ^^

Jeżeli zadowoli Cię mongrel to nie czytaj dalej oczywiście…

Dla dobra dalszej dyskusji, nie będę rozważał wyższości marchewki nad pietruszką. Jeżeli komuś rozwiązanie passenger + ree nie pasuje bo kilka gemów jakiś matoł źle napisał trudno… wasza wola. Po konfiguracji 100 domen dla czegoś w rodzaju mongrel + apache proxy i napisaniu tony kodu który to wszystko po każdym resecie stawia… może ktoś zrozumie, że nie tędy droga…[/quote]
Też nie chcę rozważać wyższości marchewki nad pietruszką, ale nie uogólniaj wszystkiego do jednego (swojego) przypadku. Tym co piszesz możesz zamącić ludziom w głowach i taki początkujący będzie myślał, że passenger to jedyne słuszne wyjście.

Jeżeli masz do postawienia 100 aplikacji, to przyznaję, zabawa z monitoringiem i ustawianiem tego z pomocą thina i mongrela nie jest tym co tygryski lubią najbardziej. Ale nie każdy ma 100 aplikacji… Może ktoś potrzebuje zerowego downtime’u podczas restartu? Może ktoś ma mało odwiedzin i nie chce, żeby wczytanie nowych instancji w passengerze denerwowało ludzi (request trwający kilka sekund)? Różne problemy, różne rozwiązania (przynajmniej dopóki nie ma passengera 3).