HTTP/2协议相比HTTP/1.1在性能上有质的飞跃,多路复用、头部压缩、服务器推送等特性能够显著降低页面加载延迟。然而主流浏览器只在HTTPS连接上支持HTTP/2,SSL证书的配置质量直接影响HTTP/2能否正常启用以及性能发挥的程度。
ALPN协商是HTTP/2启用的前提
应用层协议协商即ALPN,是TLS协议的扩展功能,允许客户端在握手阶段告知服务器它支持的协议列表,服务器从中选择一个返回。浏览器在TLS握手时通过ALPN声明支持h2和http/1.1,如果服务器配置正确则会选择h2并完成HTTP/2连接。如果ALPN协商失败,即使服务器配置了HTTP/2支持,连接也会回退到HTTP/1.1。在Nginx中启用HTTP/2只需在listen 443 ssl后添加http2参数,Nginx会自动处理ALPN协商。HTTP/2要求使用TLS 1.2及以上版本,如果配置中允许TLS 1.0或1.1,虽然不影响HTTP/2本身但会降低整体安全等级。
TLS版本与加密套件选择
TLS 1.3是当前最新版本的传输层安全协议,在安全性和性能方面都有显著提升。它将握手简化为1个往返时间,与HTTP/2的多路复用配合能够进一步降低连接延迟。配置时应将ssl_protocols设置为仅支持TLS 1.2和TLS 1.3,禁用已知存在安全漏洞的旧版本。加密套件的选择同样关键,ssl_ciphers指令应配置为优先使用前向保密的ECDHE密钥交换算法和AEAD加密模式。推荐使用Mozilla官方维护的推荐配置方案,根据服务器环境选择Intermediate或Modern级别。TLS 1.3的加密套件由协议自动选择,无需在ssl_ciphers中单独指定。
服务器推送的合理使用
HTTP/2的服务器推送功能允许服务器在客户端请求之前主动发送资源。例如当浏览器请求HTML页面时,服务器可以同时推送该页面引用的CSS和JavaScript文件,免去浏览器解析HTML后再发起请求的等待时间。在Nginx中通过http2_push指令指定要推送的资源路径,也可以使用http2_push_preload指令配合Link响应头实现更灵活的推送控制。但需要注意推送并非越多越好,推送不必要的资源会浪费带宽,对于已缓存这些资源的用户反而增加了开销。建议只推送关键渲染路径上的资源,并通过Cookie或Cache-Digest机制判断用户是否已缓存相关资源再决定是否推送。
证书选择与连接复用
HTTP/2对证书本身没有特殊要求,但证书配置会影响连接建立速度进而影响HTTP/2性能发挥。选择ECDSA证书而非RSA证书可以减少密钥交换的计算量和传输数据量,在移动设备上优势尤为明显。如果需要兼容不支持ECDSA的老旧客户端,可以同时配置RSA和ECDSA双证书实现自适应。证书链务必将所有中间证书按正确顺序拼接,缺失中间证书会导致部分客户端验证失败,包含多余根证书则增加握手数据量。在连接管理方面,HTTP/2的多路复用使得单个TCP连接可以同时处理多个请求。在Nginx中适当增大keepalive_timeout值让连接保持更久,提高复用率。同时设置http2_max_concurrent_streams限制单个连接上的最大并发流数,防止单个客户端占用过多服务器资源。