Как мне получить 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 пользователя в моей системе:
- Ubuntu (пользователь по умолчанию, который я использую для выполнения всех интерактивных задач)
- пассажир (это пользователь для развертывания задач)
- www-data (предположительно, пользователь, которого я настроил для обслуживания запросов httpd)
При интерактивном входе в систему для Ubuntu и пассажира корректно возвращается следующее:
$ 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 и приложение являются заполнителями для моего реального сервера и приложения)
Ошибка, которую я получаю, звучит так: "Для гема linecache требуется Ruby > 1.9)", как я знаю, проблема в том, что Ruby 1.9.2 не запущен.
Как заставить Apache распознавать RVM и версию Ruby, которую я хочу? (RVM и нужный мне Ruby установлены в соответствии с многопользовательским шаблоном в / usr / local / 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'
1 ответ
Вам, вероятно, нужно настроить 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). Ваш каталог config может отличаться в зависимости от дистрибутива. Если на этом этапе у вас все еще возникают проблемы, возможно, вам необходимо исправить некоторые разрешения для используемых вами каталогов гем-набора RVM.