设置 RVM、Passenger/Apache 与多个 Rubies 并以特定用户身份运行的最佳实践?

设置 RVM、Passenger/Apache 与多个 Rubies 并以特定用户身份运行的最佳实践?

我的目标是在可能具有不同版本的 ruby​​ 的不同服务器用户下运行 ruby​​ 应用程序。

因此,我将让用户充当“托管帐户”。文档根目录/应用程序文件将与使用 RVM 管理的 ruby​​ 版本和 gemset 一起位于其主目录中。用户将拥有一个或多个需要运行的 Web 应用程序。此用户站点的虚拟主机将指向用户主目录中的文档根目录,并且 Web 服务器也将以此身份有效运行user:group

布局示例:

/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)

所以...

问题 1:这有可能吗?我知道 Passenger 支持 ruby​​ 版本和 Passenger 用户(我假设 Passenger 用户相当于在虚拟主机级别指定 fcgi、php-fpm、SuExec 的用户:组),但我发现的所有指令似乎都从特定的 RVM 用户安装 apache 模块,这似乎很奇怪。或者这只是创建一个通用用户来安装模块,然后根据每个帐户执行其他所有操作的问题?

问题2:即使这是可能的,这是正确的设置方法吗?鉴于以下情况,最佳做法是什么:

  1. 网络服务器/应用程序必须以给定帐户的用户:组身份运行
  2. 必须能够根据每个应用程序运行不同版本的 ruby
  3. 每个用户必须能够运行多个应用程序
  4. 每个应用程序必须包含在特定用户的主目录下
  5. 用户必须被沙盒化到他/她的主目录(不是 sodoer)

(注意:除了偶尔使用一些 shell 脚本或使用 compass/zurb-foundation 之外,我自己并不是一个 ruby​​ 开发人员/用户,因此我对 Passenger 之外的其他选项持开放态度。另外,该服务器不适用于生产环境。)

答案1

当我最初发布这篇文章时,我试图节省走这条路进行设置的时间,但结果却不行。几天后,我试了一下,它成功了。我所做的是:

创建一个用户来实际安装乘客。我怀疑您可以使用root它,但我创建了一个名为的独立管理员级别用户passenger。我还禁用了此用户的所有远程访问。

sudo useradd -m -s /bin/bash passenger

切换到新passenger用户并安装rvm并使用它来安装我喜欢的默认红宝石 ( 1.9.3-stable):

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

安装 Passenger 和 apache 模块:

gem install passenger
passenger-install-apache2-module

passenger将mod 文件添加到/etc/apache2/mods-available....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

文件.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

然后我启用了模块并运行了配置测试,如果成功则重新加载

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

此后我根据需要配置了我的虚拟主机...例如:

<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>

由于PassengerUserSwitchingon属于PassengerRuby不同的用户,passenger 将自动以此 运行应用程序user:group。但是,您可以使用特定的 Passenger 指令在 vhost 级别设置用户和组。这些是否需要与 的所有者相匹配PassengerRuby尚不确定。

有帮助的文章/文档:

  1. 一位乘客可携带多颗红宝石
  2. 如何使用 Apache 和 mod_passenger 在 Ubuntu 11.10 服务器上安装 Redmine 以及性能改进选项(主要用于帮助配置性能类型设置)
  3. Phusion Passenger 配置参考(Apache)

相关内容