Composer镜像平台启用Brotli+Gzip双压缩是为适配不同客户端:现代环境(libcurl≥7.57.0且编译支持Brotli)自动用br,旧环境回落gzip,通过HTTP内容协商实现一次决策、按需选择,不增加服务器负担且保障兼容性。

Composer镜像平台对 packages.json、p2/ 元数据等纯文本响应启用 Brotli + Gzip 双压缩,不是为了“多压一次”,而是让不同客户端自动拿到最适合的压缩格式——现代环境走 br,旧环境回落 gzip,不增加服务器负担,也不牺牲兼容性。
为什么必须同时配 Brotli 和 Gzip?
因为 Composer 客户端不主动协商或选择压缩算法,它完全依赖 PHP 的 cURL 扩展和底层 libcurl 能力。而 libcurl 对 br 的支持从 7.57.0 开始,且需编译时启用 HAVE_BROTLI:
- PHP 8.0+(Ubuntu 22.04+/Alpine 3.16+)默认带 Brotli 支持
- Windows 上的 XAMPP、WAMP、php:7.4-apache 镜像大概率不支持
br,cURL会静默忽略或报错Unsupported encoding type 'br' -
gzip则所有 PHP + cURL 组合都原生支持,是兜底底线
Nginx 配 Brotli 时最常漏掉的三项
镜像源后端多用 Nginx,但 Brotli 不是开箱即用模块,手动编译 ngx_brotli 后,以下三处不填就等于没配:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 必须写
brotli on;—— 即使写了brotli_comp_level和brotli_types,没开总开关,请求永远不走 Brotli -
brotli_types必须包含application/vnd.php.serialized—— Composer 私有仓库部分二进制序列化响应用这个 MIME 类型,漏掉就无法压缩 - 与
gzip共存时,必须同时设gzip_vary on;和brotli_vary on;—— 否则 CDN 或反向代理可能缓存 gzip 版本,错误返回给本该支持br的客户端
双压缩不等于双开,关键在协商逻辑
所谓“双压缩策略”,本质是 HTTP 内容协商驱动的一次决策,不是服务端并行压缩两份:
- 客户端发请求带
Accept-Encoding: br, gzip(现代浏览器默认如此) - Nginx 按顺序匹配:先试
br,命中即用,跳过gzip判断 - 若客户端不支持
br(如老旧 WebView),才回落到gzip,且只对gzip_types中明确列出的类型生效 - 务必关闭冗余
gzip:全局设gzip off;;如需兜底,仅开窄范围gzip_types text/plain;,并确保该类型不在brotli_types中重复出现
真正容易被忽略的点是:Brotli 压缩是否生效,不能只看响应头有没有 content-encoding: br,得查 Nginx access log 里的 $sent_http_content_encoding 字段,在高峰期采样统计 br / gzip / -(未压缩)占比——如果 - 超过 5%,说明有资源被 brotli_min_length 或 brotli_types 漏掉了。

















