如何在Apache 2.x中使用mod_deflate预压缩文件?
我通过Apache提供的所有内容Content-Encoding: zip
,但即时压缩。我的内容很多都是磁盘上的静态文件。我想事先对文件进行gzip压缩,而不是在每次请求时压缩它们。如何在Apache 2.x中使用mod_deflate预压缩文件?
这是我认为mod_gzip
自动在Apache 1.x中执行的操作,但只是在它旁边有.gz文件。 mod_deflate
不再是这种情况。
无论如何,这个功能在mod_gzip中是错误的。在Apache 2.x中,you do that with content negotiation。具体而言,您需要启用MultiViews
和Options
directive,您需要使用AddEncoding
directive指定您的编码类型。
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
mod_gzip压缩内容。您可以通过实际登录到服务器来预压缩这些文件,并从shell中执行此操作。
cd /var/www/.../data/
for file in *; do
gzip -c $file > $file.gz;
done;
这将删除原始文件,这意味着没有Aceept-Encoding的客户端:gzip将不会被服务。 – Otto 2008-09-18 21:22:53
要回答我的问题与非常简单的线条,我在我的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
我从源的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
我预期恐怕多视图将无法正常工作:对医生说在Multiviews作品“如果服务器收到/一些/目录/ foo的请求,如果/ some/dir启用了MultiView,并且/ some/dir/foo不存在...“,换句话说:如果在同一个目录中有一个文件foo.js和foo.js.gz,即使AcceptEncoding gzip头由浏览器传输,MultiViews也不会导致发送.gz文件(您可以验证此行为通过临时禁用mod_deflate并用例如是HttpFox)。
我不知道是否有解决方案与MultiViews(也许你可以重命名原始文件,然后添加一个特殊的AddEncoding指令),但我相信你可以构造一个mod_rewrite规则来处理这个。
我有很多大的.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>
简短:)
有可能使用mod_negotiation
虽然这是一个有点挑剔服务预压缩文件。主要困难是only requests for files which do not exist are negotiated。因此,如果foo.js
和foo.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其中讨论了推理这种配置,并详细一些替代品。
虽然我不认为你会节省很多;使用现代Web服务器,动态压缩内容的成本可以忽略不计。 – Aeon 2008-09-19 00:14:56
我在Xen虚拟机上运行Web服务器,所以我想为其他虚拟机保留尽可能多的CPU。 另外,我可以将预先压缩的55k文件中使用httperf测量的请求率与实时压缩相比翻倍。 – Otto 2008-09-19 23:35:23
请参阅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