HTTP/3 已经从草案阶段走到了正式标准,Chrome、Firefox、curl 等主流客户端都默认开启了 QUIC 支持。如果你手头没有 Linux 机器,又想快速验证 Apache 在 HTTP/3 场景下的代理缓存表现,GitHub Codespaces 是一个非常好的选择:它提供免费的 2 核 4G 容器,自带完整的编译工具链,开箱即用。本文将带你从零开始,在 Codespaces 里编译一个支持 QUIC 的 Apache,并配置反向代理加缓存,最后用 curl 实测 HTTP/3 请求。

一、为什么 Apache 的 HTTP/3 需要特殊编译
Apache 官方发行的 2.4.x 系列二进制包目前仍然只支持 HTTP/1.1 和 HTTP/2,HTTP/3 模块 mod_http3 尚未进入主线发布。Cloudflare 维护了一个名为 quiche 的 QUIC 实现,并提供了对应的 Apache 补丁,编译后可以通过 Protocols HTTP/1.1 H2 H3 指令同时监听 UDP 443 端口。这意味着你无法通过 apt install apache2 直接获得 QUIC 能力,必须从源码构建。
编译过程依赖 BoringSSL 和 Rust 工具链。quiche 使用 Rust 编写,需要通过 cargo 构建,而 BoringSSL 则要求较新的 CMake 和 Go 环境。Codespaces 的默认 Ubuntu 镜像已经包含 Go 和基础构建工具,只需要补齐 Rust 和 CMake 即可,这比本地环境准备省事得多。
另外要注意,HTTP/3 走的是 UDP 协议,如果你后续打算把服务暴露到公网,需要确保防火墙和安全组放行 UDP 443。Codespaces 本身通过端口转发暴露服务,默认只转发 TCP,所以容器内可以直接用 curl 的 UNIX 域套接字方式测试,避免端口转发不支持 UDP 的问题。
二、在 Codespaces 中编译支持 quiche 的 Apache
先安装依赖并拉取源码。整个编译过程大约需要 10 到 20 分钟,取决于分配的机器性能,建议在 Codespaces 的 4 核机器上操作。
# 安装编译依赖 sudo apt-get update sudo apt-get install -y build-essential cmake golang libpcre2-dev libssl-dev curl git # 安装 Rust curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y source $HOME/.cargo/env # 克隆源码 git clone --recursive https://github.com/cloudflare/quiche.git cd quiche # 下载 Apache 源码,注意 quiche 的 extras 目录里有对应版本要求 curl -O https://downloads.apache.org/httpd/httpd-2.4.62.tar.gz tar xzf httpd-2.4.62.tar.gz cd httpd-2.4.62 # 应用 quiche 补丁 patch -p01 < ../extra/httpd/patches/httpd-2.4.62-quiche.patch
打完补丁后开始配置和编译。这里的关键是启用 mod_ssl、mod_http2 和补丁新增的 mod_http3,同时把 BoringSSL 指向 quiche 内置的构建产物。
./configure \ --prefix=$HOME/apache3 \ --with-ssl=$HOME/quiche/quiche/deps/boringssl/src \ --with-apr=$HOME/apr \ --with-apr-util=$HOME/apr-util \ --enable-http2 \ --enable-proxy-http2 \ --enable-ssl \ --with-port=8443 \ --enable-http3 \ --with-mpm=event make -j$(nproc) make install
如果 configure 阶段报找不到 BoringSSL,通常是 quiche 还没执行过 cargo build,先在 quiche 目录下运行 cargo build --release 生成依赖库后再重试。编译成功后,Apache 会被安装到 ~/apache3 目录,配置文件位于 ~/apache3/conf/httpd.conf。
三、配置反向代理与缓存
接下来在 httpd.conf 中加载代理和缓存模块,并把后端指向一个需要加速的源站。假设源站是一个普通的 HTTP/1.1 服务,我们让 Apache 在前端以 HTTP/3 对外服务,后端走 HTTP/1.1 回源,同时把静态资源缓存到本地磁盘。
LoadModule cache_module modules/mod_cache.so
LoadModule cache_disk_module modules/mod_cache_disk.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule http3_module modules/mod_http3.so
LoadModule ssl_module modules/mod_ssl.so
Protocols HTTP/1.1 H2 H3
Listen 8443
<VirtualHost *:8443>
ServerName localhost
SSLEngine on
SSLCertificateFile "/home/codespace/apache3/conf/server.crt"
SSLCertificateKeyFile "/home/codespace/apache3/conf/server.key"
# 开启磁盘缓存
CacheEnable disk /
CacheRoot "/home/codespace/apache3/cache"
CacheDirLevels 2
CacheDirLength 1
CacheMaxExpire 86400
CacheDefaultExpire 3600
CacheIgnoreNoLastMod On
# 反向代理到后端源站
ProxyPass "/" "http://127.0.0.1:8080/"
ProxyPassReverse "/" "http://127.0.0.1:8080/"
</VirtualHost>缓存相关的几条指令值得展开说明。CacheDirLevels 和 CacheDirLength 控制缓存文件的目录层级,层级太深会导致文件系统遍历变慢,太浅则单目录下文件过多,2 和 1 是比较均衡的取值。CacheMaxExpire 设定缓存对象的最大存活时间,即使源站返回的响应头声明了更长的过期时间也会被截断。CacheIgnoreNoLastMod 允许缓存没有 Last-Modified 头的响应,这对动态接口的边缘缓存很有用,但要配合后端的 Cache-Control 仔细控制,避免缓存到不该缓存的内容。
生成自签证书时记得加上 SAN 扩展,否则 curl 测试 HTTP/3 时会报证书不匹配。可以用一条 openssl 命令快速生成包含 SAN 的证书,测试时加 -k 参数跳过校验即可。
四、验证 HTTP/3 生效与缓存命中
验证分两步。第一步确认 Apache 真的在说 QUIC,需要 curl 7.66 以上且编译了 HTTP/3 支持。Codespaces 内可以安装 cloudflare 维护的 quiche 版 curl,或者直接下载静态编译的 curl-impersonate 二进制。
# 启动后端模拟源站 python3 -m http.server 8080 & # 启动 Apache $HOME/apache3/bin/apachectl start # 用 HTTP/3 发起请求,注意 --http3-only 参数 curl --http3-only -k https://127.0.0.1:8443/ -v
输出中看到 HTTP/3 200 字样就说明 QUIC 链路已经打通。第二步验证缓存是否命中,连续请求两次同一个资源,第二次的响应头里如果出现 X-Cache: HIT from localhost(需要在配置里加 Header set X-Cache 配合 CacheDetailHeader),并且响应时间明显缩短,就说明磁盘缓存工作正常。也可以直接查看 CacheRoot 目录,命中后能看到按哈希分级的缓存文件。
一个常见的坑是首次 QUIC 握手失败。部分 curl 版本在证书校验阶段就中断了 UDP 流程,报错信息类似 quiche: flusher not ready,这通常不是配置问题,而是 curl 与 quiche 库的版本兼容问题,换用 curl-impersonate 一般可以解决。另一个坑是 Codespaces 机器休眠后 UDP 会话中断,重新唤醒时 QUIC 连接需要重建,测试长连接时要注意。
五、HTTP/2 与 HTTP/3 的延迟对比与小结
在同一台 Codespaces 机器上,用 curl -w 输出各阶段耗时做简单对比。本地回环环境下 HTTP/3 的优势不明显,因为 RTT 接近零,QUIC 的零往返建连体现不出来。但如果你把 Codespaces 的端口通过 ngrok 或 Cloudflare Tunnel 映射到公网,再从本地机器发起请求,差距就会显现:HTTP/3 在丢包率较高的网络下,多路复用不受队头阻塞影响的特性可以让总耗时降低 20% 到 40%,尤其是并发请求大量小文件时更为明显。
从架构角度看,这套方案的价值在于验证而非生产部署。生产环境更推荐在 Apache 前面挂 Cloudflare 或自建 Nginx-QUIC 做 HTTP/3 终结,后端 Apache 专注缓存与回源调度。不过对于理解 QUIC 握手流程、调优 mod_cache 参数、以及在没有本地 Linux 环境时做协议实验,Codespaces 加 quiche 补丁的组合依然是最轻量的路径,删掉容器即可还原环境,不污染本机系统。
Apache代理缓存HTTP/3QUIC修改时间:2026-09-16 06:09:42