1

キャップ展開のメンテナンス ページが機能しません。私はデバッグしようとしましたが、私の間違いが見られません どうも

cap:web:disabled を実行すると、メンテナンス ページが表示されず、アプリだけが表示されます。

deploy.rb には次のものがあります。

  namespace :deploy do
  namespace :web do
     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/layouts/maintenance.html.erb')
       page = ERB.new(template).result(binding)

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

アプリの私の Nginx 設定:

  upstream unicorn {
  server unix:/srv/books/shared/tmp/unicorn.sock fail_timeout=0;
}

server {
  listen 80 deferred;
  server_name books.ltd;

  root /srv/books/public;
  try_files $uri/index.html $uri @unicorn;
  location @unicorn {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://unicorn;
  }

  if (-f $document_root/system/maintenance.html) {
        return 503;
  }

  error_page 503 @maintenance;
  location @maintenance {
      rewrite  ^(.*)$  /system/maintenance.html last;
      break;
  }

  #error_page 500 502 503 504 /500.html;
  client_max_body_size 4G;
  keepalive_timeout 10;
}
4

3 に答える 3

3

私ができるのは Nginx だけですが、次のようにします。

  root /srv/books/public;

  location / {
      try_files /system/maintenance.html $uri/index.html $uri @unicorn;
  }

  location @unicorn {
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_redirect off;
      proxy_pass http://unicorn;
  }

この 2 つの唯一の機能上の違いは、ユーザーが 503 ではなく 200 を取得することですが、エラー処理を活用して書き換えに到達するためだけにそのコードを使用していると思います。

ちなみに、あなたのソリューションが機能しない理由は、/system/maintenance.html に書き換えたが、そのファイルを提供する場所がないためです。したがって、Nginx は新しい場所を再度検索し、try_files に遭遇し、一致する場所が他にないため、リクエストを @unicorn に渡します。追加した場合

location = /system/maintenance.html { }

その後、おそらくあなたのソリューションはうまくいくでしょうが、それでも私のソリューションはよりシンプルで効率的であることをお勧めします.

于 2012-06-27T19:43:40.683 に答える
1

かなりの調査の結果、このページを見つけました。同様の問題を抱えている人にも役立つかもしれません。http://blog.oncompare.com/2011/01/25/setting-up-a-maintenance-page-with-passenger-nginx-and-rails/

于 2012-09-11T09:42:31.063 に答える
0

nginx を unicorn で使用している場合は、いくつかのパスを置き換えるだけで、以下の例を使用できます -

upstream unicorn {
      server unix:/tmp/unicorn.rrorder.sock fail_timeout=0;
    }

server {
  listen             80;
  server_name       example.com;

  root /home/deployer/apps/test/current/public;

    location ~* ^/assets/ {
        root /home/deployer/apps/test/current/public;
        gzip_static on;
        expires max;
        add_header Cache-Control public;
        add_header Last-Modified "";
        add_header ETag "";
        break;
    }

  try_files $uri/index.html $uri @unicorn;
  location @unicorn {
    proxy_set_header  X-Real-IP       $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  Host $http_host;
    proxy_redirect    off;
    proxy_pass        http://unicorn;
  }
  error_page 503 @503;
    if (-f $document_root/system/maintenance.html) {
     return 503;
    }
  error_page 500 502 503 504 /500.html;
    location @503 {
      rewrite ^(.*)$ /system/maintenance.html break;
    }
  client_max_body_size 4G;
  keepalive_timeout 30;
    proxy_connect_timeout 300;
    proxy_send_timeout    300;
    proxy_read_timeout    300;
}

これは私の実行可能なnginx構成です。動作するコードの下に追加するだけです。

  error_page 503 @503;
    if (-f $document_root/system/maintenance.html) {
     return 503;
    }
  error_page 500 502 503 504 /500.html;
    location @503 {
      rewrite ^(.*)$ /system/maintenance.html break;
    }

次に、 deploy.rb または production.rb capistrano ファイルに以下のコードを追加します

namespace :deploy do
  namespace :web do
    desc "Enable maintenance mode for apache"
    task :disable, :roles => :web do
      on_rollback { run "rm -f #{shared_path}/system/maintenance.html" }
      page = File.read('public/maintenance.html')
      put page, "#{shared_path}/system/maintenance.html", :mode => 0644
    end

    desc "Disable maintenance mode for apache"
    task :enable, :roles => :web do
      run "rm -f #{shared_path}/system/maintenance.html"
    end
  end 
end

以下のコンテンツを含む public フォルダーに maintenance.html ファイルを追加します。

<!DOCTYPE html>
<html>
<head>
  <title>The page you were looking for doesn't exist (404)</title>
  <style type="text/css">
    body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
    div.dialog {
      width: 48em;
      padding: 0 4em;
      margin: 4em auto 0 auto;
      border: 1px solid #ccc;
      border-right-color: #999;
      border-bottom-color: #999;
    }
    h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
  </style>
</head>

<body>
  <div class="dialog">
    <h1>Maintenance Mode</h1>
    <p>"We are currently carrying out essential scheduled maintenance.
        Normal service will resume shortly.  Apologies for any inconvenience." </p>

    <p>Sorry for the inconvenience!</p>
  </div>
</body>
</html>

以下を参照してください。使用できるレーキ タスクは次のとおりです。

cap deploy:web:enable
cap deploy:web:disable

cap production deploy:web:enable
cap production deploy:web:disable

cap staging deploy:web:enable
cap staging deploy:web:disable

これは間違いなく魅力のように機能します!

乾杯!

于 2014-11-11T12:37:39.533 に答える