服务器实时压缩
约 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");
});
压缩中间件参数详解
参数 | 类型 | 默认值 | 说明 |
---|---|---|---|
level | Integer | -1 (Z_DEFAULT_COMPRESSION) | 压缩级别(0-9) |
memLevel | Integer | 8 | 内存使用级别(1-9) |
strategy | Integer | 0 (Z_DEFAULT_STRATEGY) | 压缩策略 |
threshold | Number/String | 0 | 最小压缩大小(字节或字符串如'1kb') |
filter | Function | 默认过滤文本类型 | 自定义压缩过滤函数 |
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 配置参数详解
指令 | 值类型 | 默认值 | 说明 |
---|---|---|---|
gzip | on/off | off | 启用/禁用 Gzip 压缩 |
gzip_http_version | 1.0/1.1 | 1.1 | 最小 HTTP 版本要求 |
gzip_comp_level | 1-9 | 1 | 压缩级别(越高压缩率越大但 CPU 消耗越高) |
gzip_min_length | 字节数 | 20 | 最小压缩文件大小 |
gzip_proxied | 多种选项 | off | 对代理请求的压缩行为 |
gzip_vary | on/off | off | 是否添加"Vary: Accept-Encoding"头 |
gzip_types | MIME 类型列表 | text/html | 指定压缩的文件类型 |
gzip_static | on/off/always | off | 优先使用预压缩文件(.gz) |
gunzip | on/off | off | 为不支持 Gzip 的客户端解压 |
gzip_buffers | number size | 32 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
浏览器开发者工具检查
- 打开 Chrome 开发者工具(F12)
- 切换到 Network 标签
- 刷新页面
- 点击任意资源文件,查看响应头:
- 应有
content-encoding: gzip
- 比较
Content-Length
和资源实际大小
- 应有
文件大小对比检查
# 原始文件大小
ls -lh dist/main.js
# Gzip压缩后大小
ls -lh dist/main.js.gz
更新日志
2025/8/24 08:17
查看所有更新日志
e7112
-1于