如何让 Apache 的 www-data 识别 RVm?

如何让 Apache 的 www-data 识别 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-数据(这大概是我为处理 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

您可能需要设置PassengerRootPassengerRuby指令以指向您希望它使用的 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 目录的一些权限。

相关内容