Poziom: 0 | Kategoria: Komputerowo-internetowo, Ruby, Ruby on Rails, Techblog. | 7 komentarzy
Ostatnio dane mi było instalować pełen stos programów potrzebnych do uruchomienia aplikacji w Railsach na serwerze pod kontrolą systemu Debian 4.0 etch minimal w wersji 64-bitowej. Ponieważ proces ten jest dosyć długi, opisuję go poniżej.
Opis nie będzie zawierał prawie żadnych instrukcji jak zabezpieczyć serwer, przy okazji zakładam kilka rzeczy:
Na początku warto upewnić się, że mamy aktualną listę pakietów. W tym celu warto wykonać następujące czynności:
$ apt-get update $ apt-get upgrade
Instalujemy też potrzebne pakiety:
$ apt-get install apt-utils build-essential ruby1.8-dev imagemagick libmysqlclient15off \ libmysqlclient15-dev mysql-server mysql-common mysql-client memcached libxslt1-dev libpcre3-dev \ zlib1g-dev unzip gzip libssl-dev libreadline5-dev libmysql-ruby sqlite3 imagemagick man-db cron wget lynx curl bind9 -y
Od razu możemy zmienić hasło roota MySQL:
$ mysqladmin -u root password NEWPASSWORD
Żeby korzystać z jedynie Ruby Enterprise Edition można opuścić ten punkt.
Ruby instalujemy ze źrodeł. W momencie tworzenia opisu w oficjalnych repozytoriach Debiana znalazłem wersję 1.8.5, a najnowszą stabilną wersją Ruby na stronie Ruby-Lang była wersja 1.8.6-p286. Pobieramy i rozpakowujemy źródła Ruby:
$ cd /usr/src $ wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.6-p286.tar.gz $ tar zxf ruby-1.8.6-p286.tar.gz $ cd ruby-1.8.6-p286
Przed konfiguracją edytujemy plik ext/Setup w celu dołączenia potrzebnych rozszerzeń. Powyższy plik może wyglądać tak:
#Win32API #bigdecimal curses #dbm digest digest/md5 #digest/rmd160 digest/sha1 digest/sha2 dl enumerator #etc #fcntl #gdbm iconv #io/wait #nkf #pty openssl #racc/cparse readline #sdbm socket stringio strscan syck syslog #tcltklib thread #tk #win32ole zlib
Zawartość pliku oznacza, że chcemy skompilować Ruby wraz z rozszerzeniami curses, digest (md5, sha1/2), dl, enumerator, iconv, openssl, readline, socket, stringio, strscan, syck, syslog, thread, zlib.
Przyszła kolej na konfigurację, kompilację i instalację:
$ ./configure --prefix=/usr/local --with-openssl-dir=/usr \ --with-readline-dir=/usr --with-zlib-dir=/usr $ make $ make install $ make install-doc
Ostatnia linijka jest opcjonalna i odpowiedzialna za wygenerowanie dokumentacji.
Po zainstalowaniu interpretera języka Ruby przychodzi kolej na Rubygems:
$ cd /usr/src $ wget http://rubyforge.org/frs/download.php/45905/rubygems-1.3.1.tgz $ tar zxf rubygems-1.3.1.tgz $ cd rubygems-1.3.1/ $ ruby setup.rb $ gem isntall rubygems-update $ update_rubygems $ gem source --add http://gems.github.com
Ostatnia linijka dodaje do źródeł gemów repozytorium Github
Pora na instalacje potrzebnych gemów, moja proponowana lista:
gem install actionmailer actionpack actionwebservice active_graph \ activerecord activeresource activesupport addressable archive-tar-minitar \ bcrypt-ruby BlueCloth builder capistrano capistrano-ext cgi_multipart_eof_fix \ chronic color columnize daemons eventmachine extlib fastercsv fastthread \ feedtools gem_plugin haml highline hoe hpricot image_science \ InlineAttachment json libxml-ruby linecache memcache-client metaid \ mime-types mini_magick mislav-will_paginate mongrel mongrel_cluster \ mongrel_proctitle needle net-scp net-sftp net-ssh net-ssh-gateway nokogiri \ oauth passenger progressbar rack rails rake rcov RedCloth rmagick rspec \ rspec-rails rspec_hpricot_matchers ruby-debug ruby-debug-base rubyforge \ RubyInline rubyzip thin thor tlsmail transaction-simple uuid uuidtools \ webrat wirble xml-simple youtube ZenTest
Ponieważ będziemy uruchamiać aplikację Rails z użyciem Passengera, możemy zredukować zużycie pamięci korzystając ze specjalnie przygotowanej wersji interpretera. Instalujemy go ze źródeł:
$ cd /usr/src $ wget http://rubyforge.org/frs/download.php/50087/ruby-enterprise-1.8.6-20090113.tar.gz $ tar zxf ruby-enterprise-1.8.6-20090113.tar.gz $ cd ruby-enterprise-1.8.6-20090113/ $ ./installer
Wraz z REE zostaną zainstalowane rubygems oraz pewne gemy. Dodatkowe gemy instalujemy jak wyżej, z tym, że korzystamy ze zmodyfikowanej wersji Ruby:
/opt/ruby-enterprise-1.8.6-20090113/bin/ruby -S /opt/ruby-enterprise-1.8.6-20090113/bin/gem install capistrano # ... i inne gemy
Zainstalowałem apache2 wraz z pakietami apache2-mpm-worker, apache2-utils oraz apache2-prefork-dev
apt-get install apache2 apache2-mpm-worker apache2-utils apache2-prefork-dev
Ponieważ gem Passengera został zainstalowany wcześniej pozostaje wygenerować odpowiedni moduł dla apache2:
/opt/ruby-enterprise-1.8.6-20090113/bin/passenger-install-apache2-module
Pora na konfigurację. Wykorzystamy modułowość apache2 oraz program a2enmod do załadowania modułu. Tworzymy pliki /etc/apache2/mods-available/passenger.load z zawartością taką, jak wygenerowała nam instalacja modułu Passengera, np.:
LoadModule passenger_module /opt/ruby-enterprise-1.8.6-20090113/lib/ruby/gems/1.8/gems/passenger-2.0.6/ext/apache2/mod_passenger.so
i /etc/apache2/mods-available/passenger.conf:
PassengerRoot /opt/ruby-enterprise-1.8.6-20090113/lib/ruby/gems/1.8/gems/passenger-2.0.6 PassengerRuby /opt/ruby-enterprise-1.8.6-20090113/bin/ruby
Po zapisaniu tych plików ładujemy moduł:
$ a2enmod passenger
I to już praktycznie wszystko, jedyne, co zostaje do zrobienia, to utworzenie konfiguracji vhosta dla konkretnej aplikacji, np. w /etc/apache2/sites-available, uaktywnienie jej programem a2ensite i przeładowanie apache.
Mam nadzieję, że powyższy opis pozwoli komuś zaoszczędzić trochę czasu.
Poziom: 0 | Kategoria: Komputerowo-internetowo, Ruby, Ruby on Rails, Techblog. | 3 komentarze
Pracując ostatnio nad projektem zauważyłem dziwne rzeczy dziejące się w aplikacji. Po pierwsze w trybie deweloperskim po jakimkolwiek błędzie nie wyświetlał się stack trace. Jedyne, co się wyświetlało, to error code 500.
Już sam ten fakt był dla mnie dość uciążliwy, chociaż w tym przypadku zawsze można było odwołać się do logów aplikacji. Dużo gorszą rzeczą było nadpisanie przez coś wartości stałej RAILS_ENV i ustawienie jej na 'test'. Co ciekawe, wartość ENV['RAILS_ENV'] nadal wskazywała na poprawne środowisko.
Kiedy po zainstalowaniu RPM aplikacja nie chciała z nim współpracować (oczywiście działo się tak przez źle wskazujące RAILS_ENV) trzeba było znaleźć winnego. Po nitce do kłębka znalazłem wpis dotyczący znikających stack trace'ów. Okazało się, że wycięcie z pliku config/environment.rb linijki:
config.gem 'rspec-rails', :lib => 'spec/rails'
rozwiązało oba problemy!
Winowajcą jest linijka
silence_warnings { RAILS_ENV = "test" }
w pliku lib/spec/rails.rb gema rspec-rails.
Powyższy problem zdaje się nie występować w przypadku korzystania z rspeca w formie pluginu.