Назад | Перейти на главную страницу

Как мне заставить www-данные Apache распознавать RVm?

Проблема: Apache / Passenger не распознает RVM

У меня есть многопользовательская установка RVM, согласно каноническим инструкциям: http://beginrescueend.com/rvm/install/

Затем я отредактировал /etc/profile.d/rvm.sh, включив следующую строку, чтобы Ruby 1.9 была версией, используемой для всех пользователей, вошедших в систему:

rvm use --default 1.9.2

У меня как минимум 3 пользователя в моей системе:

При интерактивном входе в убунту и пассажир, следующее возвращается правильно:

$ ruby -v
ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-linux]

Однако www-data Пользователь, который фактически обслуживает эти запросы, никогда не выполняет /etc/profile.d/rvm.sh (или что-либо в profile.d, если на то пошло). В результате при входе в систему как пользователь www-data всегда происходит следующее:

$ ruby -v
ruby 1.8.7 (2010-08-16 patchlevel 302) [x86_64-linux]

В результате Bundler отлично работает в моей песочнице разработки с правильной версией Ruby, но при запуске выдает ошибку типа "Не удалось установить Gem на Ruby 1.8":

$ cap deploy
<snip>
  * executing "cd /var/www/app/releases/20111031001406 && bundle install --gemfile /var/www/app/releases/20111031001406/Gemfile --path /var/www/app/shared/bundle --deployment --quiet --without development test"
servers: ["example.com"]
[example.com] executing command
</snip>

(example.com и приложение являются заполнителями для моего реального сервера и приложения)

Ошибка, которую я получаю, связана с тем, что «gem linecache требует Ruby> 1.9)», поэтому я знаю, что Ruby 1.9.2 не работает, это проблема.

Как мне заставить Apache распознавать RVM и версию Ruby, которую я хочу? (RVM и Ruby, который мне нужен, устанавливаются в соответствии с многопользовательским шаблоном в / USR / местные / RVM

Я много раз выполнял все инструкции, которые только мог придумать, но здесь явно чего-то не хватает. Любое руководство здесь будет высоко оценено.

FWIW, это мой сценарий развертывания Capistrano:

# if you're still using the script/reapear helper you will need
# # these http://github.com/rails/irs_process_scripts
#
# # bundler bootstrap
require 'bundler/capistrano'

set :nice_name, "App"
set :application, "app"
set :domain, "example.com"

role :web, "#{domain}"                          # Your HTTP server, Apache/etc
role :app, "#{domain}"                          # This may be the same as your `Web` server
role :db,  "#{domain}", :primary => true # This is where Rails migrations will run
# # server details
set :default_run_options, {:pty => true}
set :ssh_options, {:forward_agent => true, :keys => "/path_to/ssh.key"}
#ssh_options[:keys] = [File.join(ENV["HOME"], ".ssh", "id_rsa")]

set :deploy_to, "/var/www/#{application}/"
set :user, "passenger"
set :use_sudo, false 

# repo details
set :scm, :git
set :scm_username, "githubuser"
set :repository, "git://github.com/githubuser/app.git"
set :branch, "master"
set :git_enable_submodules, 1

# tasks
namespace :deploy do
  task :start, :roles => :app do
    run "touch #{current_release}/tmp/restart.txt"
  end

  task :stop, :roles => :app do
  # Do nothing.
  end

  desc "Restart Application"
  task :restart, :roles => :app do
    run "touch #{current_release}/tmp/restart.txt"
  end

  desc "Symlink shared resources on each release - not used"
  task :symlink_shared, :roles => :app do
    #run "ln -nfs #{shared_path}/config/database.yml #{release_path}/config/database.yml"
  end
end

namespace :passenger do
  desc "Restart Application"  
  task :restart do  
    run "touch #{current_path}/tmp/restart.txt"  
  end
end

after :deploy, "passenger:restart"
after 'deploy:update_code', 'deploy:symlink_shared'

Вероятно, вам нужно настроить PassengerRoot и PassengerRuby директивы, указывающие на версию ruby, которую вы хотите использовать (ту, которая контролируется RVM). Если вы еще этого не сделали, я также рекомендую использовать один гемсет для каждого приложения. Вы можете решить установить пассажира в любой гемсет, который пожелаете, если директивы apache установлены правильно.

Пример (с использованием ree и Ubuntu):

sudo apt-get install build-essential bison openssl libreadline5 libreadline5-dev curl zlib1g zlib1g-dev libssl-dev libsqlite3-0 libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev  autoconf libc6-dev ncurses-dev libmysqlclient15-dev apache2-prefork-dev apache2-mpm-prefork libapr1-dev libaprutil1-dev libcurl4-openssl-dev 
rvm use ree@${gemset_here} --create --default --passenger
rvm ree@${gemset_here} gem install passenger --version="${PASSENGER_VERSION}"
passenger-install-apache2-module --auto --apxs2-path $(which apxs2)

Возможно, вам потребуется получить соответствующие зависимости сборки для вашего дистрибутива. После компиляции пассажира вам необходимо убедиться, что вы настроили его (проверьте вывод). Если вам нужен фрагмент apache conf, запустите это:

passenger-install-apache2-module --snippet

Я положил свой /etc/apache2/conf.d/passenger.conf (в системе Ubuntu). Ваш конфигурационный каталог может отличаться в зависимости от дистрибутива. Если у вас все еще возникают проблемы на этом этапе, возможно, вам нужно исправить некоторые разрешения для каталогов гемсетов RVM, которые вы используете.