Skip to main content

11.压缩和解压

压缩服务器响应,或为不支持压缩的客户端解压缩它们,以提高传递速度并减少服务器上的开销。 压缩响应通常会显著减小传输数据的大小。但是,由于压缩发生在运行时,因此也会增加相当大的处理开销,从而对性能产生负面影响。NGINX在向客户端发送响应之前执行压缩,但不会“双重压缩”已经压缩的响应(例如,由代理服务器)。

启用压缩(Enabling Compression)

要启用压缩,请包含带有 on参数的 gzip 指令。

gzip on;

默认情况下,NGINX 仅压缩 MIME 类型 text/html的响应。要使用其他 MIME 类型压缩响应,请包括 gzip_types 指令并列出其他类型。

gzip_types text/plain application/xml;

若要指定要压缩的响应的最小长度,请使用 gzip_min_length 指令。默认值为 20 字节(此处调整为 1000):

gzip_min_length 1000;

默认情况下,NGINX 不会压缩对代理请求(来自代理服务器的请求)的响应。请求来自代理服务器的事实取决于请求中是否存在 Via标头字段。要配置这些响应的压缩,请使用 gzip_proxied 指令。该指令有许多参数,指定NGINX应该压缩哪些类型的代理请求。例如,仅压缩对不会在代理服务器上缓存的请求的响应是合理的。为此,gzip_proxied该指令具有指示 NGINX 检查响应中的 Cache-Control标头字段并在值为 no-cacheno-storeprivate时压缩响应的参数。此外,还必须包含 expiredExpires参数以检查Expires标头字段的值。以下示例中设置了这些参数以及检查 authAuthorization标头字段是否存在的参数(授权响应特定于最终用户,通常不会缓存):

gzip_proxied no-cache no-store private expired auth;

与大多数其他指令一样,配置压缩的指令可以包含在 http上下文中或 serverlocation配置块中。

gzip 压缩的整体配置可能如下所示。

server {
gzip on;
gzip_types text/plain application/xml;
gzip_proxied no-cache no-store private expired auth;
gzip_min_length 1000;
...
}

启用解压(Enabling Decompression)

某些客户端不支持使用 gzip编码方法的响应。同时,可能需要存储压缩数据,或者动态压缩响应并将其存储在缓存中。为了成功地为接受和不接受压缩数据的客户端提供服务,NGINX可以在将数据发送到后一种类型的客户端时即时解压缩数据。

要启用运行时解压缩,请使用 gunzip 指令。

location /storage/ {
gunzip on;
...
}

gunzip指令可以在与 gzip指令相同的上下文中指定:

server {
gzip on;
gzip_min_length 1000;
gunzip on;
...
}

请注意,此指令是在单独的模块中定义的,默认情况下,该模块可能不包含在开源版NGINX构建中。

发送压缩文件(Sending Compressed Files)

若要将文件的压缩版本而不是常规版本发送到客户端,请将 gzip_static 指令设置为 on 在适当的上下文中。

location / {
gzip_static on;
}

在这种情况下,为了处理 / path/to/ file 的请求,NGINX 会尝试查找并发送文件 / path/to/file.gz 。如果文件不存在,或者客户端不支持gzip,NGINX会发送文件的未压缩版本。

请注意,gzip_static该指令不启用动态压缩。它仅使用由任何压缩工具预先压缩的文件。要在运行时压缩内容(而不仅仅是静态内容),请使用 gzip该指令。

此指令在单独的模块中定义,默认情况下可能不包含在开源版NGINX构建中。