rails 3 на REE+Thin

Послушав некоторых людей и прочитав некоторые статьи и комментарии я пришел к выводу, наверняка, очевидному для других, что REE быстрее и стабильнее Ruby 1.9.x. Собственно к этому выводу можно прийти просто расшифровав аббревиатуру REE как Ruby Enterprise Edition. А т.к. мой любимый iLukmus крайне нуждается в скорости, я решил перенести его на REE, а также, по совету Elfiel’а сменил back-end сервер с Mongrel’а на Thin, который, говорят, по скорости может конкурировать с мюонными нейтрино из CERN.

установка REE через RVM

Установка REE несколько отличается от установки Ruby 1.9.2, а точнее тем, что еще потребуется пакет patch.

1
2
3
# yum install git gcc gcc-c++ curl zlib zlib-devel -y
# yum install sqlite-devel.x86_64 openssl-devel -y
# yum install readline readline-devel <strong>patch.x86_64</strong> -y

Теперь как обычно ставим сам RVM:

1
# bash < <(curl -s https://rvm.beginrescueend.com/install/rvm)

Теперь надо закрыть терминал/завершить сессию и снова открыть терминал/залогиниться, в противном случае bash не увидит RVM.
Ставим REE и делаем его версией по умолчанию:

1
2
3
4
5
# rvm install ree
# rvm use ree --default
$ ruby -v
ruby 1.8.7 (2011-02-18 patchlevel 334) [x86_64-linux],
MBARI 0x6770, Ruby Enterprise Edition 2011.03

Устанавливаем Rails (здесь на удивиление без приколов в отличии от Ruby 1.9.2):

1
# gem install rails

Делаем тестовое приложение, заходим в ее директорию и бандлим:

1
2
$ rails new Testapp && cd Testapp
# bundle install

Пытаемся запустить:

1
$ rails s

и если в ответ появляется ошибка:

1
2
3
4
5
/usr/local/rvm/gems/ree-1.8.7-2011.03/gems/execjs-1.2.9
/lib/execjs/runtimes.rb:47:in `autodetect': Could not find
a JavaScript runtime. See https://github.com/sstephenson
/execjs for a list of available runtimes.
(ExecJS::RuntimeUnavailable)

то дописываем в Gemfile:

1
2
gem 'execjs'
gem 'therubyracer'

и опять бандлим.

установка Thin

Судя по диаграмме на офсайте Thin’а, он по скорости превосходит все остальные back-end сервера Rails. Как говорит сам офсайт Thin это web-сервер, который ‘склеивает’ 3 из лучших библиотеки Ruby в истории web’а. Что делает его самым безопасным, быстрым, стабильным и, разумеется, самым скромным web-сервером в этой и некоторых других галактиках.
Устанавливается он просто:

1
# gem install thin

Далее, чтобы запустить, нужно зайти в директорию приложения, причем зайти надо именно в корень папки, а не так как это было с Mongrel’ом и Webrick’ом где попало.
Такой командой запустится приложение в development’е на порте 3000, короче как обычно.

1
$ thin start

Для промышленного запуска делаем:

1
$ thin start -e production -p <порт> -d

Останавить его можно так:

1
$ thin stop

ошибка с версией rack

Иногда, когда, например, приложение написано на Rails 3.0.x, а на сервере стоит Rails 3.1.x может вылететь ошибка с версией rack, типа этой (здесь для Ruby 1.9.2):

1
2
3
4
5
6
7
$ thin start
>> Using rack adapter
/usr/local/rvm/gems/ruby-1.9.2-p290/gems/bundler-1.0.18
/lib/bundler/runtime.rb:31:in `block in setup': You have 
already activated rack 1.3.2, but your Gemfile requires 
rack 1.2.3. Consider using bundle exec. 
(Gem::LoadError)

В такой ситуации мне помогло следующее:

1
2
# bundle update
$ bundle exec thin start

P.S. Убедиться или разочаровться в стабильности, быстроте и прочих достоинствах Thin и REE можно глядя на iLukmus.

One Comments to “rails 3 на REE+Thin”

  1. lukmus пишет:

    Забыл сразу же отписаться. Через ~6 часов после перехода на REE я обратно перешел на 1.9.2 от греха подальше. И пусть 99.9(9)% гемов в REE полностью совместимы, в то время как каждый 10-й гем в 1.9.x нужно немного исправлять, пусть REE стабильней чем 1.9.x, и т.д. Но все же 1.9.x быстрее чем REE и причем это достаточно заметно.
    И еще если вы захотите перейти с 1.9.x на REE, то вам придеться переписывать некоторые куски кода, где идет работа со строками, напр.: код ‘абвгдеёжз’[0..2] в REE и 1.9.x выдает различные результаты.
    А если же вы захотите перейти потом обратно с REE на 1.9.x в БД возникнут проблемы с кодировкой.

Leave a Reply

(обязательно)

(обязательно)