部署时的“预热缓存”

19

我想知道是否有任何插件或capistrano recipes可以通过在部署之前或本地构建所有页面缓存的HTML来预热Rails应用程序的页面缓存。

我有一些基本上不怎么变化的静态站点,如果HTML已经写好,而不是需要一个访问者访问网站,它们会运行得更快。

不想自己创建这个(似乎很容易但优先级很低),它是否已经存在?

4个回答

19

您可以使用 wget 或另一个程序来爬取网站。实际上,在其手册页面中提到了这种情况作为其用途之一:

This option tells Wget to delete every single file it downloads, after having done so. It is useful for pre-fetching popular pages through a proxy, e.g.:

   wget -r -nd --delete-after http://whatever.com/~popular/page/

The -r option is to retrieve recursively, and -nd to not create directories.


是的,我们在部署脚本中有一些curl请求,不仅用于预热缓存,还用于使服务器运行起来(例如,对nginx+passenger的第一个请求可能需要40秒左右)。 - tardate

4

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

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

请查看http://gist.github.com/122738

我更喜欢使用Rails这种方法。例如,通常情况下,由于恶意页面抓取,我会禁用wget作为所有页面的客户端。 - dc10
我不确定是哪个版本的rails引入了这个更改,但是在rails 4.2上,我需要 require 'action_dispatch/testing/integration' 然后用 app = ActionDispatch::Integration::Session.new Rails.application 初始化。 - andialles

2
我设置了集成测试,以确认站点所有主要区域都可用(总共几百页)。它们不会执行任何更改数据的操作 - 只是获取页面和表单。
目前我在部署生产实例时不运行这些测试,但是现在你提到了它,这可能是个好主意。
另一个选择是拉取站点地图中出现的每个页面(如果您有一个站点地图的话,您可能应该有一个)。编写一个能够完成此操作的 gem / rake 脚本应该非常容易。

2
这段话的意思是:通过预加载的方式,通常使用定时任务(cron job)在太平洋时间晚上10点开始,到东部时间早上6点结束,这是一个很好的负载均衡网站的方法。可以查看spider_test rails plugin来了解如何在测试中简单地实现这一点。如果你要使用上面的wget命令,需要添加--level=、--no-parent、--wait=SECONDS和--waitretry=SECONDS选项来限制负载,并且最好记录并捕获头部响应以进行诊断或分析(如果需要,可以更改路径)。
wget -r --level=5 --no-parent --delete-after \
  --wait=2 --waitretry=10  \
  --server-response        \
  --append-output=/tmp/spidering-`date "+%Y%m%d"`.log
  'http://whatever.com/~popular/page/'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接