在 AlmaLinux 上把 Apache 作为反向代理缓存节点使用时,HTTP/3 并不只是打开一个模块那么简单。QUIC 跑在 UDP 之上,而 Apache 传统代理链路 mod_proxy_http 默认只处理 TCP,所以要让客户端到代理、代理到源站两条链路都具备 QUIC 能力,必须同时调整编译依赖、模块加载顺序和虚拟主机配置。客户端侧由 mod_http3 监听 UDP 443 并处理 QUIC 握手,缓存侧由 mod_cache 和 mod_cache_disk 接管响应体,而回源侧则需要实验性的 QUIC 回源支持。下面以一个 AlmaLinux 8 或 9 环境为例,给出从依赖安装到验证的完整路径。

一、HTTP/3 与 QUIC 在 Apache 中的模块关系
HTTP/3 的核心不是 HTTP/2 的简单升级,而是把传输层从 TCP 换成了基于 UDP 的 QUIC。Apache httpd 通过 mod_http3 模块处理 QUIC 连接,这个模块依赖 nghttp3 库完成 HTTP/3 帧编码,依赖 ngtcp2 和对应的加密库完成 QUIC 传输与 TLS 1.3 握手。很多发行版仓库中的 Apache 构建没有开启这些实验特性,因此即使安装了 httpd,也可能根本没有 mod_http3.so 文件。
反向代理链路则完全不同。默认的 mod_proxy_http 在回源时使用 HTTP/1.1,后来引入的 mod_proxy_http2 可以让回源走 HTTP/2,但它们都基于 TCP。Apache 社区对 QUIC 回源的支持较晚,早期版本中即使客户端到代理能跑 HTTP/3,代理回源仍然会降级为 TCP。因此部署前要认清两条链路:前端 QUIC 只需要 mod_http3,后端 QUIC 回源则取决于 mod_proxy 是否编译了 QUIC 支持,并且源站必须通过 Alt-Svc 宣告 UDP 服务。
缓存模块 mod_cache 可以缓存多条协议的响应,但缓存键默认包含协议、主机、路径和查询参数。HTTP/3 与 HTTP/2、HTTP/1.1 的响应如果内容一致,通常可以复用缓存条目;不过如果源站对 QUIC 和 TCP 返回了不同的头部,比如不同的 Alt-Svc 或 Vary 值,就会导致缓存命中率下降。因此建议在代理上规范缓存键或清理上游不一致的响应头。
二、AlmaLinux 上安装与编译 Apache QUIC 支持
AlmaLinux 的默认 BaseOS 和 AppStream 仓库一般不包含完整的 HTTP/3 模块。可以先检查当前 httpd 是否已经自带 mod_http3:
httpd -M 2>/dev/null | grep -i http3 ls /etc/httpd/modules/ | grep -i http3
如果没有输出,就需要从源码构建。推荐使用 EPEL 仓库中的较新 httpd 包,或者直接拉取 Apache httpd 源码并配合 quictls/openssl 分支编译。核心依赖包括 libnghttp3、libngtcp2、libngtcp2_crypto_quictls 以及支持 QUIC 的 OpenSSL。下面命令演示在 AlmaLinux 上安装基础编译工具和部分依赖:
dnf install -y epel-release dnf groupinstall -y "Development Tools" dnf install -y openssl-devel libnghttp3-devel libngtcp2-devel libngtcp2_crypto_quictls-devel nghttp2 brotli-devel libxml2-devel pcre2-devel zlib-devel
如果仓库中不存在 libngtcp2 相关包,需要从源码编译这些库。编译时务必让 OpenSSL 和 ngtcp2 使用同一套加密后端,否则运行时会报握手失败。之后下载 Apache httpd 源码,进入