Apache 怎么让代理层也吃上 HTTP/3?QUIC 监听与缓存键这样配

Apache 怎么让代理层也吃上 HTTP/3?QUIC 监听与缓存键这样配

一、为什么老缓存配置会失效

HTTP/3 不再依赖 TCP,而是用 QUIC 在 UDP 上传输,代理层处理连接、缓存和 TLS 的方式都变了。为 HTTP/1.1、HTTP/2 写的 Apache 缓存规则直接套过来,会出现缓存不命中、连接无法复用甚至证书校验失败。核心是要让代理层同时支持 QUIC 监听和缓存两个环节。

二、加载模块并启用 QUIC 监听

需要 mod_http3(HTTP/3 能力,编译时链接 ngtcp2/nghttp3)、mod_proxy 和 mod_proxy_http3(向后端发 HTTP/3)。基础片段:

LoadModule http3_module modules/mod_http3.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http3_module modules/mod_proxy_http3.so
Listen 443 quic
Protocols h2 h3
H3Direct on
AltSvc on

Listen 443 quic 在 443 的 UDP 上听 QUIC;Protocols h2 h3 允许同端口经 TLS ALPN 协商 HTTP/2/3;AltSvc 告诉浏览器后续可升级到 HTTP/3。QUIC 强制 TLS 1.3 握手,证书必须支持 TLS 1.3,否则连接直接失败。

三、代理转发与缓存键适配

前端转发用 ProxyPass / h3://backend.example/(h3:// 是 mod_proxy_http3 识别的协议);若后端不支持 HTTP/3,可退回 https://,前端缓存仍正常工作。关键点:代理缓存并不要求后端也用 QUIC,前端客户端走 HTTP/3 就已足够,后端常仍是 HTTP/1.1/2,由 Apache 把 UDP 流量转成 TCP 向后转发。

缓存键要随协议调整:Alt-Svc 通告、0-RTT 与缓存新鲜度可能冲突,需合理分区缓存,避免把每条 HTTP/3 请求都当成新资源而错过命中。

四、排查清单

  • 连接失败 → 检查证书是否启用 TLS 1.3。
  • 缓存不命中 → 复核缓存键是否含必要请求头/协议标识。
  • 后端不通 → 确认 ProxyPass 用的是 h3:// 还是 https://,与后端能力匹配。