3

Phusion Passenger のエラー メッセージは、バックエンドの更新中に訪問者がサイトにアクセスした場合に表示されるものではありません。

では、どうすればこれを回避できますか?私の導入プロセスは最初から欠陥がありますか? それとも私が見逃しているものがありますか?

これが私の展開プロセスです。写真が得られます。

  • 新しい更新を git リポジトリにコミットし、リモートにプッシュする
  • キャップ展開
  • ssh [IP]
  • rake gem:インストール
  • rake db:移行
  • キュウリ

cap deploy と db:migrate または gems:install の間の時間は、エラー メッセージが表示されるか、より長いメンテナンス中です。

これを書いているときに、あるアイデアが頭をよぎりました: これらのコマンドをデプロイ レシピに入れることはできますか?

しかし、メンテナンスに 30 分または 1 時間かかるとしたら、それらのコマンドでは問題は解決しません。この期間、訪問者にメンテナンス スプラッシュ ページを提供するにはどうすればよいですか?

前もって感謝します。

4

1 に答える 1

11

アプリケーションがしばらく利用できない場合は、メンテナンス ページを作成する必要があります。この Capistrano タスクを使用します。

namespace :deploy do
  namespace :web do
    desc <<-DESC
      Present a maintenance page to visitors. Disables your application's web \
      interface by writing a "maintenance.html" file to each web server. The \
      servers must be configured to detect the presence of this file, and if \
      it is present, always display it instead of performing the request.

      By default, the maintenance page will just say the site is down for \
      "maintenance", and will be back "shortly", but you can customize the \
      page by specifying the REASON and UNTIL environment variables:

        $ cap deploy:web:disable \\
              REASON="a hardware upgrade" \\
              UNTIL="12pm Central Time"

      Further customization will require that you write your own task.
    DESC
    task :disable, :roles => :web do
      require 'erb'
      on_rollback { run "rm #{shared_path}/system/maintenance.html" }

      reason = ENV['REASON']
      deadline = ENV['UNTIL']      
      template = File.read('app/views/admin/maintenance.html.erb')
      page = ERB.new(template).result(binding)

      put page, "#{shared_path}/system/maintenance.html", :mode => 0644
    end
  end
end

app/views/admin/maintenance.html.erbファイルには次が含まれている必要があります。

<p>We’re currently offline for <%= reason ? reason : 'maintenance' %> as of <%= Time.now.utc.strftime('%H:%M %Z') %>.</p>
<p>Sorry for the inconvenience. We’ll be back <%= deadline ? "by #{deadline}" : 'shortly' %>.</p>

最後のステップは、ファイルを探し、maintenance.html存在する場合はすべてのリクエストをリダイレクトするように、いくつかのディレクティブを使用して Apache 仮想ホストを構成することです。

<IfModule mod_rewrite.c>
  RewriteEngine On

  # Redirect all requests to the maintenance page if present
  RewriteCond %{REQUEST_URI} !\.(css|gif|jpg|png)$
  RewriteCond %{DOCUMENT_ROOT}/system/maintenance.html -f
  RewriteCond %{SCRIPT_FILENAME} !maintenance.html
  RewriteRule ^.*$ /system/maintenance.html [L]
</IfModule>

アプリケーションをメンテナンス モードにするには、 を実行cap deploy:web:disableし、再度有効にするには を実行しますcap deploy:web:enable

于 2010-07-29T10:49:45.560 に答える