用CMake统一构建支持HTTP/3的Apache反向代理缓存

用CMake统一构建支持HTTP/3的Apache反向代理缓存

一、先理清模块关系

HTTP/3 跑在 QUIC(UDP)上,Apache 需要两层协议库:ngtcp2 负责 QUIC 传输层,nghttp3 负责 HTTP/3 帧编码。再加上 mod_http3 把二者接进 Apache 事件 MPM。要做反向代理和缓存,还需 mod_proxy、mod_proxy_http、mod_cache、mod_cache_disk。注意 mod_http3 必须与 mod_http2 共存,因为握手依赖 TLS 协商。

二、装好编译依赖

Ubuntu/Debian 下先装基础工具链与库:

sudo apt install -y build-essential cmake ninja-build libssl-dev libnghttp3-dev libngtcp2-dev libapr1-dev libaprutil1-dev libpcre2-dev

发行版仓库里的 nghttp3/ngtcp2 可能偏旧,若要匹配 Apache 要求的最低版本,建议从 GitHub 拉官方源码、用 CMake 单独构建,统一装到 /opt/quic,方便后续定位。

三、用 CMake 当外层调度

Apache 官方用 autotools,但这不妨碍用 CMake 的 ExternalProject_Add 把 ngtcp2、nghttp3、httpd 三个外部项目编排在一起,靠依赖顺序控制构建,并统一输出目录:

cmake_minimum_required(VERSION 3.20)
project(apache_h3_proxy LANGUAGES C)
include(ExternalProject)
set(INSTALL_PREFIX ${CMAKE_BINARY_DIR}/dist)
ExternalProject_Add(ngtcp2 SOURCE_DIR .../ngtcp2 CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${INSTALL_PREFIX})

核心思路:CMake 负责设环境变量、传编译选项、收口安装前缀,三个组件按依赖顺序依次编译。

四、反向代理与磁盘缓存配置

编译完成后,在 Apache 配置里启用代理与缓存模块,用 ProxyPass 转发后端,用 CacheRoot + mod_cache_disk 落地磁盘缓存。这样重复请求直接命中缓存,源站压力明显下降。

五、排查要点

  • 启动报缺模块 → 确认 ngtcp2/nghttp3 版本达标,且装在 Apache 能找到的前缀下。
  • 握手失败 → QUIC 强制 TLS 1.3,旧 TLS 配置会让连接直接失败。
  • 缓存不命中 → 检查缓存键是否含必要请求头,避免每条请求都当成新资源。