19

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

我有一些几乎没有变化的静态站点,如果已经编写了 html,运行速度会更快,而不是要求一位访问者访问该站点。

而不是自己创建这个(看起来很容易,但它的优先级很低)它是否已经存在?

4

4 回答 4

19

您可以使用wget或其他程序来抓取该站点。事实上,这种场景在其手册页中被提及为一种用途:

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

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

-r 选项是递归检索,-nd 选项是不创建目录。

于 2009-02-12T23:22:48.000 回答
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

于 2009-06-03T02:14:40.997 回答
2

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

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

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

于 2009-02-13T01:25:27.423 回答
2

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

查看spider_test rails 插件,了解在测试中执行此操作的简单方法。

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

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/'
于 2009-04-21T18:55:36.983 回答