{T}

HTTP2.0 在 Nginx 的实践

0. 引言

HTTPS 解决了明文传输的安全问题,却带来了建连次数与性能损耗。HTTP2.0 通过多路复用、头部压缩与服务端推送,在不牺牲安全的前提下大幅提升传输效率。本文介绍 HTTP2.0 协议特性,并演示 Nginx 的支持配置与效果对比。

1. HTTP 协议演进

  • HTTP1.1:早期版本,最大的问题是明文传输无法加密,由此引入 HTTPS(SSL 加密传输),但加密解密带来性能损耗和多次建连;
  • HTTP2.0:引入 Stream(流)概念,一个 TCP 连接分为若干流,每个流可传输若干消息,通过 I/O 复用机制保障请求响应效率;同时采用 HPACK 机制做头部压缩,服务端建立字典、以增量方式传输报文,减少传送流量;
  • HTTP3.0:解决 HTTP2.0 的队头阻塞等缺陷,后文详述。

2. HTTP1.1 的劣势

  • 请求阻塞:一个连接同时只能处理一个请求,浏览器按先进先出优先级处理,某个响应未及时返回时,后续请求全部阻塞。前端常用多域名方案缓解,但浏览器对 HTTP1.1 并发连接数有限制,效果有限;
  • 明文传输:数据无加密,易被劫持。

3. HTTP2.0 的核心优势

  • 多路复用:一个 TCP 连接内同时发送多个请求流,单连接上多请求-响应并行,解决连接阻塞,减少 TCP 连接数量与慢启动损耗;
  • 分帧二进制传输:请求流中以数据帧为最小传输单位,基于 HTTPS 解决安全问题;
  • 服务端主动推送:浏览器请求一个资源时,服务端主动推送关联资源,减少后续请求。

HTTP2.0 服务端推送机制

如上图,客户端请求 stream1(page.html)时,服务端同时响应 stream2、stream4(script.js、style.css),减少多次连接,提升页面响应性能与用户体验。

4. Nginx 配置 HTTP2.0

前提条件:Nginx 版本大于 1.10,openssl 库版本大于 1.0.2。配置方式是在监听端口后加 http2

bash
server {
    listen       443 ssl http2;
    charset      utf-8;
    server_name  www.imoocc.com imoocc.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.imoocc.com.pem;
    ssl_certificate_key /jeson/key/www.imoocc.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 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ...
}

配置完成后重启 Nginx。用浏览器开发者工具对比验证:HTTP1.1 场景下 Protocol 栏显示 HTTP/1.1,页面元素串行加载;HTTP2.0 + HTTPS 场景下 Protocol 显示 h2,元素并行加载,即使算上 HTTPS 的额外开销,整体加载速度仍明显优于 HTTP1.1。

5. Nginx 配置服务端推送

服务端推送要求 Nginx 版本大于等于 1.13.9:

bash
server_name  www.imoocc.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 方式展示,即为服务端主动推送。

6. HTTP3.0 的进一步优化

HTTP3.0 最大特点是支持 QUIC 协议:

  • 0RTT 建连:客户端缓存 HTTPS 认证会话信息,再次访问时无需重新建立 HTTPS 会话,直接基于原有认证信息建连;
  • 解决队头阻塞:QUIC 不使用 TCP 报文而改用 UDP,一个连接上的多个 stream 之间无依赖,数据包阻塞不影响后续报文传送;
  • 弱网重连:TCP 基于 IP 和端口识别连接,弱网环境切换网络时连接易失败;QUIC 通过 ID 识别连接,只要 ID 不变即可迅速重连。

7. 小结

HTTP2.0 在 Nginx 上"一行配置"即可启用(listen 443 ssl http2),便可获得多路复用、二进制分帧、头部压缩与服务端推送四大能力,是投入产出比极高的性能优化手段。注意三点:版本前提(Nginx > 1.10、openssl > 1.0.2)、推送资源要精选(滥用会浪费流量)、弱网或移动端场景可进一步关注 HTTP3.0/QUIC 的连接恢复优势。

下一章讲解系统性能验收,用 Unixbench、FIO 等工具量化评估服务器性能。