2

そのため、Rack 上で Sinatra アプリを実行している実稼働マシンがいくつかあります。Puppet (サーバーに変更を同期するために使用している) がプロジェクトの Gemfile.lock が変更されたことに気づき、その結果、bundle install --binstubs --deployment新しい gem を取得するためにコマンドを発行する必要があるまで、通常はすべてが面倒です。これが発生すると、新しい gem がまだインストールされていないため、Bundler を呼び出して gem を要求するときに、すべての http リクエストで 500 エラーが発生します。

通常、サーバーが稼働していることを確認するために定期的に http 要求を行う別のプロセスのために、少なくとも 1 つの Rack プロセスがぶら下がっていますが、これが発生すると、稼働中の Rack プロセスはありません。問題が新しいインスタンスにあった場合、ディレクティブが役立つように思えPassengerMinInstancesますが、定期的にページを取得してサーバーがまだ稼働していることをテストするプロセスもあるため、リクエストを処理するために少なくとも 1 つの Rack プロセスが生きている必要があります。 .

touchpuppet は、( restart.txt ファイルを ing することによって) 実際に Rack を再起動するまでは (restart.txt ファイルを使用しbundle installて) 完了しないことに注意してください。誰もこのようなことに遭遇しましたか?私が見落としたすべてのリクエストで環境全体をリロードしないためのラックオプションはありますか?

4

2 に答える 2

1

これはあなたの質問に直接答えることはできませんが、この種の事態を回避するために過去に行ったことは、バージョン番号が付けられたdirにアプリをデプロイし、それらを指すソフトリンクと(Nginx)を使用することです。リンクへのプロキシサーバールーティング要求。デプロイの最後に、デプロイスクリプトは新しいアプリへのリンクを指し示します。

それは私にとっては十分に機能しているようで、本当に問題が発生した場合は、いつでも手動でリンクを以前のバージョンに戻すことができます。

于 2012-02-07T03:02:43.693 に答える
0

後世のために、私はこの質問に答えます。展開の一部として、すべてのファイルが chown -R で変更されました。これにより、ファイルの ctime (ただし、mtime は更新されません) が更新されます。Passenger には、/tmp/restart.txt ファイルの mtime または ctime が変更されるたびにサーバーを再起動する興味深いバグ/機能もあります。

解決策: 展開中はディレクトリの chowning を停止します。

于 2012-02-16T21:06:42.483 に答える