2014-10-12 2 views
5

Как обновить версию Ruby, используемую Passenger, когда я обновляю Ruby и его Gemlist с помощью RVM и Capistrano? Каков наилучший способ проверить, использует ли мое приложение правильную рубиновую версию и gemset?Обновлен до версии Ruby 2.1.2, пассажир все еще на 1.9.3

У меня есть приложение Rails, работающее на сервере Linode (Ubuntu), с NGinx и Passenger. Перед тем, как он работал без каких-либо проблем.

Ранее мое приложение было работает Ruby On Rails 3.2.16 с Руби 1.9.3-P194

я использую RVM для управления версиями рубина как локально, так и на сервере. После того, как я установил Ruby-2.1.2 и обновил основные драгоценные камни (bundler, nokogiri и т. Д.), Я создал свой новый gemset для своего приложения.

В разработке (локально) Я использую Ruby 2.1.2, рельсы 3.1.19 (до перехода на Rails 4) и конкретный gemset для этого проекта.

Я изменил мой deploy.rb для Capistrano, следуя RVM-Capistrano gem Integration

require "rvm/capistrano" 
require "bundler/capistrano" 

set :user, "myusername" 
set :application, "myapp" 

set :deploy_to, "/home/#{user}/apps/#{application}" 
set :scm, :git 
set :repository, "[email protected]:myusername/#{application}.git" 
set :branch, "master" 
set :rvm_ruby_string, :local    # use the same ruby as used locally for deployment 
set :rvm_autolibs_flag, "read-only"  # more info: rvm help autolibs 
set :use_sudo, false 
set :deploy_via, :remote_cache 
set :keep_releases, 3 
default_run_options[:pty] = true 
set :ssh_options, { :forward_agent => true } 

before 'deploy:setup', 'rvm:install_rvm' # install/update RVM 
before 'deploy:setup', 'rvm:install_ruby' # install Ruby and create gemset 

after "deploy:restart", "deploy:cleanup" 
after "deploy", "rvm:trust_rvmrc" 

namespace :deploy do 
    task :start do ; end 
    task :stop do ; end 
    task :restart, :roles => :app, :except => { :no_release => true } do 
    run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}" 
    end 

    # ... some more tasks for assets and symlinks 

end 

namespace :rvm do 
    task :trust_rvmrc do 
    run "rvm rvmrc trust #{release_path}" 
    end 
end 

Я побежал cap deploy

Я освежил мою страницу и Passenger бросает следующие ошибки:

It looks like Bundler could not find a gem. Maybe you didn't install all the gems that this application needs. To install your gems, please run: 

bundle install 
... 
Could not find rake-10.3.2 in any of the sources (Bundler::GemNotFound) 
/home/myusername/.rvm/gems/[email protected]/gems/bundler-1.5.3/lib/bundler/spec_set.rb:92:in `block in materialize' 
... 
Ruby interpreter command 
/home/myusername/.rvm/gems/ruby-1.9.3-p194/wrappers/ruby 

Таким образом, очевидно Пассажир все еще работает Ruby-1.9.3, а не Ruby-2.1.2. Я не уверен, что RVM-Capistrano установил/обновил версию Ruby и соответствующий gemset. Я не уверен, что я пропустил?

EDIT: Я проверил nginx.conf в качестве корневого пользователя в /opt/nginx/conf/nginx.conf

В верхней части файла, который я нашел

... 

http { 
    passenger_root /home/myusername/.rvm/gems/ruby-1.9.3-p194/gems/passenger-4.0.37; 
    passenger_ruby /home/myusername/.rvm/gems/ruby-1.9.3-p194/wrappers/ruby; 

... 

server { 
    listen 80; 
    server_name XXX.XXX.XX.XX myapp.com www.myapp.com *.myapp.com; 
    root /home/myusername/apps/myapp/current/public; 
    passenger_enabled on; 
    client_max_body_size 4G; 
} 

Означает ли это, что я должен изменить эти строки с рубинового 2.1.2? Есть ли способ автоматизировать это изменение?

UPDATE 2: Я изменил nginx.conf

http { 
     passenger_root /home/myusername/.rvm/gems/[email protected]/gems/passenger-4.0.53; 
     passenger_ruby /home/myusername/.rvm/gems/[email protected]/wrappers/ruby; 

и в моем deploy.rb я явно сказать, чтобы использовать gemset [email protected]

set :rvm_ruby_string, "[email protected]" 

приложение работает отлично, рубин переводчик все же 1.9.3. Я даже распечатаны на странице администратора константа RUBY_VERSION и отображает 1.9.3

Я не понимаю ...

Спасибо за вашу помощь

ответ

2

Вы можете использовать несколько версий рубин под управлением rvm, если вы используете Passenger 4 или выше.

Здесь у вас есть какие-то ссылки на направляющие

http://rvm.io/integration/passenger
https://www.phusionpassenger.com/documentation/Users%20guide%20Nginx.html
https://www.phusionpassenger.com/documentation/Users%20guide%20Apache.html

Похоже, что для запуска пассажира установки/обновления на сервере, вы должны запустить rvmsudo -s первый

+0

Спасибо за ваш ответ. Модуль «пассажир-nginx» уже установлен и обе работают. На Ruby 1.9.3 у меня есть жемчужина 4.0.37, а на Ruby 2.1.2 у меня есть жемчужина 4.0.53. Проблема заключается в том, что я изменяю свой файл deploy.rb capistrano с другой версией ruby, отличной от 1.9.3-p194, а затем развертываю его, пассажир отправляет кучу ошибок. –

2

Вы должны запустить passenger-install-nginx-module из нового контекста RVM, чтобы установить новый пассажирский модуль. Более подробная информация здесь:

https://www.phusionpassenger.com/documentation/Users%20guide%20Nginx.html#run_passenger_installer

Nginx является отличным от других веб-серверов, в том, что он не поддерживает загружаемые модули. Единственный способ расширить Nginx - полностью перекомпилировать его из источника. Поскольку Phusion Passenger состоит из некоторых внешних исполняемых файлов плюс модуль Nginx, вы должны перекомпилировать Nginx при первой установке Phusion Passenger, но также при обновлении самого Nginx или при обновлении версии Phusion Passenger.

Таким образом, вручную изменить конфигурацию nginx недостаточно, вы должны запустить установщик пассажира, который должен позаботиться о правильной настройке nginx (т. Е. Перекомпилировать то, что необходимо). Обычно я использую пассажирский модуль Apache и всегда запускаю установщик для пассажиров после обновления. Просто не забудьте запустить rvm use [email protected] перед запуском установщика пассажира.

+0

1. Установите новую версию с RVM, установите ее по умолчанию. 2. Измените конфиг на новую рубиновую версию 3. Запустите эту команду. Верный? Должен ли я использовать rvmsudo для pasenger-install-nginx-module? – Jepzen

+0

@Jepzen да, кажется правильным. Если вам нужен root-доступ к целевым серверам, вы можете использовать rvmsudo, да. – kroky