2010-02-11 31 views
25

Vì vậy, tôi đang sử dụng Capistrano để triển khai một ứng dụng ray vào máy chủ sản xuất của tôi (apache + hành khách) và việc triển khai thời điểm thường đi dọc theo dòng:Capistrano để triển khai ứng dụng đường ray - cách xử lý di chuyển dài?

$cap deploy 
$cap deploy:migrations 

Nó đã cho tôi tự hỏi, chúng ta hãy nói db của tôi: cuộc di cư mất một thời gian dài để thực hiện trên máy chủ sản xuất (một trình tái cấu trúc lớn của lược đồ db) - trong trường hợp này thực hành tốt nhất với Capistrano là gì? Điều gì sẽ xảy ra nếu người dùng được kết nối với ứng dụng của tôi tại thời điểm triển khai? Tôi có nên gửi người dùng một cách duyên dáng đến một trang giữ chỗ tĩnh trong khi cơ sở dữ liệu đang được cập nhật không? Capistrano có xử lý automagically này không? Tôi có cần mã hóa một công thức để trợ giúp điều này không? Hay cơ chế nội bộ của đường ray/hành khách có nghĩa là tôi không phải lo lắng gì về trường hợp cụ thể này?

Cảm ơn.

Trả lời

36

Bạn nên thiết lập trang bảo trì nếu ứng dụng sẽ không khả dụng trong một thời gian. Tôi sử dụng nhiệm vụ Capistrano này:

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 

File app/views/admin/maintenance.html.erb nên chứa:

<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> 

Bước cuối cùng là cấu hình máy chủ ảo Apache với một số chỉ thị để tìm kiếm các tập tin maintenance.html và chuyển hướng tất cả các yêu cầu tới nó nếu nó hiện:

<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> 

để đưa các ứng dụng vào chế độ bảo trì, chạy cap deploy:web:disable và để làm cho nó sống ag ain làm cap deploy:web:enable.

+1

Trang bảo trì có được phục vụ với "200 OK" hoặc "503 Dịch vụ tạm thời không khả dụng" không? Google có thể nghĩ, nội dung quý giá của bạn có thể đã biến mất, nếu bạn phân phối nó với 200 OK. Xem http://googlewebmastercentral.blogspot.com/2011/01/how-to-deal-with-planned-site-downtime.html – iGEL

+1

Điểm tốt, Capistrano tự đề xuất đoạn mã sau cho .htaccess: https: // gist .github.com/1292705 –

+1

Bạn quên tác vụ 'enable'! –

5

sản xuất Mỹ triển khai thường theo quy trình này:

  1. cap production deploy:web:disable mà chỉ đạo tất cả các yêu cầu tới một trang duy trì tĩnh
  2. cap production deploy
  3. di cư vv, kiểm tra mỗi máy chủ riêng để đảm bảo mọi thứ là OK
  4. cap production deploy:web:enable để làm cho trang web hoạt động bình thường

Câu trả lời của John Topley cung cấp cho bạn một số thông tin chuyên sâu ở đây.

Các vấn đề liên quan