Prática recomendada para configuração de RVM, Passenger / Apache com vários Rubies e execução como usuários específicos?

2

Meu objetivo é executar aplicativos Ruby em diferentes usuários de servidores com versões potencialmente diferentes do Ruby.

Então, eu teria usuários que servem como a "conta de hospedagem" essencialmente. Os arquivos de raiz / aplicativo do documento residirão em seu diretório inicial, juntamente com as versões e conjuntos de gemsets gerenciados com o RVM. Um usuário terá um ou mais aplicativos da Web que precisa executar. Os hosts virtuais para o site deste usuário apontarão para a raiz do documento no diretório inicial do usuário e o servidor da Web também será executado com eficiência como este user:group .

Exemplo de layout:

/home/theuser
  /.rvm
  /applications
     /railsapp1
       /public
       [ other rails dirs ]
     /somephpapp (symfony, zf, etc.)
       /public
       [ other framework dirs ]
  /www
    /railsapp1.com (ln -s ../applications/railsapp1/public)
    /somestaticsite.com
    /somephpapp.com (ln -s ../applications/somephpapp/public)

Então ...

Pergunta 1: isso é possível? Eu sei que o passageiro suporta versões de rubi e usuários de passageiros (eu presumo que o usuário de passageiro equivale a especificar o usuário: grupo para fcgi, php-fpm, SuExec) no nível do host virtual, mas todas as intenções que estou encontrando parecem instalar o módulo do apache usuário RVM específico, que parece estranho. Ou é apenas uma questão de criar um usuário genérico para instalar o módulo e depois fazer tudo por conta?

Pergunta 2: Mesmo que isso seja possível, a maneira correta de definir as coisas? Qual é a melhor prática aqui, dado que:

  1. O servidor / aplicativo Web DEVE ser executado como o usuário de uma determinada conta: group
  2. DEVE ter a capacidade de executar uma versão diferente do Ruby por aplicativo
  3. Cada usuário DEVE poder executar vários aplicativos
  4. Cada aplicativo DEVE estar contido no diretório home de um usuário específico
  5. O usuário DEVE ser sandboxed para seu homedir (não um sodoer)

(Nota: eu mesmo não sou um usuário / usuário ruby além do shell script estranho aqui ou ali, ou usando bússola / zurb-foundation, portanto, estou aberto a outras opções além do Passenger. Também este servidor não é um ambiente de produção .)

    
por prodigitalson 06.06.2013 / 06:03

1 resposta

3

Quando eu inicialmente postei isso, eu estava tentando economizar o tempo de percorrer este caminho para a configuração apenas para que não funcionasse. Depois de alguns dias eu apenas dei uma chance e deu certo. O que eu fiz foi:

Crie um usuário para instalar o passageiro. Eu suspeito que você poderia usar root para isso, mas eu criei um usuário autônomo de nível de administrador chamado passenger . Eu também desativei todo o acesso remoto para este usuário.

sudo useradd -m -s /bin/bash passenger

Mude para o novo usuário passenger e instale rvm e use-o para instalar o meu rubi padrão preferido ( 1.9.3-stable ):

su - passenger
curl -L https://get.rvm.io | bash
rvm install 1.9.3

Instale o passageiro e o módulo do apache:

gem install passenger
passenger-install-apache2-module

Adicione os arquivos passenger mod a /etc/apache2/mods-available ... O arquivo .load :

# /etc/apache2/mods-available/passenger.load
LoadModule passenger_module /home/passenger/.rvm/gems/ruby-1.9.3-p429/gems/passenger-4.0.5/libout/apache2/mod_passenger.so

O arquivo .conf :

# /etc/apache2/mods-available/passenger.conf

PassengerRoot /home/passenger/.rvm/gems/ruby-1.9.3-p429/gems/passenger-4.0.5
PassengerDefaultRuby /home/passenger/.rvm/wrappers/ruby-1.9.3-p429/ruby
PassengerUserSwitching on
PassengerDefaultUser www-data
PassengerDefaultGroup www-data

# Any other global-only configuration

Então eu habilitei o módulo e executei um teste de configuração, seguido por um recarregamento se for bem sucedido

sudo a2enmod passenger
sudo apache2ctl configtest
sudo service apache2 graceful # if Syntax Ok from previous command

Depois disso, configurei meu host virtual conforme necessário ... exemplo:

<VirtualHost *:80>
    ServerName appname.yourdomain.com
    ServerAdmin [email protected]
    DocumentRoot /home/appuser/path/to/doc/root

    PassengerSpawnMethod smart
    PassengerPoolIdleTime 300
    PassengerMaxRequests 500
    PassengerStatThrottleRate 5
    PassengerMinInstances 2
    PassengerRuby /home/appuser/.rvm/rubies/ruby-1.9.3-p429/bin/ruby

    <Directory "/home/appuser/path/to/doc/root">
        Options Indexes -ExecCGI FollowSymLinks -MultiViews
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

Como PassengerUserSwitching é on e PassengerRuby pertence a um usuário diferente, o passageiro executará automaticamente o aplicativo como user:group . No entanto, existem diretivas específicas de passageiro que você pode usar para definir usuário e grupo no nível do vhost. Se os que precisam corresponder ao dono do PassengerRuby i não sabem ao certo.

Artigos / documentos que ajudaram:

  1. Vários Rubis com um único Passageiro
  2. Como instalar o Redmine no Ubuntu 11.10 Server usando Apache e mod_passenger com opções de melhoria de desempenho (usado principalmente para ajudar a configurar as configurações de tipo de desempenho)
  3. Referência de configuração do Passageiro de Phusion (Apache)
por 08.06.2013 / 22:51