設置具有多個 Ruby 的 RVM、Passenger/Apache 並以特定使用者身份執行的最佳實踐?
我的目標是在不同的伺服器使用者下使用可能不同版本的 ruby 執行 ruby 應用程序。
因此,我將擁有基本上充當“託管帳戶”的使用者。文件根/應用程序文件將與 RVM 管理的 ruby 版本和 gemset 一起存在於它們的主目錄中。使用者將擁有一個或多個需要執行的 Web 應用程序。該使用者站點的虛擬主機將指向使用者主目錄中的文件根目錄,並且網路伺服器也將有效地執行為 this
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:**我這甚至可能嗎?我知道乘客在虛擬主機級別支持 ruby 版本和乘客使用者(我假設乘客使用者相當於指定使用者:fcgi、php-fpm、SuExec 的組),但我發現的所有提示似乎都是從特定的 RVM 使用者,這似乎很奇怪。還是只是創建一個通用使用者來安裝模組,然後在每個帳戶的基礎上執行其他所有操作?
**問題2:**即使這可能是正確的設置方式?鑑於以下情況,這裡的最佳做法是什麼:
- 網路伺服器/應用程序必須作為給定帳戶的使用者:組執行
- 必須能夠在每個應用程序的基礎上執行不同版本的 ruby
- 每個使用者必須能夠執行多個應用程序
- 每個應用程序必須包含在特定使用者的主目錄下
- 使用者必須被沙盒到他/她的 homedir(不是 sodoer)
(注意:除了這里或那裡的奇怪 shell 腳本或使用 compass/zurb-foundation 之外,我自己不是 ruby 開發/使用者,所以我對乘客以外的選項持開放態度。此外,此伺服器不打算用作生產環境。)
當我最初發布此內容時,我試圖節省沿此路徑進行設置的時間,但結果卻無法正常工作。幾天后,我試了一下,它奏效了。我所做的是:
創建一個使用者來實際安裝乘客。我懷疑您可以使用
root
它,但我創建了一個名為passenger
. 我還禁用了該使用者的所有遠端訪問。sudo useradd -m -s /bin/bash passenger
切換到新
passenger
使用者並安裝rvm
並使用它來安裝我喜歡的預設ruby (1.9.3-stable
):su - passenger curl -L https://get.rvm.io | bash rvm install 1.9.3
安裝乘客和 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 appuser@yourdomain.com 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
ison
和 thePassengerRuby
由不同的使用者擁有,乘客將自動以 this 執行應用程序user:group
。但是,您可以使用特定的乘客指令在虛擬主機級別設置使用者和組。這些是否需要匹配PassengerRuby
我不確定的所有者。幫助的文章/文件: