如何在Ruby on Rails中启用压缩?

25

我在这里发布了一个类似的问题

使用 Rack-Zippy 在 Heroku 中提供压缩文件

但是我决定放弃那项服务,因为我无法让它正常工作。

我在我的网站上运行了 PageSpeed Insights 来确定我的网站速度。

我收到的最重要的建议是启用压缩。

Compressing resources with gzip or deflate can reduce the number of bytes sent over the network.
Enable compression for the following resources to reduce their transfer size by 191.2KiB 
(74% reduction).

我已按照这个网站的说明进行操作:

https://developers.google.com/speed/docs/insights/EnableCompression

它说要查阅您的Web服务器文档以了解如何启用压缩:

我使用这个网站来确定我的Web服务器:

http://browserspy.dk/webserver.php

结果显示我的Web服务器是WEBrick。

PageSpeed Insights页面仅列出以下3个服务器:

Apache: Use mod_deflate
Nginx: Use ngx_http_gzip_module
IIS: Configure HTTP Compression

我搜索了有关WEBrick服务器gzip压缩的文档,但是没有找到任何内容。

我搜索了如何在Rails中启用压缩,但是找不到任何内容。这就是为什么我在这里问的原因。

我尝试使用Rack Zippy,但是放弃了。

现在,我甚至不知道该从哪里开始。我的第一步是找出我应该做什么。

编辑

我遵循Ahmed的建议使用了Rack::Deflator

我通过运行确认了我已经使用它了

rake middleware
=> use Rack::Deflator

然后

git add .
git commit -m '-'
git push heroku master

不幸的是,PageSpeed仍然显示需要进行压缩。我通过进入开发者工具 << 网络设置 并刷新页面来确认了这一点。每个资源的大小和内容都几乎相同,这意味着文件没有被压缩。

我的文件中有什么问题吗?

谢谢你的帮助。

这是我的完整config/application.rb文件。

require File.expand_path('../boot', __FILE__)

require 'rails/all'

Bundler.require(*Rails.groups)

module AppName
  class Application < Rails::Application

    config.middleware.use Rack::Deflater
    config.assets.precompile += %w(*.png *.jpg *.jpeg *.gif)
    config.exceptions_app = self.routes

    config.cache_store = :memory_store

  end
end

如果有问题,源代码很可能出现了错误,对吗?

我需要安装deflator宝石吗?

3个回答

35

4
在再次运行 PageSpeed 后,我仍然收到需要启用压缩的相同消息。此外,使用 PageSpeed 和 Network,我的大小和内容仍然基本相同。感谢您的回复,因此您得到了我的投票。谢谢您的时间。 - Darkmouse
1
尽管heroku-deflater的最后更新日期为2013年12月16日,但它仍然可以解决问题。 - Trantor Liu
哇,仅通过安装这个宝石(gem),文档大小现在已经减小到原来的三分之一。太好了 - 谢谢。 - AndreiMotinga
有人能告诉我这里的 YourApp 是什么意思吗?我应该放应用程序的名称还是...? - Kick Buttowski
1
@KickButtowski,你应该在 config/application.rb 中找到已经存在的模块和类。你只需要添加一个配置行。 - Ahmed
显示剩余2条评论

20

Rack::Deflater应该通过使用insert_before(而不是"use")使其靠近中间件堆栈的顶部,在任何可能发送响应的其他中间件之前。 .use将其放置在堆栈的底部。在我的机器上,最顶部的中间件是Rack::Sendfile。因此,我会使用:

config.middleware.insert_before(Rack::Sendfile, Rack::Deflater)

你可以通过在命令行中执行rake middleware来按照加载顺序获取中间件列表。

注意:关于在Rack中配置中间件堆栈使用insert_before和Use的好链接


我添加了一个链接,其中介绍了使用insert_before(而不是“use”)的方法,将其放置在中间件堆栈的顶部附近。希望您对此满意 - Kick Buttowski

4
根据 Rack::Deflater作者,在 Rails 应用中应该将其放置在 ActionDispatch::Static 之后。原因是,如果您的应用还提供静态资源服务(例如,在 Heroku 上),当从磁盘提供资源时,它们已经被压缩。如果将其插入到该位置之前,则只会导致Rack::Deflater 尝试重新压缩这些资源。因此,作为性能优化:
# application.rb

config.middleware.insert_after ActionDispatch::Static, Rack::Deflater


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