关于http:如何在Apache 2.x中使用mod_deflate预压缩文件?

关于http:如何在Apache 2.x中使用mod_deflate预压缩文件?

How can I pre-compress files with mod_deflate in Apache 2.x?

我正在使用Content-Encoding: zip通过apache提供所有内容,但是会即时压缩。 我的大部分内容是磁盘上的静态文件。 我想事先对文件进行gzip压缩,而不是每次请求时都压缩它们。

我相信mod_gzip是自动在Apache 1.x中完成的,但是旁边只有.gz文件。 mod_deflate不再是这种情况。


无论如何,此功能在mod_gzip中放错了位置。在Apache 2.x中,您可以通过内容协商来实现。具体来说,您需要使用Options指令启用MultiViews,并且需要使用AddEncoding指令指定编码类型。


要用非常简单的一行来回答我自己的问题,我在困惑中不见了:

1
Options FollowSymLinks MultiViews

我没有使用MultiViews选项。它位于Ubuntu默认的Web服务器配置中,因此请不要像我一样将其删除。

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

1
2
3
4
5
6
7
8
9
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

尽管
mod_negotiation提供预压缩文件。主要的困难在于,仅协商了对不存在的文件的请求。因此,如果同时存在foo.jsfoo.js.gz,则对/foo.js的响应将始终是未压缩的(尽管对于/foo的响应将正常工作)。

我找到的最简单的解决方案(来自Fran?ois Marier)是使用双文件扩展名重命名未压缩的文件,因此foo.js部署为foo.js.js,因此对/foo.js的请求在foo.js.js之间协商(无编码)和foo.js.gz(gzip编码)。

我将该技巧与以下配置结合在一起:

1
2
3
4
5
6
7
8
9
10
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>

我写了一篇文章,详细讨论了这种配置的原因以及一些替代方案。


恐怕MultiViews不能按预期工作:文档说Multiviews可以工作:"如果服务器收到对/ some / dir / foo的请求,如果/ some / dir启用了MultiViews,并且/ some / dir / foo不存在。 ..",换句话说:如果您在同一目录中有文件foo.js和foo.js.gz,即使激活了MultiViews,即使通过Windows传输了AcceptEncoding gzip标头,也不会导致发送.gz文件。浏览器(您可以通过临时禁用mod_deflate并使用HTTPFox监视响应来验证此行为)。

我不确定MultiViews是否可以解决此问题(也许您可以重命名原始文件,然后添加特殊的AddEncoding指令),但是我相信您可以构造一个mod_rewrite规则来处理此问题。


我有一个从源代码构建的Apache 2,发现必须在httpd.conf文件中修改以下内容:

将MultiViews添加到选项:

1
Options Indexes FollowSymLinks MultiViews

取消注释AddEncoding:

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

评论AddType:

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

mod_gzip也可以动态压缩内容。您可以通过实际登录到服务器并从shell进行压缩来预压缩文件。

1
2
3
4
cd /var/www/.../data/
for file in *; do
    gzip -c $file > $file.gz;
done;

我有很多大的.json文件。大多数读者都处于这种情况。预览答案没有讨论返回的"内容类型"。

我想要以下请求透明地返回带有" Content-Type:application / json"的预压缩文件,将Multiview与ForceType一起使用

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

1)文件必须重命名:" file.ext.ext"

2)Multiview在ForceType上效果很好

在文件系统中:

1
2
3
// Note there is no bigfile.json
(...)/bigfile.json.gz
(...)/bigfile.json.json

在您的apache配置中:

1
2
3
4
5
6
7
<Directory (...)>
    AddEncoding gzip .gz
    Options +Multiviews
    <Files *.json.gz>
        ForceType application/json
    </Files>
</Directory>

简短:)


您可以使用mod_cache代理内存或磁盘中的本地内容。我不知道mod_deflate是否可以正常工作。


推荐阅读

    linux管理磁盘命令?

    linux管理磁盘命令?,系统,情况,管理,设备,报告,单位,数据,信息,命令,磁盘,lin

    linux拼接文件命令?

    linux拼接文件命令?,文件,数据,命令,代码,时间,信息,系统,情况,管理,标准,Lin

    linux文件常用命令?

    linux文件常用命令?,工作,地址,信息,系统,命令,目录,标准,情况,管理,常用命

    文件写入linux命令?

    文件写入linux命令?,文件,命令,状态,系统,名称,时间,首次,数据,数字,内容,在l

    文件夹排序linux命令?

    文件夹排序linux命令?,系统,数字,信息,工作,时间,命令,管理,设备,单位,工具,

    linux磁盘切换命令?

    linux磁盘切换命令?,系统,情况,管理,工作,电脑,单位,工具,信息,名称,地址,lin

    linux打开文件夹命令?

    linux打开文件夹命令?,工作,系统,信息,命令,图片,文件,管理,发行,名字,名称,

    linux上清空文件命令?

    linux上清空文件命令?,系统,命令,文件夹,名字,档案,文件,目录,方法,终端,指

    linux中历史命令文件?

    linux中历史命令文件?,系统,地址,信息,数字,时间,命令,数据,环境,历史,文件,l

    linux磁盘挂盘命令?

    linux磁盘挂盘命令?,系统,数据,信息,电脑,设备,情况,磁盘,命令,盘中,适当,如

    linux命令拷贝文件?

    linux命令拷贝文件?,系统,文件,命令,目录,情况,源文件,目标,文件夹,选项,语

    linux命令被替换文件?

    linux命令被替换文件?,系统,文件,命令,批量,工具,电脑,工作,保险,实时,字符

    如何在linux执行命令?

    如何在linux执行命令?,单位,电脑,命令,系统,基础,发行,工具,工作,信息,文件,m

    linux磁盘区别命令?

    linux磁盘区别命令?,信息,系统,工具,情况,管理,号码,电脑,地址,环境,单位,lin

    压缩文件夹命令linux?

    压缩文件夹命令linux?,系统,软件,命令,工具,电脑,文件,文件名,格式,选项,目

    linux配置文件夹命令?

    linux配置文件夹命令?,地址,系统,工作,信息,命令,标准,服务,名称,位置,文件,l

    linux磁盘划分命令?

    linux磁盘划分命令?,管理,情况,系统,信息,工具,单位,分区,命令,技术,名称,lin

    linux管理文件的命令?

    linux管理文件的命令?,系统,管理,工作,命令,信息,基础,目录,工具,文件,操作,l

    linux命令添加磁盘?

    linux命令添加磁盘?,系统,管理,信息,情况,电脑,数据,磁盘,命令,环境,工作,Lin

    linux文件链接命令?

    linux文件链接命令?,系统,工作,地址,命令,网络,信息,工具,基础,管理,目录,lin