Skip to content

服务器实时压缩

约 679 字大约 2 分钟

2025-06-30

Node.js 服务器配置

Express 服务器详细配置

const express = require("express");
const compression = require("compression");
const zlib = require("zlib");

const app = express();

// 高级压缩配置
app.use(
  compression({
    level: zlib.constants.Z_BEST_COMPRESSION, // 压缩级别
    memLevel: 9, // 内存使用级别(1-9)
    strategy: zlib.constants.Z_DEFAULT_STRATEGY, // 压缩策略
    threshold: "10kb", // 最小压缩大小
    filter: (req, res) => {
      // 自定义过滤规则
      const type = res.getHeader("Content-Type") || "";
      const shouldCompress = /text|javascript|json|xml|font|svg/.test(type);

      if (req.headers["x-no-compression"]) {
        return false;
      }
      return shouldCompress;
    },
  })
);

// 静态文件服务(优先使用预压缩文件)
app.get("*.js", (req, res, next) => {
  if (req.acceptsEncodings("gzip")) {
    req.url = req.url + ".gz";
    res.set("Content-Encoding", "gzip");
    res.set("Content-Type", "application/javascript");
    res.set("Vary", "Accept-Encoding");
  }
  next();
});

app.use(express.static("dist"));

app.listen(3000, () => {
  console.log("Server running with Gzip compression");
});

压缩中间件参数详解

参数类型默认值说明
levelInteger-1 (Z_DEFAULT_COMPRESSION)压缩级别(0-9)
memLevelInteger8内存使用级别(1-9)
strategyInteger0 (Z_DEFAULT_STRATEGY)压缩策略
thresholdNumber/String0最小压缩大小(字节或字符串如'1kb')
filterFunction默认过滤文本类型自定义压缩过滤函数

Nginx 服务器详细配置

完整 Nginx Gzip 配置

http {
  # 基本Gzip配置
  gzip on;
  gzip_http_version 1.1;
  gzip_comp_level 6;
  gzip_min_length 1024;
  gzip_proxied any;
  gzip_vary on;

  # 压缩类型配置
  gzip_types
    text/plain
    text/css
    text/javascript
    text/xml
    application/javascript
    application/x-javascript
    application/json
    application/xml
    application/xml+rss
    application/vnd.ms-fontobject
    application/x-font-ttf
    font/opentype
    image/svg+xml;

  # 预压缩文件配置
  gzip_static on;
  gunzip on;

  # 禁用特定浏览器的Gzip
  gzip_disable "MSIE [1-6]\.";

  # 其他优化参数
  gzip_buffers 16 8k;
}

Nginx 配置参数详解

指令值类型默认值说明
gzipon/offoff启用/禁用 Gzip 压缩
gzip_http_version1.0/1.11.1最小 HTTP 版本要求
gzip_comp_level1-91压缩级别(越高压缩率越大但 CPU 消耗越高)
gzip_min_length字节数20最小压缩文件大小
gzip_proxied多种选项off对代理请求的压缩行为
gzip_varyon/offoff是否添加"Vary: Accept-Encoding"头
gzip_typesMIME 类型列表text/html指定压缩的文件类型
gzip_staticon/off/alwaysoff优先使用预压缩文件(.gz)
gunzipon/offoff为不支持 Gzip 的客户端解压
gzip_buffersnumber size32 4k/16 8k压缩缓冲区数量和大小

推荐的 Nginx 压缩类型

gzip_types
  text/plain
  text/css
  text/javascript
  text/xml
  text/x-component
  application/javascript
  application/x-javascript
  application/json
  application/xml
  application/xml+rss
  application/xhtml+xml
  application/rss+xml
  application/atom+xml
  application/vnd.ms-fontobject
  application/x-font-ttf
  application/x-font-opentype
  application/x-font-truetype
  font/eot
  font/opentype
  font/otf
  image/svg+xml
  image/x-icon;

验证 Gzip 是否生效

使用 curl 命令验证

curl -H "Accept-Encoding: gzip" -I http://yourserver.com/main.js

# 预期输出应包含:
# Content-Encoding: gzip
# Vary: Accept-Encoding

浏览器开发者工具检查

  1. 打开 Chrome 开发者工具(F12)
  2. 切换到 Network 标签
  3. 刷新页面
  4. 点击任意资源文件,查看响应头:
    • 应有content-encoding: gzip
    • 比较Content-Length和资源实际大小

文件大小对比检查

# 原始文件大小
ls -lh dist/main.js

# Gzip压缩后大小
ls -lh dist/main.js.gz

更新日志

2025/8/24 08:17
查看所有更新日志
  • e7112-1