2011-07-06 7 views
15

私のプロダクションサーバーではユニコンにはちょっと変わった問題があります。 configファイルはpreload_appをtrueに設定していますが、USR2をマスタプロセスに送信しても応答は生成されず、ユニコーンがシグナルを完全に無視しているようです。 USR2を送信している別のサーバーでは、マスタプロセスが(古い)状態に変更され、新しいマスタプロセスが正常に開始されます。 問題のあるサーバーはRVM & bundlerを使用しているので、何とか関連していると思います(もう1つはバニラのルビーです)。 USR2(QUIT、HUP)以外の信号を送信しても問題ありません。 ここで何が起こっているのかを追跡する方法はありますか? Unicornのログファイルは完全に空です。ユニコーンはUSR2信号を完全に無視します

+0

あなたはstraceに興味があるかもしれません。私はそれがOSXのために利用できるかどうか知っていないが、これはあなたがこれの底になるのを助けるだろう。 http://linux.die.net/man/1/strace –

答えて

0

私のVDSで同様の問題が発生しました。 Strace'ingは、原因を明らかにした:

write(2, "E, [2011-07-23T04:40:27.240227 #19450] ERROR -- : Cannot allocate memory - fork(2) (Errno::ENOMEM) <...> 

は後者を通じていくつかの深刻な不要な側面を有していてもよく、(彼らは私の場合にはあまりにもハードだった)、メモリサイズを増やし、需要制限に関するXENメモリを試してみてください、または多分overcommitをオンにエフェクトは慎重に行ってください。

5

私は同様の問題を経験しましたが、ログではUSR2を送信すると最初はデプロイメントが行われますが、デプロイメントがクリーンアップされると、Unicornマスターが最初に開始したリリースが削除されるため、 USR2信号を送信する旨のエラーログで、/失敗何もしないように思われる:

フォークした子を再実行... 53 の/ var/www /のアプリケーション/リリース/ 153565b36021c0b8c9cbab1cc373a9c5199073db /ベンダー/バンドル/ルビー/1.9.1/gems/unicorn-4.3.1/lib/unicorn/http_server.rb:439:in `exec ':そのようなファイルやディレクトリはありません - /var/www/application/releases/153565b36021c0b8c9cbab1 cc373a9c5199073db /ベンダー/バンドル/ルビー/ 1.9.1/binに/ユニコーン (ERRNO :: ENOENT)

ユニコーンドキュメントはhttp://unicorn.bogomips.org/Sandbox.htmlで、この潜在的な問題に言及:「古いリビジョンをクリーンアップするの改正固有のインストールが発生します私の場合はUSR2が「何もしない」と思われることを意味していました。

私はChefのアプリケーションレシピを使用してアプリケーションを配備していますが、配布されたベンダー_バンドルディレクトリを作成しますが、bundle exec unicornを呼び出すと、特定のリリースディレクトリを含む元のUnicornマスターがパス参照を保持します。

これを修正するには、bundle exec /var/www/application/shared/vendor_bundle/ruby/1.9.1/bin/unicornに電話して、Unicornマスターに、ある展開から次の展開に有効なバイナリへのパスがあることを確認しなければなりませんでした。それが完了したら私は心のコンテンツを私に配備することができ、kill -USR2 PIDは宣伝されたとおりに動作します。

ユニコーンのドキュメントを手動でユニコーンの設定ファイルに次のように設定して、新しいマスターをフォークするUSR2を送信する前にユニコーンをリロードするためにHUPを送信することによって、バイナリのパス参照を変更することができます言及:Unicorn::HttpServer::START_CTX[0] = "/some/path/to/bin/unicorn"

おそらく、これは便利です同様の状況ではいくつかの人には、私はこれを実装していない共有されているユニコーンバイナリへの絶対パスを指定するように見えたので十分です。

10

あなたのGemfileが変更されているがUSR2が新しいGemfileを使用できるようにユニコンを起動していない可能性があります。したがって、アプリを再起動しようとするとクラッシュすることになります。

詳細については/log/unicorn.logを確認してください。あなたはカピストラーノを使用している場合は、シンボリックリンクとしてBUNDLE_GEMFILEを指定

、例えば:

run "cd #{current_path} && BUNDLE_GEMFILE=#{current_path}/Gemfile bundle exec unicorn -C#{config_path} -E #{unicorn_env} -D" 

Here's a PRこれをdemostrates。

+0

私はいつもこれを新しいunicornデプロイメントで忘れてしまいます。 'before_exec {| server | ENV ["BUNDLE_GEMFILE"] = "#{app_path} /現在/ Gemfile"} ' – Adam

関連する問題