反向代理承担南北向流量时,HTTP/3 带来的不仅是头部压缩和队头阻塞的改进,还要求底层传输从 TCP 切换为 UDP。Apache HTTP Server 从 2.4.53 版本开始通过 mod_http3 模块实验性支持 QUIC 和 HTTP/3,但 SLES 默认仓库中的 Apache 通常未启用该模块。因此,若要在 SLES 上实现支持 HTTP/3 的代理缓存,需要自行编译或使用第三方源,同时保留 mod_proxy 和 mod_cache 能力。下文将按依赖准备、编译配置、代理缓存启用、功能验证四个阶段展开。

一、HTTP/3 与代理缓存的交互机制
HTTP/3 使用 QUIC 作为传输层,数据包基于 UDP 发送,这与传统 HTTP/1.1 和 HTTP/2 依赖的 TCP 有本质区别。代理服务器若要在前端支持 HTTP/3,必须监听 UDP 443 端口并完成 TLS 1.3 握手。在 TLS 协商过程中,应用层协议通过 ALPN 扩展确定,服务器需要同时通告 h3、h2 和 http/1.1,以便不支持 HTTP/3 的客户端自动回退。代理缓存模块则工作在 HTTP 语义层,它关心的是请求方法、URI、Vary 头以及响应中的 Cache-Control 和 Expires 字段,这些内容不会因为传输层从 TCP 换成 UDP 而失效。
这意味着原本为 TCP 反向代理设计的缓存策略可以继续沿用,但有几个细节需要调整。例如,基于 TCP 连接四元组的日志分析和限速脚本在 HTTP/3 下会看到频繁变化的 UDP 源端口,因为 QUIC 连接迁移允许客户端更换 IP 或端口而保持会话。另外,代理服务器需要确保后端响应中的 Alt-Svc 头不会错误地引导客户端绕过代理直连后端。可以用下面的命令快速查看代理返回的协议标识头:
curl --http3 -I https://proxy.ipipp.com/
从性能角度看,HTTP/3 结合 TLS 1.3 的 0-RTT 特性,对重复请求的延迟有明显改善。当缓存命中时,代理可以直接返回本地磁盘或内存中的响应,无需向后端发起 QUIC 连接,进一步缩短首字节时间。但实验性模块在并发较高时可能存在内存占用上升的问题,生产环境需要做好压测再逐步放量。
二、SLES 上编译支持 HTTP/3 的 Apache
SLES 15 SP5 等版本的官方 apache2 包通常不包含 mod_http3,因此需要检查当前环境是否已经具备该模块。执行 apache2ctl -M | grep http3 如果没有输出,则需要准备编译环境。SUSE 的 zypper 可以安装大部分构建依赖,但 nghttp3 和 ngtcp2 这两个 HTTP/3 协议栈库往往需要从源码自行安装。先安装基础工具和 OpenSSL 开发包:
zypper install -y gcc make autoconf libtool pkg-config openssl-devel libnghttp2-devel pcre2-devel expat-devel zlib-devel
接下来从 GitHub 克隆并编译 nghttp3 和 ngtcp2。注意要保证两者版本匹配,并且安装到统一的目录,例如 /usr/local。ngtcp2 依赖 nghttp3 提供的 QPACK 编解码能力,编译顺序必须是先 nghttp3 后 ngtcp2:
git clone https://github.com/ngtcp2/nghttp3 cd nghttp3 autoreconf -i ./configure --prefix=/usr/local make make install git clone https://github.com/ngtcp2/ngtcp2 cd ngtcp2 autoreconf -i ./configure --prefix=/usr/local --enable-lib-only make make install
依赖就绪后,下载 Apache HTTP Server 源码并编译。为了同时启用代理、缓存和 HTTP/3,需要在 configure 阶段显式加入对应开关。建议使用独立安装目录 /opt/apache24 以避免覆盖系统自带的 Apache,同时通过 --enable-so 支持动态模块加载,方便后续调整:
wget https://downloads.apache.org/httpd/httpd-2.4.62.tar.gz tar -xzf httpd-2.4.62.tar.gz cd httpd-2.4.62 ./configure --enable-http3 --with-nghttp3=/usr/local --with-ngtcp2=/usr/local --enable-proxy --enable-cache --enable-cache-disk --enable-ssl --with-ssl=/usr --enable-so --prefix=/opt/apache24 make make install
编译完成后,可以执行 /opt/apache24/bin/apachectl -M 查看模块列表,确认 proxy_module、cache_module、http3_module 均已出现。如果 mod_http3 未加载,检查编译日志中是否有 nghttp3/ngtcp2 相关的报错,通常是路径或版本不匹配导致。
三、配置反向代理缓存并启用 HTTP/3
在 httpd.conf 中按顺序加载模块。mod_http3 需要在 ssl_module 之后加载,因为它依赖 TLS 层的 ALPN 协商结果。常用配置如下:
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule cache_module modules/mod_cache.so LoadModule cache_disk_module modules/mod_cache_disk.so LoadModule http3_module modules/mod_http3.so LoadModule ssl_module modules/mod_ssl.so
虚拟主机的配置需要同时声明 h2、http/1.1 和 h3 三种协议,并绑定 SSL 证书。缓存存储使用 mod_cache_disk,缓存目录需要 Apache 运行用户可写。下面是一个完整的虚拟主机示例,其中 <VirtualHost> 标签在代码块中已做转义展示:
<VirtualHost *:443>
Protocols h2 http/1.1 h3
SSLEngine on
SSLCert