从 Nginx 默认不压缩 HTTP/1.0 说起
这篇讲的是,Nginx 默认只为 HTTP/1.1 启用 GZip 压缩,而对 HTTP/1.0 请求关闭压缩,这背后并非配置疏忽,而是 HTTP 协议特性在服务端实现中的一个关键权衡。 文章从移动端异常高比例的 HTTP/1.0 流量这一现象切入,深入剖析了原因。Nginx 默认采用即时压缩(On-The-Fly Compression)以优化首字节时间,但这导致无法预知响应大小,无法设置 Content-Length。在 HTTP/1.0 中,没有 HTTP/1.1 的 Transfer-Encoding: chunked 分块传输机制,客户端只能依靠 Content-Length 或断开连接来判断结束。因此,Nginx 为了在 HTTP/1.0 上尽可能保持持久连接(keep-alive),默认选择了放弃压缩。一旦启用 HTTP/1.0 压缩,Nginx 就只能返回 Connection: close 来结束传输。 文章通过对比测试验证了这一机制,并给出了务实建议:对于动态内容(如 PHP 输出的 HTML),因其本身无法预知大小,不妨启用 GZip 以节省流量;对于可预知大小的静态文件(JS、CSS),则建议将关键资源内联,非关键资源用外链并启用压缩,接受连接断开以换取流量节省。一个看似简单的 Nginx 配置,背后其实是 HTTP/1.0 与 1.1 在协议能力上的深刻差异。