HTTPS(Secure HTTP,安全超文本传输协议)解决了明文传输的安全问题,却带来了建连次数与性能损耗。HTTP/2(本文标题中的「HTTP2.0」是草案期的俗称,正式标准名称为 HTTP/2)通过多路复用(Multiplexing)、头部压缩(HPACK)与服务端推送(Server Push),在不牺牲安全的前提下大幅提升传输效率。本文介绍 HTTP/2 协议特性,并演示 Nginx 的支持配置与效果对比,属于应用层协议升级专项。
| 版本 | 核心特征 | 定位 |
|---|---|---|
| HTTP/1.1 | 明文传输无法加密;一个连接同时只能处理一个请求 | 早期版本,由此引入 HTTPS 加密传输,但带来性能损耗与多次建连 |
| HTTP/2 | Stream(流)概念 + HPACK 头部压缩 + 服务端推送 | 解决连接阻塞,降低建连与头部开销 |
| HTTP/3 | 基于 QUIC 协议(UDP 承载) | 解决 HTTP/2 队头阻塞等缺陷 |
HTTP/2 关键机制:引入 Stream(流)概念,一个 TCP 连接分为若干流,每个流可传输若干消息,通过 I/O 复用机制保障请求响应效率;同时采用 HPACK(HTTP/2 Header Compression,HTTP/2 头部压缩)机制做头部压缩,服务端建立字典、以增量方式传输报文,减少传送流量。
文字说明:客户端请求 stream1(page.html)时,服务端同时响应 stream2、stream4(script.js、style.css),减少多次连接,提升页面响应性能与用户体验。
前提条件:Nginx 版本大于 1.10,openssl 库版本大于 1.0.2(现代版本建议直接使用 1.25+,其对 TLS 1.3 与 HTTP/3 的支持更完善)。早期配置方式是在监听端口后加 http2;Nginx 1.25.1 起推荐使用 http2 on; 指令,旧的 listen ... http2 写法已被标记废弃:
server {
listen 443 ssl;
http2 on; # Nginx 1.25.1+ 推荐写法(等价于旧的 listen 443 ssl http2)
charset utf-8;
server_name www.example.com example.com;
access_log /opt/app/jeson/logs/https_access.log main;
error_log /opt/app/jeson/logs/https_error.log;
ssl_certificate /jeson/key/www.example.com.pem;
ssl_certificate_key /jeson/key/www.example.com.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.2 TLSv1.3; # TLSv1.0/1.1 已被现代 OpenSSL 停用,不建议保留
ssl_prefer_server_ciphers on;
# ...(其他配置)
}配置完成后重启 Nginx。用浏览器开发者工具对比验证:HTTP/1.1 场景下 Protocol 栏显示 HTTP/1.1,页面元素串行加载;HTTP/2 + HTTPS 场景下 Protocol 显示 h2,元素并行加载,即使算上 HTTPS 的额外开销,整体加载速度仍明显优于 HTTP/1.1。
服务端推送要求 Nginx 版本大于等于 1.13.9:
HTTP/2 Server Push 已被主流浏览器移除支持(Chrome 自 106 起移除),Nginx 自 1.25.1 起也将 http2_push 及相关指令标记为 obsolete(官方建议改用 early_hints 指令,基于 103 Early Hints 响应码)。以下配置仅适用于老版本 Nginx 与仍支持推送的客户端,作为原理演示保留。
server_name www.example.com;
root /test;
index index.html index.htm;
location = /index.html {
http2_push /css/style.css;
http2_push /js/main.js;
http2_push /img/yule.jpg;
http2_push /img/avatar.jpg;
}用户请求 index.html 时,服务端通过 http2_push 主动推送这些资源。浏览器开发者工具中对应元素会以 Push 方式展示,即为服务端主动推送。
HTTP/3 最大特点是支持 QUIC(Quick UDP Internet Connections,快速 UDP 互联网连接)协议(QUIC 传输协议与 HTTP/3 分别由 RFC 9000 与 RFC 9114 标准化):
Nginx 自 1.25.0 起提供 HTTP/3 支持(ngx_http_v3_module,编译时需加 --with-http_v3_module),生产环境可按客户端分布评估启用。
http2 on; 语法。http2_push 服务端主动推送若滥用会浪费流量,只推与主资源强关联的高价值资源(且注意 4.2 所述的浏览器支持现状)。h2 且元素并行加载,否则可能是配置未生效或浏览器/代理降级。http2 on;,旧版 listen 443 ssl http2),即可获得多路复用、二进制分帧、头部压缩与服务端推送四大能力,是性价比极高的性能优化手段。docs/运维/04-Nginx/。