压缩来自Rails应用程序的JSON响应

时间:2011-01-26 17:33:09

标签: ruby-on-rails json apache2 gzip

我们有一个应用程序可以查询客户的位置。我们已经达到了一些客户可能拥有超过10,000个位置的程度。对此的JSON响应可能会非常大,有时会超过1mb。

我首先想知道压缩这个的最佳方法。我们在使用JRuby在trinidad中运行的Rails应用程序前面有apache。我可以设置mod_deflate以始终压缩application / json的任何响应吗?我该怎么做呢?

接下来,对gzip的json有什么浏览器支持?当我gzip一个200k的样本响应时,它下降到30k。这是一笔可观的节省。我们真的希望能够最小化响应的大小,而不必最小化返回的位置数。

4 个答案:

答案 0 :(得分:11)

通常,对于较新版本的Rails,您可以通过添加

来实现
use Rack::Deflater

config.ru 文件中的“运行”行之前。这将与支持gzip的浏览器/客户端完美配合。我们在主要网站上使用它。

JRuby用户的

注意:这假设您的Rails应用程序是通过Rack启动的,它通常不适用于JRuby。您需要最新版本的JRuby-Rack并在Warbler中配置它以“机架”模式而不是“轨道”模式运行。

答案 1 :(得分:5)

如果浏览器支持gzip / deflated数据,那么JSON会很好地完成它。 AJAX数据只是代表脚本而不是人类的常规HTTP请求。在HTTP级别,传输一些HTML或JSON字符串之间绝对没有区别 - 它只是数据。

答案 2 :(得分:1)

对于Google员工...... [我正在运行Apache 2.2.16并且不关心IE6]

使用Content-Encoding = gzip的JSON响应在我编辑mod_deflate.conf以包含此内容之前没有发生:

 AddOutputFilterByType DEFLATE application/json

您可以使用Firefox / Firebug / Net选项卡检查服务器响应标头

答案 3 :(得分:0)

首先,确保通过运行此命令安装了apache的mod_deflate。

a2enmod deflate

如果安装了此命令,请重启apache。如果没有,你现在很好。

service apache2 restart

通常位于apache2.conf的{​​{1}}将此行附加到文件末尾。这将包括我们稍后将创建的文件。

/etc/apache2

接下来,我们将使用以下选项编辑mod_deflate.conf:

Include mod_deflate.conf

第一个代码块禁用gzipping exes,gzs,pdfs ..等等

第二个代码块会从不支持它的浏览器中跳过通缩。

最后,再次重启apache

SetOutputFilter DEFLATE
SetEnvIfNoCase Request_URI \
    \.(?:exe|t?gz|zip|bz2|sit|rar)$ \
    no-gzip dont-vary
SetEnvIfNoCase Request_URI \.pdf$ no-gzip dont-vary

#Skip browsers with known problems
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

设置是从以下链接复制的: http://www.howtoforge.com/apache2_mod_deflate