Como obtenho o www-data do Apache para reconhecer o RVm?

3

Problema: o Apache / Passenger não reconhece o RVM

Eu tenho uma instalação multiusuário do RVM, de acordo com as instruções canônicas: link

Eu editei /etc/profile.d/rvm.sh para incluir a seguinte linha para que o Ruby 1.9 seja a versão usada para todos os usuários logados:

rvm use --default 1.9.2

Eu tenho pelo menos 3 usuários no meu sistema:

  • ubuntu (o usuário padrão que uso para executar todas as tarefas interativas)
  • passageiro (este é o usuário para as tarefas de implantação)
  • www-data (este é presumivelmente o usuário que configuro para atender a solicitações httpd)

Quando conectado de forma interativa a ubuntu e passageiro , o seguinte retorna corretamente:

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

No entanto, o usuário www-data , que realmente atende a essas solicitações, nunca executa /etc/profile.d/rvm.sh (ou qualquer coisa no profile.d, para esse assunto). Como resultado, o seguinte acontece sempre quando conectado como usuário www-data:

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

Como resultado disso, o Bundler roda muito bem na minha sandbox de desenvolvimento com a versão correta do Ruby, mas craps com um tipo de erro "Não foi possível instalar o Gem on Ruby 1.8" ao executar:

$ 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 e app são espaços reservados para meu servidor e aplicativo reais)

O erro que recebo é a melodia de "O gem do linecache requer o Ruby > 1.9)", que é como eu sei que o Ruby 1.9.2 não está rodando é o problema.

Como faço para o Apache reconhecer o RVM e a versão em Ruby que eu quero? (O RVM e o Ruby que eu quero estão instalados, de acordo com o padrão multiusuário, dentro de / usr / local / rvm

Eu tenho seguido todas as instruções que consigo pensar muitas vezes, mas claramente sinto falta de algo aqui. Qualquer orientação aqui seria muito apreciada.

FWIW, este é o meu script de implantação do 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'
    
por Manu R 31.10.2011 / 01:18

1 resposta

2

Você provavelmente precisará configurar as diretivas PassengerRoot e PassengerRuby para apontar para a versão do ruby que você deseja usar (aquela controlada pelo RVM). Se você não estiver fazendo isso, também recomendo usar um gemset por aplicativo. Você pode decidir instalar o passageiro em qualquer gemset que desejar, contanto que as diretivas do apache estejam definidas corretamente.

Exemplo (usando ree e 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)

Você pode precisar obter as dependências de construção apropriadas para sua distro. Após a compilação do passageiro, você precisará configurá-lo (verifique a saída). Se você precisar do snippet do conf apache para usar, execute isto:

passenger-install-apache2-module --snippet

Eu coloquei o meu em /etc/apache2/conf.d/passenger.conf (em um sistema Ubuntu). Seu diretório de configuração pode variar dependendo da distribuição. Se você ainda tiver problemas neste ponto, pode ser que você precise corrigir algumas permissões nos diretórios de gemsets RVM que você está usando.

    
por 31.10.2011 / 23:53