我的目标是在可能具有不同版本的 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:即使这是可能的,这是正确的设置方法吗?鉴于以下情况,最佳做法是什么:
- 网络服务器/应用程序必须以给定帐户的用户:组身份运行
- 必须能够根据每个应用程序运行不同版本的 ruby
- 每个用户必须能够运行多个应用程序
- 每个应用程序必须包含在特定用户的主目录下
- 用户必须被沙盒化到他/她的主目录(不是 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>
由于PassengerUserSwitching
和on
属于PassengerRuby
不同的用户,passenger 将自动以此 运行应用程序user:group
。但是,您可以使用特定的 Passenger 指令在 vhost 级别设置用户和组。这些是否需要与 的所有者相匹配PassengerRuby
尚不确定。
有帮助的文章/文档: