5

わかりました、告白する必要があります-私はまだ大規模なFCGIセットアップを実行しています(構成されているサーバーがたくさんあるだけです)。私はそれをrvmに適応させようとしています。fcgi 設定では、アプリケーション (Sinatra、Rack、Bundler など) を実行するために実行するコマンドライン コマンドを指定できます。これは、rvm なしで行うことです。

"bin-path" => "bundle exec rackup",
"bin-environment" => (
    "RACK_ENV" => "development"
),

私のラックアップファイルが単にconfig.ruであると仮定します。さて、私のMacではこれが機能します:

"bin-path" => env.HOME + "/.rvm/gems/ruby-1.9.2-p180/bin/bundle exec rackup " + CWD  + "/config.ru",
"bin-environment" => (
    "BUNDLE_GEMFILE" => CWD + "/Gemfile",
    "RACK_ENV" => "development"
),

しかし、サーバー上ではありません。ディスパッチャーが開始されると、RVM シェルのトリッキーが機能しなくなった環境が取り除かれます。ある種のラッパーを作成するにはラッパーオプションを使用する必要があると思いますが、それが問題をどのように緩和し、どの引数を使用するかがよくわかりません。RVM シェル環境をロードせずに特定の ruby​​ および gem バイナリを適用した経験のある人はいますか?

PSトピック外の回答を防ぐために、Ruby 1.8.7、Passenger、またはnginxは必要ありません。

4

4 に答える 4

3

あなたは使用できるはずですrvm exec

ほとんどのrvmset操作と同様に、execを使用すると、インストールされているすべてのrubiesに対してコマンドを実行できます。他とは異なり、重要な違いがあります-execを使用すると(ruby / gemなどだけでなく)任意のコマンドを実行でき、単一のrubyに対してのみ実行される場合は、次のようにexecと同等の機能を実行します(エラーメッセージなしなど)。環境の設定

rvm実行可能ファイルがWebサーバーのユーザー用にある場合は$PATH、次の操作を実行できます。

"bin-path" => "rvm 1.9.2-p180 exec bundle exec rackup"
于 2011-07-20T21:25:27.523 に答える
2

編集:ジェイコブは正しかったことがわかりました、反対票をお詫びします。このソリューションを少し拡張することにしました。

今はrvmバイナリを使用できますが、ユーザーがインストールしているため、ラップトップの$PATHにはありません。

bigbuk:~ julik$ which rvm
bigbuk:~ julik$ 

しかし、それはサーバー上にあります。

[julik@serveur ~]$ which rvm
/usr/local/rvm/bin/rvm
[julik@serveur ~]$

これが私を混乱させたものです。絶対パスで呼び出す必要があるのはそれだけです(FCGIは適切なPATHが設定されていない状態で実行されるため)。次に、バイナリパスをそれに応じて構成する必要があります。もちろん、rvmはGEM_HOMEとGEM_PATHも適切に設定します。Bundlerはラックアップファイルから自動検出できず、FCGIプロセスのcwdはガベージであるため、実際に設定する必要があるのはBUNDLE_GEMFILEだけです。

"bin-path" => "/usr/local/rvm/bin/rvm 1.9.2-p180 exec bundle exec rackup /home/user/websites/behandelaar-web/current/web-root/",
"bin-environment" => (
    "BUNDLE_GEMFILE" => "/home/user/websites/behandelaar-web/current/Gemfile",
    "RACK_ENV" => "production",
 ),

とは言うものの、Rubyで特定のラッパースクリプトを作成することには、ラックアップとバンドルの両方がバブリング例外に非常に悪いため、いくつかのメリットがあります。FCGIgem自体に問題があると言えば(これは私が持っていたものでした-1.8固有でした)文字列バイト処理)例外は、この階層化されたラッパースタックを介して適切にバブルアップせず、エラーレポートに関して最も洞察に満ちたものは、Webサーバーからのステータス500ページになります。

于 2011-07-30T13:54:13.240 に答える
0

次のようにシステム変数を設定しようとしましたか?

/etc/environment
BUNDLE_GEMFILE=path_to_the_file
RACK_ENV=production
RUBY_VERSION='ruby-1.9.2-p180'
GEM_PATH='$HOME/rvm/...'

ユーザー固有だけでなく、システムレベルで任意のrubygems(gem環境)およびrvm変数を調整できます。

于 2011-07-18T17:24:12.930 に答える
0

Ok rvm-shell は、シェル関数ではなく実行可能ファイルであるため、問題に対する答えのようです。ただし、GEM_HOME と GEM_PATH を自分で指定することが重要です。

        "bin-path" => "/usr/local/rvm/gems/ruby-1.9.2-p180/bin/bundle2 /home/user/websites/behandelaar-web/current/web-root/config.ru",
        "bin-environment" => (
            "BUNDLE_GEMFILE" => "/home/user/websites/behandelaar-web/current/Gemfile",
            "RACK_ENV" => "production",
            "GEM_HOME" =>"/usr/local/rvm/gems/ruby-1.9.2-p180",
            "GEM_PATH" =>"/usr/local/rvm/gems/ruby-1.9.2-p180:/usr/local/rvm/gems/ruby-1.9.2-p180@global",
         ),          ),

「bundle2」スクリプトは bundle exec と rackup を組み合わせたもので、適切なエラー レポートが追加されています (fcgi には STDERR と STDOUT がなく、チェーン内の多くの要素がすべての可能な例外を飲み込んでクラッシュするため)。

#!/usr/local/rvm/rubies/ruby-1.9.2-p180/bin/ruby
#
# Generated Manually!
begin
  require 'rubygems'

  version = ">= 0"

  if ARGV.first =~ /^_(.*)_$/ and Gem::Version.correct? $1 then
    version = $1
    ARGV.shift
  end

  gem 'bundler', version

  load Gem.bin_path('bundler', 'bundle', version)
  load Gem.bin_path('rack', 'rackup', version)

rescue Exception => e
  File.open("/tmp/fcgrun-crash.log", "w") do | f |
    f.puts(ENV.inspect)
    f.puts(e.class.to_s)
    f.puts(e.message)
    f.puts(e.backtrace.join("\n"))
  end
  # and raise further
  raise e
end
于 2011-07-24T21:23:19.760 に答える