接口开启GZIP压缩

开启时机

何时需要开启GZIP压缩:

  1. 针对大文件和重复性高的内容进行压缩。对于文本内容(HTML、CSS、JavaScript等)尤其明显。
  2. 在带宽成本较高、或对传输速度要求较高的场景下,启用GZIP压缩可以节省带宽和缩短响应时间。
  3. 当客户端绝大多数支持GZIP压缩时(现代浏览器和APP通常都支持)。

CPU与带宽取舍:

采用GZIP压缩,会增加一定的CPU消耗,但同时也能大幅降低带宽需求。如何取舍取决于实际场景。

  1. 如果带宽成本较高或需要降低传输时间,可以选择更高的压缩级别,但需注意CPU消耗的增加。
  2. 如果CPU资源有限,可以选择较低的压缩级别以减少CPU负担,但压缩率相对较低。

通常情况下,默认的压缩级别(如Nginx的gzip_comp_level 5或Node.js compression模块的默认级别)可以实现较好的平衡。

开启方式

要在服务器端开启GZIP压缩,可以按照以下步骤操作:

一、Nginx配置开启

  1. 首先确保Nginx已经安装了GZIP模块。可以使用nginx -V命令查看。

  2. httpserver区域内添加以下配置代码:

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压缩的浏览器
  1. 重启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>
  1. 使用 npm 安装 compression 中间件: npm install compression

  2. 在你的Express代码中添加以下代码:

  3. const compression = require('compression'); // 引入compression模块
    const express = require('express');
    const app = express();
    
    app.use(compression()); // 使用compression中间件启用GZIP压缩
    
  4. 现在你的Node.js服务器会使用GZIP压缩响应数据。
  5. 三、Apache开启

  6. 确保已安装mod_deflate模块,并在配置文件中启用:LoadModule deflate_module modules/mod_deflate.so

  7. httpd.conf.htaccess文件中添加以下代码:

  8. 重启Apache使配置生效:sudo service httpd restart 或者 sudo systemctl restart httpd 。

Android客户端如何配合:

  1. 在发送请求时,需要在请求头中添加Accept-Encoding: gzip。这样服务器会知道客户端支持GZIP压缩,并将压缩后的数据发送给客户端。
  2. 接收到服务器响应后,首先检查响应头中是否包含Content-Encoding: gzip。如果包含,则表示数据是经过GZIP压缩的。
  3. 对收到的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读取解压后的数据
  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值