问题: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-数据(这大概是我为处理 httpd 请求而设置的用户)
当以交互方式登录到Ubuntu和乘客,以下正确返回:
$ ruby -v
ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-linux]
但是,那www-数据实际处理这些请求的用户从不执行 /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 版本运行良好,但在运行时出现“无法在 Ruby 1.8 上安装 Gem”类型的错误:
$ 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 和 app 是我的真实服务器和应用程序的占位符)
我收到的错误是“linecache gem 需要 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'
答案1
您可能需要设置PassengerRoot
和PassengerRuby
指令以指向您希望它使用的 ruby 版本(由 RVM 控制的版本)。如果您还没有这样做,我还建议每个应用程序使用一个 gemset。您可以决定将 Passenger 安装到您想要的任何 gemset 中,只要正确设置了 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)
您可能需要获取适合您的发行版的构建依赖项。在 Passenger 编译后,您需要确保对其进行配置(检查输出)。如果您需要使用 apache conf 代码片段,请运行以下命令:
passenger-install-apache2-module --snippet
我将其放入/etc/apache2/conf.d/passenger.conf
(在 Ubuntu 系统上)。您的配置目录可能因发行版而异。如果此时您仍然遇到问题,则可能是您需要修复您正在使用的 RVM gemset 目录的一些权限。