在互联网协议快速迭代的今天,HTTP/3 已经逐渐成为许多大站点的标配,但提起 HTTP/2 的普及史,几乎绕不开一个名字------nghttp2。这个由 Tatsuhiro Tsujikawa 开发的纯 C 语言 HTTP/2 实现库,虽然低调,却堪称 HTTP/2 时代最成功的幕后英雄。
一、nghttp2 为什么如此重要?
HTTP/2 于 2015 年正式成为 RFC 7540,带来了多路复用、头部压缩、服务器推送等革命性特性。但与此同时,浏览器和服务器都需要一个可靠、高性能的 HTTP/2 帧层实现。当时市面上几乎没有成熟的开源选项,而 nghttp2 恰好在 2012 年左右就开始开发,并在 HTTP/2 标准化前后迅速成熟,成为了事实上的参考实现。
它最大的特点是:
- 性能优秀(纯 C,内存占用极低)
- API 设计清晰,易于集成
- 严格遵循 RFC,同时保持前瞻性(很早就支持优先级、流量控制、推送等全部特性)
- 维护极其活跃(至今仍在持续更新)
正是因为这些优点,nghttp2 迅速成为 HTTP/2 生态的"基础设施"。
二、哪些明星项目在用它?
几乎所有主流软件在支持 HTTP/2 时,都直接或间接依赖 nghttp2:
- curl ------ 全球使用最广泛的命令行 HTTP 客户端。从 7.33.0 版起,curl 的 HTTP/2 支持完全基于 nghttp2。只要你执行过
curl --http2,几乎肯定就在用 nghttp2。 - Apache HTTP Server ------ 其官方 mod_http2 模块依赖 nghttp2,是最早提供完整 HTTP/2 支持的主流 Web 服务器之一。
- Node.js ------ 在 v18 之前,其内置的 http2 模块长期依赖 nghttp2(位于 deps/nghttp2 目录)。因此,在 2018--2022 年间,几乎所有使用 Node.js HTTP/2 的服务都在用它。但从 Node.js 18 起,官方已切换为自研实现,不再依赖 nghttp2。
- nghttp2 项目自带工具 ------ 如 nghttpx(功能强大的 HTTP/2 → HTTP/1.1 多协议代理)、h2load(业内最权威的 HTTP/2/3 基准测试工具之一)。
除此之外,还有 Kamailio、Open5GS(5G 核心网)等电信级项目,以及无数 Linux 发行版软件包,都把 nghttp2 作为 curl、apache2 等包的硬依赖。
可以说:只要你用过带有 HTTP/2 的 curl、Apache,或者 Node.js 的 http2 模块,你就已经在间接使用 nghttp2 了。
三、从 HTTP/2 到 HTTP/3,nghttp2 的"接班人"们
随着 HTTP/3(基于 QUIC + UDP)的兴起,nghttp2 的直接使命已经告一段落,但它的"家族"却完美接棒:
- ngtcp2 ------ 负责 QUIC 传输层(名字中的 'tcp' 意指其提供了类似 TCP 的可靠流传输语义,尽管实际运行在 UDP 之上)
- nghttp3 ------ 负责 HTTP/3 的帧层、QPACK 头部压缩等上层语义
如今 curl 官方最推荐的 HTTP/3 实现组合就是 ngtcp2 + nghttp3 + OpenSSL/quictls/wolfSSL,延续了 nghttp2 团队一贯的高质量传统。
四、结语:低调的基石,持久的影响力
nghttp2 没有华丽的营销,也没有成为独立的公司,但它用最朴实的方式完成了使命:
让 HTTP/2 从 RFC 论文走进千千万万的服务器、客户端和开发者工具,成为 2015 年以来互联网最广泛部署的 HTTP 协议版本之一。
在 HTTP/3 逐渐普及的 2025 年,我们或许已经很少直接提到 nghttp2 这个名字,但它的 DNA 依然活在 curl、Node.js、Apache、nghttpx、h2load,以及整个 nghttp 家族之中。
它不是最闪耀的明星,却是最坚实的基石。
很多时候,真正改变世界的东西,往往就藏在这些安静的 C 语言库里。