Ruby on rails &引用;“预热缓存”;部署时

Ruby on rails &引用;“预热缓存”;部署时,ruby-on-rails,ruby,deployment,caching,capistrano,Ruby On Rails,Ruby,Deployment,Caching,Capistrano,我想知道是否有人有任何插件或capistrano配方可以通过在部署时构建所有页面缓存的html,或在部署之前在本地为rails应用程序“预热”页面缓存 我有一些基本上是静态的站点,它们变化不大,如果html已经编写好,运行速度会更快,而不需要一个访问者访问该站点 与其自己创建这个(看起来很简单,但优先级较低),它是否已经存在?您可以使用wget或其他程序对站点进行爬虫。事实上,这类场景在其手册页面中被称为用途之一: 这个选项告诉Wget在下载完每个文件后删除它下载的每个文件。它对于通过代理预取常

我想知道是否有人有任何插件或capistrano配方可以通过在部署时构建所有页面缓存的html,或在部署之前在本地为rails应用程序“预热”页面缓存

我有一些基本上是静态的站点,它们变化不大,如果html已经编写好,运行速度会更快,而不需要一个访问者访问该站点


与其自己创建这个(看起来很简单,但优先级较低),它是否已经存在?

您可以使用
wget
或其他程序对站点进行爬虫。事实上,这类场景在其手册页面中被称为用途之一:

这个选项告诉Wget在下载完每个文件后删除它下载的每个文件。它对于通过代理预取常用页面非常有用,例如:

   wget -r -nd --delete-after http://whatever.com/~popular/page/
-r选项用于递归检索,而-nd选项用于不创建目录


我已经设置了集成测试,确认站点的所有主要区域都可用(总共几百页)。他们不做任何改变数据的事情——只需收回页面和表单

我目前在部署我的生产实例时没有运行它们,但现在您提到了这一点——这实际上可能是一个好主意

另一种选择是拉取站点地图中显示的每个页面(如果您有一个页面,您可能应该这样做)。编写这样的gem/rake脚本应该很容易。

通过这种方式预加载——通常,cron作业从太平洋时间晚上10点开始,到东部时间早上6点结束——是一种很好的平衡站点负载的方法

请查看,以获取在测试中执行此操作的简单方法

如果要使用上面的wget,请添加--level=、--no parent、--wait=SECONDS和--waitretry=SECONDS选项来限制负载,您还可以记录并捕获头响应以进行诊断或分析(如果需要,请更改/tmp的路径):


我每天晚上都使用类似这样的rake任务刷新页面缓存的站点地图:

 require 'action_controller/integration'
 ActionController::Base::expire_page("/sitemap.xml")   
 app = ActionController::Integration::Session.new
 app.host = "notexample.com"
 app.get("/sitemap.xml")

请参见

是的,我们的部署脚本中有一些curl请求,不仅是为了预热缓存,而且只是为了让服务器启动并运行(例如,对nginx+乘客的第一个请求可能需要40秒左右),我更喜欢使用rails的这种方法。例如,一般来说,由于恶意页面刮取,我禁用了所有页面的wget作为客户端。我不确定是哪个rails版本引入了此更改,但在rails 4.2上,我需要
要求“action\u dispatch/testing/integration”
然后用
app=ActionDispatch::integration::Session.new rails.application初始化
 require 'action_controller/integration'
 ActionController::Base::expire_page("/sitemap.xml")   
 app = ActionController::Integration::Session.new
 app.host = "notexample.com"
 app.get("/sitemap.xml")