Ruby on rails 在服务器上执行修改时,Ruby/Rails显示常规屏幕

Ruby on rails 在服务器上执行修改时,Ruby/Rails显示常规屏幕,ruby-on-rails,ruby-on-rails-plugins,Ruby On Rails,Ruby On Rails Plugins,我有一个运行服务器的ruby on rails应用程序,有时需要将其关闭以进行更新/等等。现在,我看到的一种方法是在更新期间(当应用程序关闭时)有一个通用显示屏就是替换/srv/www/目录中的文件,让它在用户可能导航到的任何地方显示一个通用屏幕。我还想过使用一个中央控制器文件来连接所有其他文件(基本上是一个主文件),但这对于rails来说似乎是违反直觉的 有许多指向网站不同组件的外部链接,用户可以从外部导航到这些组件,我需要确保当应用程序关闭一小会儿时,他们总是收到这个通用更新屏幕 我想知道是

我有一个运行服务器的ruby on rails应用程序,有时需要将其关闭以进行更新/等等。现在,我看到的一种方法是在更新期间(当应用程序关闭时)有一个通用显示屏就是替换/srv/www/目录中的文件,让它在用户可能导航到的任何地方显示一个通用屏幕。我还想过使用一个中央控制器文件来连接所有其他文件(基本上是一个主文件),但这对于rails来说似乎是违反直觉的

有许多指向网站不同组件的外部链接,用户可以从外部导航到这些组件,我需要确保当应用程序关闭一小会儿时,他们总是收到这个通用更新屏幕

我想知道是否有人有其他想法。。。。也许是图书馆之类的,我似乎在网上找不到任何东西。如有任何建议,将不胜感激


谢谢

我将配置您的Web服务器(nginx或apache)以查找maintenance.html页面,如果存在,则提供503状态。因此,下载应用程序的每个URL非常简单,只需上传一个.html文件,完成后将其删除即可


有关更多信息,请参阅和

Capistrano有一系列用于显示维护页面的内置方法,并与git/subversion完全集成。使部署和管理变得轻而易举。

我使用此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
最后一步是使用一些指令配置Apache虚拟主机,以查找
maintenance.html
文件,并将所有请求重定向到该文件(如果存在):

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

重新启动发动机
#将所有请求重定向到维护页面(如果存在)
重写条件%{REQUEST\u URI}!\。(css | gif | jpg | png)$
重写cond%{DOCUMENT_ROOT}/system/maintenance.html-f
重写cond%{SCRIPT_FILENAME}!maintenance.html
重写规则^.*$/system/maintenance.html[L]

要将应用程序置于维护模式,请运行
cap deploy:web:disable
,并使其重新启动,请执行
cap deploy:web:enable

谢谢John,请参阅我下面的评论。我尝试设置此应用程序时遇到了一些问题。apache似乎没有重定向到维护页面。我正在使用mongrel+apache运行该应用程序,在阅读了许多网站后,我仍然不确定。正如您所说,我在apache中配置了一个虚拟主机,它位于特定的端口上,出于某种原因,无论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>