Shared rss feeds:

Servare Mentem - blog

Мой предыдущий блог

воскресенье, 31 октября 2010 г.

Phusion Passenger with 2 different ruby versions

Сегодня долго разбирался как же запустить 2 версии Phusion Passenger с 2-мя различными версиями ruby.
Началось всё с того, что мне потребовалось задеплоить приложение на 3-х рельсах на сервер под управлением Ubuntu Server 9.04, где уже был установлен Ruby 1.8.7, который использовался для работы Redmine. Причём версия Redmine была из trunk и активно эксплуатировалась для ведения проектов.
Я подключил к проекту capistrano, настроил его и проверил. Локально всё заработало. А вот при попытке задеплоить приложение на целевой сервер возникли проблемы. Во-первых, мне был нужен Ruby 1.9.2, который я тут же поставил. Во-вторых после деплоя (приложение поднялось) сдох Redmine.
После продолжительных разбирательств, я обнаружил, что виной тому гем i18n. Для 3-х рельсов требуется его версия не ниже 0.4.1, а вот Redmine с этой версией не работает, а работает аж только с 0.3.7. Танцы с бубном вокруг "gem, :version => 0.3.7", "Monkey-патчинга", и даже gem:extract почти ничего толкового не дали. Никак redmine не хотел работать с другой версией i18n (когда я пытался принудительно оставить только 0.3.7). Поэтому я, в конец разочаровавшийся, начал искать пути запуска сервера с 2-мя различными версиями ruby.
Сперва я осознал, что надо установить одновременно 2 версии ruby. Для этого я установил и настроил RVM по этому мануалу.
Redmine на сервере был запущен через Phusion-Passenger-плагин к Apache и я начал выяснять можно ли использовать 2 версии ruby одновременно. Оказалось - через apache это сделать нельзя. Однако, можно установить nginx-версию passenger и использовать её. Сперва я перевёл apache на использование версии Ruby из RVM. Для этого нужно отредактировать файл /etc/apache2/mods-enabled/passenger.load ($RVM нужно заменить путём к rvm в вашем энвайроменте - в моём случае это было /home/smecsia/.rvm).
 LoadModule passenger_module $RVM/gems/ruby-1.8.7-p302/gems/passenger-3.0.0/ext
/apache2/mod_passenger.so
А так же файл /etc/apache2/mods-enabled/passenger.conf
PassengerRoot $RVM/gems/ruby-1.8.7-p302/gems/passenger-3.0.0
PassengerRuby $RVM/wrappers/ruby-1.8.7-p302/ruby
Теперь нужно было установить nginx и passenger-модуль для него. Для этого (как и написано в официальном туториале по Passenger) надо выполнить команду:
passenger-install-nginx-module
После выполнения я быстро понял, что необходимо собрать nginx из исходников. И инсталлятор может сделать это за меня. Я попробовал это сделать, но вскоре стало очевидно, что этот вариант не очень удобен, поскольку запускать nginx пришлось бы вручную - или самому писать скрипт запуска его в качестве демона. И я начал искать варианты установки nginx+passenger из пакетов. Оказалось этот вариант существует:
deb http://apt.brightbox.net hardy main
apt-get install nginx-brightbox
Однако, тут я тоже наткнулся на проблему. Версия из пакетов была не свежей, и несовместимой с версией гема passenger который был у меня установлен. Тогда я решил собрать всё же nginx из исходников, но воспользоваться скриптом его запуска из пакета nginx-brightbox.
mkdir ~/dist/nginx && cd ~/dist/nginx
wget http://sysoev.ru/nginx/nginx-0.8.53.tar.gz
tar zxf nginx-0.8.53.tar.gz && cd nginx-0.8.53
passenger-install-nginx-module
Дальше я выбрал вариант указать исходники nginx вручную (вариант 2) и указал ~/dist/nginx/nginx-0.8.53, затем указал в качестве директории для последующей установки ~/opt/nginx. После компиляции я отредактировал файл ~/opt/nginx/conf/nginx.conf таким образом:
http {
    passenger_root $RVM/gems/ruby-1.9.2-p0/gems/passenger-3.0.0;
    passenger_ruby $RVM/wrappers/ruby-1.9.2-p0/ruby;
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       127.0.0.1:81;
        root /var/www/rails-webapps/myapp/current/public;
        passenger_enabled on;
    }
}
Так же, открыл файл /etc/init.d/nginx и исправил строку DAEMON=/usr/sbin/nginx на путь к собранной версии (~/opt/nginx/sbin/nginx).
Затем я запустил nginx:
sudo /etc/init.d/nginx start
После этого можно настроить прокси из Apache на nginx (на 81 порт) и таким образом получить почти прозрачную возможность использовать 2 версии ruby для своих rails-приложений.

Комментарии: 0:

Отправить комментарий

Подпишитесь на каналы Комментарии к сообщению [Atom]

<< Главная страница

-->