1

状況: Rails + Unicorn を使用し、Capistrano でデプロイしています。Rails アプリがプロダクション モードで起動しないことがあります (実際のプロダクションではなく、ステージング環境です)。これは通常、デプロイ スクリプトまたは構成のエラーが原因で発生します (したがって、通常はテストでは検出できません)。これが発生すると、ユニコーン マスター プロセスは、失敗したワーカーを強制終了し、新しいワーカーを生成します。これも失敗します。その間、Unicorn は大量の CPU を消費し、同じメッセージでログを汚染します。

手動の方法 (良くない):ホームページにアクセスして、動作するかどうかを確認します。を見てくださいhtop。ログを追跡します。ユニコーンを手動で倒す。短所:忘れやすい。ログが汚染され、反応している間に CPU に負荷がかかります。

別の解決策:ユニコーンのpreload_app true. これにより、マスター プロセスがすぐに失敗します。短所:幸せなシナリオでは、メモリ消費量が高くなります。

ベストプラクティス: - ???

ユニコーン マスターが無駄に失敗した子供を産み出そうとしていることを巧みに検出して阻止する方法はありますか?

4

2 に答える 2

2

バッシュのスキルを一掃することをお勧めします。Unix-y マスター/ワーカー プロセスを利用するため、必要な機能は既に Unicorn に含まれています。

init.d スクリプトが必要です。または、少なくともgodbまたはmonit。init.d スクリプト ルートと監視をお勧めします。より複雑ですが、監視ソフトウェアでより簡単に活用でき、再起動時に自動的に開始されます.

その要点は次のとおりです。

  1. USR2 シグナルをユニコーン マスター プロセスに送信します。これにより、マスター プロセスがフォークされます。
  2. 次に、作成された古いマスター プロセスに WINCH を送信します。これにより、各ワーカーが強制終了されます。
  3. 次に、古いマスター プロセスに QUIT シグナルを送信できます。

ユニコーンシグナル

これにより、新しいコードを実行する新しいマスター プロセスが起動し、古いコードに (old) というラベルが付けられます。失敗した場合は、古いものを以前の状態に戻す必要があり、停止することはなく、再起動エラーのみが発生します。これがユニコーンの美しさです。コードをほぼ瞬時にデプロイできます。

私は 1 年以上前に自分のアプリでこの作業を行ったため、多くのヘッジワードを使用しているため、2 階には多くのクモの巣があります。お役に立てれば!

これは決して正しいスクリプトではありません。それは良い出発点ですが...改善できる場合は、要点を自由に更新してください! :-)

Unicorn 制御スクリプトの例

于 2012-10-30T00:38:24.927 に答える
2

Capistrano スクリプトに「unicorn start」のようなものがありますよね? そのコマンドを呼び出した直後に、Capistrano スクリプトが Unicorn に ping を実行するようにします。Unicorn がタイムアウト内に期待される応答を返さない場合は、何か問題が発生したことがわかり、デプロイをロールバックするか、他のアクションを実行するかを選択できます。

Unicorn に ping を送信する方法については、状況によって異なります。Unicorn が TCP ソケットをリッスンしている場合は、curl を使用できます。Unix ドメイン ソケットでリッスンしている Unicorn がある場合は、それに接続する小さなスクリプトを次のように記述する必要があります。

require 'socket'
sock = UNIXSocket.new('/path-to-unicorn.sock')
sock.write("HEAD / HTTP/1.0\r\n")
sock.write("Host: www.foo.com\r\n")
sock.write("Connection: close\r\n")
sock.write("\r\n")
if sock.read !~ /something/
  exit 1
end

しかし、Phusion Passenger Enterpriseが問題を見事に解決してくれるようです。この「展開ミス耐性」という特徴があります。新しいバージョンをデプロイし、新しいコードベースのプロセスを生成できないことを Phusion Passenger が検出すると、新しいバージョンの生成を停止し、古いバージョンのプロセスを無期限に保持します。新しいバージョンのプロセスを生成します。その間、問題を分析できるように、すべてのエラーがログ ファイルに記録されます。

于 2012-10-23T23:38:02.223 に答える