web-dev-qa-db-ja.com

複数のRubiesを使用してRVM、Passenger / Apacheをセットアップし、特定のユーザーとして実行するためのベストプラクティスは?

私の目標は、Rubyのバージョンが異なる可能性のある異なるサーバーユーザーの下でRubyアプリケーションを実行することです。

だから私は本質的に「ホスティングアカウント」として機能するユーザーを持っているでしょう。ドキュメントのルート/アプリケーションファイルは、RubyバージョンおよびRVMで管理されるgemsetとともにホームディレクトリに存在します。ユーザーは、実行する必要のある1つ以上の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:これも可能ですか?私は乗客が仮想ホストレベルでRubyバージョンと乗客ユーザー(乗客ユーザーはfcgi、php-fpm、SuExecのuser:groupを指定するのと同等だと思います)をサポートしていることを知っていますが、すべての命令はim特定のRVMユーザーからApacheモジュールをインストールしているように見えますが、それは奇妙に思えます。それとも、モジュールをインストールする汎用ユーザーを作成し、アカウントごとに他のすべてを実行するだけの問題ですか?

質問2:これが可能であっても、設定する正しい方法はありますか?ここでのベストプラクティスは次のとおりです。

  1. Webサーバー/アプリケーションは、特定のアカウントのuser:groupとして実行する必要があります
  2. アプリケーションごとに異なるバージョンのRubyを実行する機能が必要です
  3. 各ユーザーは複数のアプリケーションを実行できなければなりません
  4. 各アプリケーションは、特定のユーザーのホームディレクトリの下に含まれている必要があります
  5. ユーザーは(sodoerではなく)自分のホームディレクトリにサンドボックス化する必要があります

(注:私自身はRuby dev/userではありませんが、ここかそこにある奇妙なシェルスクリプトを除いて、またはcompass/zurb-foundationを使用しているので、Passenger以外のオプションを利用できます。このサーバーも実稼働環境としては意図されていません。)

2
prodigitalson

私が最初にこれを投稿したとき、私はセットアップのためにこのパスをたどる時間を節約しようとしていましたが、それは機能しませんでした。数日後、私はそれを試してみましたが、うまくいきました。私がしたことは:

実際に乗客をインストールするユーザーを作成します。これにはrootを使用できると思いますが、passengerというスタンドアロンの管理者レベルのユーザーを作成しました。また、このユーザーのすべてのリモートアクセスを無効にしました。

Sudo useradd -m -s /bin/bash passenger

新しいpassengerユーザーに切り替えてrvmをインストールし、それを使用して私の好みのdefaultRuby(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 [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は別のユーザーが所有しているため、乗客はこのuser:groupとしてアプリケーションを自動的に実行します。ただし、vhostレベルでユーザーとグループを設定するために使用できる特定のパッセンジャーディレクティブがあります。それらがPassengerRubyの所有者と一致する必要があるかどうかはわかりません。

役に立った記事/ドキュメント:

  1. 1人の乗客で複数のルビー
  2. パフォーマンス向上オプションを備えたApacheおよびmod_passengerを使用してUbuntu 11.10サーバーにRedmineをインストールする方法 (主にパフォーマンスタイプ設定の構成を支援するために使用されます)
  3. Phusion Passenger Configuration Reference(Apache)
4
prodigitalson