Apache-2.2

設置具有多個 Ruby 的 RVM、Passenger/Apache 並以特定使用者身份執行的最佳實踐?

  • May 20, 2015

我的目標是在不同的伺服器使用者下使用可能不同版本的 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:**即使這可能是正確的設置方式?鑑於以下情況,這裡的最佳做法是什麼:

  1. 網路伺服器/應用程序必須作為給定帳戶的使用者:組執行
  2. 必須能夠在每個應用程序的基礎上執行不同版本的 ruby
  3. 每個使用者必須能夠執行多個應用程序
  4. 每個應用程序必須包含在特定使用者的主目錄下
  5. 使用者必須被沙盒到他/她的 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

passengermod 文件添加到/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>

由於PassengerUserSwitchingison和 thePassengerRuby由不同的使用者擁有,乘客將自動以 this 執行應用程序user:group。但是,您可以使用特定的乘客指令在虛擬主機級別設置使用者和組。這些是否需要匹配PassengerRuby我不確定的所有者。

幫助的文章/文件:

  1. 單個乘客的多個紅寶石
  2. 如何使用 Apache 和 mod_passenger 在 Ubuntu 11.10 伺服器上安裝 Redmine 並提供性能改進選項(主要用於幫助配置性能類型設置)
  3. Phusion 乘客配置參考 (Apache)

引用自:https://serverfault.com/questions/513641