Nginx Gzip压缩 #
一、压缩概述 #
1.1 为什么需要压缩 #
HTTP压缩可以显著减少传输数据量,提升网站加载速度:
- 减少带宽消耗
- 降低传输时间
- 提升用户体验
- 节省流量成本
1.2 压缩算法对比 #
| 算法 | 压缩率 | 压缩速度 | 浏览器支持 |
|---|---|---|---|
| Gzip | 中等 | 快 | 广泛 |
| Brotli | 高 | 中等 | 较新 |
| Deflate | 低 | 快 | 广泛 |
二、Gzip基本配置 #
2.1 最简配置 #
nginx
http {
gzip on;
gzip_types text/plain text/css application/json application/javascript;
}
2.2 完整配置 #
nginx
http {
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_min_length 1000;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types
text/plain
text/css
text/xml
text/javascript
application/json
application/javascript
application/xml
application/xml+rss
application/atom+xml
image/svg+xml
application/x-javascript;
gzip_disable "msie6";
}
三、Gzip参数详解 #
3.1 gzip #
nginx
gzip on;
gzip off;
3.2 gzip_comp_level #
压缩级别,1-9,级别越高压缩率越高但CPU消耗越大:
nginx
gzip_comp_level 1;
gzip_comp_level 6;
gzip_comp_level 9;
| 级别 | 压缩率 | CPU消耗 | 推荐场景 |
|---|---|---|---|
| 1 | 低 | 低 | CPU受限 |
| 4-6 | 中 | 中 | 一般场景 |
| 7-9 | 高 | 高 | 静态文件 |
3.3 gzip_min_length #
最小压缩大小,小于此值不压缩:
nginx
gzip_min_length 1000;
gzip_min_length 1k;
3.4 gzip_types #
压缩的MIME类型:
nginx
gzip_types text/plain text/css application/json application/javascript text/xml application/xml;
gzip_types *;
默认只压缩 text/html。
3.5 gzip_vary #
添加Vary头,告诉代理服务器根据Accept-Encoding缓存不同版本:
nginx
gzip_vary on;
3.6 gzip_proxied #
代理请求压缩策略:
nginx
gzip_proxied off;
gzip_proxied expired;
gzip_proxied no-cache;
gzip_proxied no-store;
gzip_proxied private;
gzip_proxied no_last_modified;
gzip_proxied no_etag;
gzip_proxied auth;
gzip_proxied any;
| 值 | 说明 |
|---|---|
| off | 不压缩代理请求 |
| expired | 压缩带Expires头的请求 |
| no-cache | 压缩带Cache-Control: no-cache的请求 |
| any | 压缩所有代理请求 |
3.7 gzip_buffers #
压缩缓冲区:
nginx
gzip_buffers 16 8k;
gzip_buffers 32 4k;
3.8 gzip_disable #
禁用特定User-Agent的压缩:
nginx
gzip_disable "msie6";
gzip_disable "MSIE [4-6]\.";
gzip_disable "~*MSIE [1-6]\.";
3.9 gzip_http_version #
支持的HTTP版本:
nginx
gzip_http_version 1.0;
gzip_http_version 1.1;
四、压缩效果测试 #
4.1 使用curl测试 #
bash
curl -H "Accept-Encoding: gzip" -I https://example.com
查看响应头:
text
Content-Encoding: gzip
Vary: Accept-Encoding
4.2 比较压缩前后大小 #
bash
curl -s https://example.com | wc -c
curl -s -H "Accept-Encoding: gzip" https://example.com | wc -c
4.3 在线测试工具 #
- GIDNetwork
- Chrome DevTools Network面板
五、预压缩文件 #
5.1 预压缩配置 #
nginx
location /static/ {
gzip_static on;
gzip_proxied any;
}
5.2 生成预压缩文件 #
bash
gzip -k -9 /var/www/static/main.js
gzip -k -9 /var/www/static/main.css
生成 main.js.gz 和 main.css.gz。
5.3 gzip_static参数 #
nginx
gzip_static on;
gzip_static off;
gzip_static always;
| 值 | 说明 |
|---|---|
| on | 优先使用预压缩文件 |
| off | 不使用预压缩文件 |
| always | 始终使用预压缩文件 |
5.4 构建时生成预压缩 #
Webpack配置:
javascript
const CompressionPlugin = require('compression-webpack-plugin');
module.exports = {
plugins: [
new CompressionPlugin({
algorithm: 'gzip',
test: /\.(js|css|html|svg)$/,
threshold: 10240,
minRatio: 0.8
})
]
};
六、Brotli压缩 #
6.1 安装Brotli模块 #
bash
sudo apt install libnginx-mod-http-brotli
或编译安装:
bash
./configure --add-module=/path/to/ngx_brotli
make && make install
6.2 Brotli配置 #
nginx
http {
brotli on;
brotli_comp_level 6;
brotli_min_length 1000;
brotli_types text/plain text/css application/json application/javascript text/xml application/xml;
brotli_buffers 16 8k;
}
6.3 Brotli参数 #
| 参数 | 说明 |
|---|---|
| brotli | 启用/禁用 |
| brotli_comp_level | 压缩级别(0-11) |
| brotli_min_length | 最小压缩大小 |
| brotli_types | 压缩类型 |
| brotli_buffers | 缓冲区 |
6.4 预压缩Brotli #
nginx
location /static/ {
brotli_static on;
}
6.5 Gzip与Brotli同时配置 #
nginx
http {
gzip on;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript;
brotli on;
brotli_comp_level 6;
brotli_types text/plain text/css application/json application/javascript;
}
Nginx会根据客户端Accept-Encoding自动选择。
七、压缩策略 #
7.1 静态资源压缩 #
nginx
location /static/ {
alias /var/www/static/;
gzip_static on;
brotli_static on;
gzip on;
gzip_types text/plain text/css application/javascript application/json;
brotli on;
brotli_types text/plain text/css application/javascript application/json;
}
7.2 动态内容压缩 #
nginx
location /api/ {
proxy_pass http://backend;
gzip on;
gzip_comp_level 4;
gzip_min_length 1000;
gzip_types application/json;
gzip_vary on;
}
7.3 图片压缩 #
图片通常已经是压缩格式,不建议再压缩:
nginx
location ~* \.(jpg|jpeg|png|gif|ico|webp)$ {
gzip off;
brotli off;
}
7.4 大文件压缩 #
nginx
location /download/ {
alias /var/www/download/;
gzip on;
gzip_comp_level 4;
gzip_min_length 10k;
gzip_types application/octet-stream;
}
八、压缩与缓存 #
8.1 Vary头配置 #
nginx
location / {
gzip on;
gzip_vary on;
proxy_cache my_cache;
proxy_cache_key "$scheme$request_method$host$request_uri$http_accept_encoding";
}
8.2 分离缓存 #
nginx
map $http_accept_encoding $suffix {
default "";
"~*gzip" ".gz";
"~*br" ".br";
}
location /static/ {
alias /var/www/static/;
try_files "${uri}${suffix}" $uri =404;
}
九、性能优化 #
9.1 压缩级别选择 #
nginx
map $sent_http_content_type $gzip_level {
default 6;
"text/html" 6;
"text/css" 6;
"application/javascript" 6;
"application/json" 4;
"image/svg+xml" 9;
}
gzip_comp_level $gzip_level;
9.2 条件压缩 #
nginx
map $request_uri $no_gzip {
default 0;
"~*\.(jpg|jpeg|png|gif|ico|webp|mp4|mp3|pdf|zip)$" 1;
}
gzip on;
gzip_if $no_gzip = 0;
9.3 CPU优化 #
nginx
worker_processes auto;
worker_cpu_affinity auto;
gzip on;
gzip_comp_level 4;
gzip_buffers 16 8k;
十、调试与监控 #
10.1 查看压缩状态 #
nginx
add_header X-Gzip-Status $gzip_ratio;
10.2 日志记录压缩比 #
nginx
log_format compression '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'gzip_ratio=$gzip_ratio';
access_log /var/log/nginx/compression.log compression;
10.3 监控压缩效果 #
bash
awk -F'gzip_ratio=' '{print $2}' /var/log/nginx/compression.log | sort -n | uniq -c
十一、常见问题 #
11.1 压缩不生效 #
检查项:
- gzip是否开启
- Content-Type是否在gzip_types中
- 文件大小是否超过gzip_min_length
- 客户端是否发送Accept-Encoding头
11.2 压缩导致乱码 #
原因: 后端已经压缩,Nginx再次压缩
解决:
nginx
gzip_proxied no-transform;
proxy_set_header Accept-Encoding "";
11.3 内存不足 #
解决: 调整gzip_buffers
nginx
gzip_buffers 4 16k;
十二、完整配置示例 #
nginx
http {
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_min_length 1000;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_disable "msie6";
gzip_types
text/plain
text/css
text/xml
text/javascript
application/json
application/javascript
application/xml
application/xml+rss
application/atom+xml
image/svg+xml
application/x-font-ttf
font/opentype;
brotli on;
brotli_vary on;
brotli_comp_level 6;
brotli_min_length 1000;
brotli_types
text/plain
text/css
text/xml
text/javascript
application/json
application/javascript
application/xml;
server {
listen 80;
server_name example.com;
location / {
root /var/www/html;
index index.html;
}
location /static/ {
alias /var/www/static/;
gzip_static on;
brotli_static on;
expires 1y;
add_header Cache-Control "public, immutable";
}
location /api/ {
proxy_pass http://backend;
gzip_comp_level 4;
gzip_types application/json;
}
location ~* \.(jpg|jpeg|png|gif|ico|webp|mp4|mp3|pdf|zip)$ {
gzip off;
brotli off;
}
}
}
十三、总结 #
本章我们学习了:
- 压缩原理:减少传输数据量
- Gzip配置:完整参数详解
- 预压缩:gzip_static使用
- Brotli压缩:更高效的压缩算法
- 压缩策略:不同场景的配置
- 性能优化:压缩级别和CPU优化
- 调试监控:查看压缩效果
掌握Gzip压缩后,让我们进入下一章,学习访问控制!
最后更新:2026-03-27