2008-09-16 84 views
34

我通过Apache提供的所有内容Content-Encoding: zip,但即时压缩。我的内容很多都是磁盘上的静态文件。我想事先对文件进行gzip压缩,而不是在每次请求时压缩它们。如何在Apache 2.x中使用mod_deflate预压缩文件?

这是我认为mod_gzip自动在Apache 1.x中执行的操作,但只是在它旁边有.gz文件。 mod_deflate不再是这种情况。

+0

虽然我不认为你会节省很多;使用现代Web服务器,动态压缩内容的成本可以忽略不计。 – Aeon 2008-09-19 00:14:56

+2

我在Xen虚拟机上运行Web服务器,所以我想为其他虚拟机保留尽可能多的CPU。 另外,我可以将预先压缩的55k文件中使用httperf测量的请求率与实时压缩相比翻倍。 – Otto 2008-09-19 23:35:23

+0

请参阅http://stackoverflow.com/questions/9076752/how-to-force-apache-to-use-manually-pre-compressed-gz-file-of-css-and-js-files?lq=1 – 2016-01-27 18:36:01

回答

13

无论如何,这个功能在mod_gzip中是错误的。在Apache 2.x中,you do that with content negotiation。具体而言,您需要启用MultiViewsOptions directive,您需要使用AddEncoding directive指定您的编码类型。

+0

http://stackoverflow.com/questions/9076752/how-to-force-apache-to-use-manually-pre-compressed-gz-file-of-css-and-js-files?lq=1 – 2016-01-27 18:37:18

0

您可以使用mod_cache代理内存或磁盘上的本地内容。我不知道这是否会像mod_deflate一样按预期工作。

1

mod_gzip压缩内容。您可以通过实际登录到服务器来预压缩这些文件,并从shell中执行此操作。

cd /var/www/.../data/ 
for file in *; do 
    gzip -c $file > $file.gz; 
done; 
+0

这将删除原始文件,这意味着没有Aceept-Encoding的客户端:gzip将不会被服务。 – Otto 2008-09-18 21:22:53

8

要回答我的问题与非常简单的线条,我在我的confiuration丢失:

Options FollowSymLinks MultiViews 

我错过MultiViews选项。它在Ubuntu默认的Web服务器配置中,所以不要像我一样放弃它。

另外我写了一个快速的Rake任务来压缩所有的文件。

namespace :static do 
    desc "Gzip compress the static content so Apache doesn't need to do it on-the-fly." 
    task :compress do 
     puts "Gzipping js, html and css files." 
     Dir.glob("#{RAILS_ROOT}/public/**/*.{js,html,css}") do |file| 
      system "gzip -c -9 #{file} > #{file}.gz" 
     end 
    end 
end 
4

我从源的Apache 2的建成,我发现我已经修改我在的httpd.conf以下文件:

添加多视图到选项:

Options Indexes FollowSymLinks MultiViews 

取消注释加入编码:

AddEncoding x-compress .Z 
AddEncoding x-gzip .gz .tgz 

评论将AddType:

#AddType application/x-compress .Z 
#AddType application/x-gzip .gz .tgz 
4

我预期恐怕多视图将无法正常工作:对医生说在Multiviews作品“如果服务器收到/一些/目录/ foo的请求,如果/ some/dir启用了MultiView,并且/ some/dir/foo不存在...“,换句话说:如果在同一个目录中有一个文件foo.js和foo.js.gz,即使AcceptEncoding gzip头由浏览器传输,MultiViews也不会导致发送.gz文件(您可以验证此行为通过临时禁用mod_deflate并用例如是HttpFox)。

我不知道是否有解决方案与MultiViews(也许你可以重命名原始文件,然后添加一个特殊的AddEncoding指令),但我相信你可以构造一个mod_rewrite规则来处理这个。

0

我有很多大的.json文件。大多数读者都在这种情况下。预览答案没有提到返回的“内容类型”。

我想要以下请求返回与压缩前的文件“内容类型:应用程序/ JSON的”透明,使用多视点与ForceType指令

http://www.domain.com/(...)/bigfile.json 
-> Content-Encoding:gzip, Content-Type: Content-Encoding:gzip 

1)文件必须重新命名:“file.ext .EXT”

2)多视角的伟大工程与ForceType指令

在文件系统:

// Note there is no bigfile.json 
(...)/bigfile.json.gz 
(...)/bigfile.json.json 

在你的Apache配置:

<Directory (...)> 
    AddEncoding gzip .gz 
    Options +Multiviews 
    <Files *.json.gz> 
     ForceType application/json 
    </Files> 
</Directory> 

简短:)

3

有可能使用mod_negotiation虽然这是一个有点挑剔服务预压缩文件。主要困难是only requests for files which do not exist are negotiated。因此,如果foo.jsfoo.js.gz都存在,则对/foo.js的响应将始终未压缩(尽管对/foo的响应可以正常工作)。

我发现最简单的解决办法(from François Marier)是具有双重文件扩展名重命名未压缩的文件,从而为foo.js.js所以/foo.js请求之间foo.js.js(无编码)和foo.js.gz(gzip编码)协商foo.js部署。

结合我那招具有以下配置:

Options +MultiViews 
RemoveType .gz 
AddEncoding gzip .gz 

# Send .tar.gz without Content-Encoding: gzip 
<FilesMatch ".+\.tar\.gz$"> 
    RemoveEncoding .gz 
    # Note: Can use application/x-gzip for backwards-compatibility 
    AddType application/gzip .gz 
</FilesMatch> 

wrote a post其中讨论了推理这种配置,并详细一些替代品。

相关问题