nginx负责压缩,cdn负责缓存并透传压缩内容;需配置gzip_on、gzip_vary on、gzip_proxied any,并确保cdn回源携带accept-encoding: gzip且尊重vary头。

要让 Nginx 的 Gzip 压缩和 CDN 边缘节点协同工作,关键不是“让 CDN 压缩”,而是确保 Nginx 正确压缩、CDN 正确缓存并透传压缩内容——两者各司其职:Nginx 负责生成压缩响应,CDN 负责按需缓存和分发已压缩资源。
明确角色分工:谁压缩?谁缓存?
Nginx 是源站或反向代理层,负责对动态响应(如 PHP 渲染的 HTML)或静态文件(CSS/JS)实时启用 Gzip;CDN(如 Cloudflare、阿里云全站加速、jsDelivr)不执行 Gzip 压缩,但会根据请求头 Accept-Encoding: gzip 判断是否缓存并返回已压缩版本。因此必须保证:
- Nginx 开启 Gzip 并设置 gzip_vary on,使响应头带上 Vary: Accept-Encoding
- CDN 配置为尊重 Vary 头,对同一 URL 缓存多个变体(gzip/non-gzip)
- CDN 回源时必须携带 Accept-Encoding: gzip,否则 Nginx 不会压缩,CDN 也就缓不到压缩版
Nginx 必配 Gzip 参数(含 CDN 协同要点)
在 http 或 server 块中添加以下配置:
gzip on; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml; gzip_min_length 1k; gzip_comp_level 6; gzip_vary on; # 关键!让 CDN 知道响应依赖编码方式 gzip_proxied any; # 允许代理请求(如 CDN 回源)也启用压缩 gzip_disable "msie6"; # 可选:屏蔽极旧 IE 兼容问题
注意:gzip_types 中加入 image/svg+xml 可压缩 SVG 文件(文本型矢量图),常被忽略但收益明显;gzip_proxied any 确保 CDN 回源请求也能触发压缩,避免 CDN 拿到未压缩内容再缓存。
CDN 侧需配合的关键设置
不同 CDN 控制台名称略有差异,但核心目标一致:
- 开启“自动压缩”开关(实际是透传):例如 Cloudflare 的 “Brotli + Gzip” 选项本质是转发带 Vary 的响应,不自行压缩
- 启用 Vary 头识别:阿里云全站加速、腾讯云 CDN 默认开启;若自建 Nginx 作边缘缓存,需确认 proxy_cache_key 包含 $http_accept_encoding
- 回源请求头设置:在 CDN 后台配置“回源请求头”,显式添加 Accept-Encoding: gzip(部分 CDN 如 jsDelivr 自动携带,但自建或私有 CDN 需手动补)
验证是否真正协同生效
用 curl 模拟 CDN 回源行为测试:
# 1. 检查 Nginx 是否返回 gzip 响应(带 Vary) curl -I -H "Accept-Encoding: gzip" https://www.php.cn/link/3aee0457cca5b0c06f109ac3e1f0ec81 <h1>2. 检查未声明 gzip 时是否返回未压缩版(确认 Vary 生效)</h1><p>curl -I -H "Accept-Encoding:" <a href="https://www.php.cn/link/3aee0457cca5b0c06f109ac3e1f0ec81">https://www.php.cn/link/3aee0457cca5b0c06f109ac3e1f0ec81</a></p><h1>3. 查看响应头是否含:</h1><h1>Content-Encoding: gzip</h1><h1>Vary: Accept-Encoding</h1><h1>Content-Length(应明显小于未压缩时)</h1><p></p>
浏览器开发者工具 Network 标签页中,选中某 JS/CSS 文件,查看 Response Headers 和 Size 列(Transferred 小于 Resource Size 即表示压缩生效)。











