开启时机
何时需要开启GZIP压缩:
- 针对大文件和重复性高的内容进行压缩。对于文本内容(HTML、CSS、JavaScript等)尤其明显。
- 在带宽成本较高、或对传输速度要求较高的场景下,启用GZIP压缩可以节省带宽和缩短响应时间。
- 当客户端绝大多数支持GZIP压缩时(现代浏览器和APP通常都支持)。
CPU与带宽取舍:
采用GZIP压缩,会增加一定的CPU消耗,但同时也能大幅降低带宽需求。如何取舍取决于实际场景。
- 如果带宽成本较高或需要降低传输时间,可以选择更高的压缩级别,但需注意CPU消耗的增加。
- 如果CPU资源有限,可以选择较低的压缩级别以减少CPU负担,但压缩率相对较低。
通常情况下,默认的压缩级别(如Nginx的gzip_comp_level 5或Node.js compression模块的默认级别)可以实现较好的平衡。
开启方式
要在服务器端开启GZIP压缩,可以按照以下步骤操作:
一、Nginx配置开启
-
首先确保Nginx已经安装了GZIP模块。可以使用
nginx -V
命令查看。 -
在
http
或server
区域内添加以下配置代码:
gzip on; # 开启gzip
gzip_min_length 1k; # 数据大小超过1k时才压缩
gzip_buffers 4 16k; # 申请4个单位为16K的内存作为压缩结果流缓存
gzip_http_version 1.1; # 根据需要设置GZIP压缩的HTTP版本
gzip_comp_level 2; # 设置压缩级别(1-9),级别越高,压缩率越大,但需要更多的CPU资源
gzip_types text/plain application/x-javascript text/css application/xml application/javascript image/jpeg image/png image/gif; # 需要压缩的MIME类型
gzip_vary on; # 是否需要在响应头中添加压缩提示
gzip_disable "MSIE [1-6]\."; # 根据需要设置禁用GZIP压缩的浏览器
- 重启Nginx使配置生效:
sudo service nginx restart
或者sudo systemctl restart nginx
。
二、Node.js服务端开启 (Express)
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/json
</IfModule>
-
使用
npm
安装compression
中间件:npm install compression
-
在你的Express代码中添加以下代码:
-
const compression = require('compression'); // 引入compression模块 const express = require('express'); const app = express(); app.use(compression()); // 使用compression中间件启用GZIP压缩
- 现在你的Node.js服务器会使用GZIP压缩响应数据。
-
三、Apache开启
-
确保已安装
mod_deflate
模块,并在配置文件中启用:LoadModule deflate_module modules/mod_deflate.so
-
在
httpd.conf
或.htaccess
文件中添加以下代码: - 重启Apache使配置生效:
sudo service httpd restart
或者sudo systemctl restart httpd
。
Android客户端如何配合:
- 在发送请求时,需要在请求头中添加
Accept-Encoding: gzip
。这样服务器会知道客户端支持GZIP压缩,并将压缩后的数据发送给客户端。 - 接收到服务器响应后,首先检查响应头中是否包含
Content-Encoding: gzip
。如果包含,则表示数据是经过GZIP压缩的。 - 对收到的GZIP压缩数据进行解压缩。可以使用Android内置的
java.util.zip.GZIPInputStream
类进行解压缩。示例如下:
// 假设response是服务器返回的响应
InputStream inputStream;
// 检查Content-Encoding是否为gzip
if ("gzip".equalsIgnoreCase(response.header("Content-Encoding"))) {
inputStream = new GZIPInputStream(response.body().byteStream());
} else {
inputStream = response.body().byteStream();
}
// 接下来可以使用inputStream读取解压后的数据