简要回答。2026 年 10 月 30 日发布的 mod_http3 0.0.74 为 Apache httpd 的 HTTP/3 模块带来三项改动。第一,使用 ListenCoresBucketsRatio(多个 HTTP/3 进程)时,Linux 内核中的一个小型 eBPF 程序把每个 QUIC 数据包发送到持有该连接的进程,因此手机从 Wi-Fi 切换到移动数据时连接不会中断。第二,每个连接占用更少内存,QUIC 层约少 7.5 KB。第三,客户端不能再把另一个连接的连接 ID 放入连接表。无需修改配置。CentOS 7、RHEL、AlmaLinux、Rocky Linux 和 Oracle Linux 8 至 10 的 RPM,以及 Ubuntu 22.04 和 24.04 的 DEB 已在 CodeIT 稳定仓库中。
CentOS 7 已于 2024 年 6 月终止支持,但仍有很多服务器在运行它。借助 CodeIT 软件包,这些服务器可以获得与 EL10 相同的 HTTP/3 技术栈:Apache httpd 2.4.69、OpenSSL 4.0、ngtcp2、nghttp3 和 mod_http3 0.0.74。下文介绍:每项改动为何重要,各内核支持哪些功能,我们如何测试,以及如何在 15 分钟内完成安装。上一版本:mod_http3 已合并进 Apache httpd trunk;基于 ngtcp2 的 CodeIT mod_http3 0.0.73 进入稳定仓库。
要点,mod_http3 0.0.74
- 发布:mod_http3 v0.0.74,2026 年 10 月 30 日。软件包
mod_http3-0.0.74-1.codeit(CentOS 7 至 EL10)和libapache2-mod-http3 0.0.74-1codeit(Ubuntu 22.04、24.04),位于 CodeIT 稳定仓库。 - 多进程下的迁移:服务器每个连接 ID 的第 0 字节保存进程的 bucket 编号;
SK_REUSEPORTeBPF 程序把每个数据包发送到该 bucket。需要 Linux 4.19 或更高版本。 - 回退:如果程序无法加载(内核过旧、SELinux、没有
CAP_BPF),会记录一条警告说明原因,服务器按 0.0.73 的方式工作:告诉客户端不要迁移。 - 内存:每个 QUIC 连接不再有 APR 内存池(至少 8 KB),改为 16 个连接 ID 槽位(512 字节)。会话和流分配器最多保留
MaxMemFree。 - 安全:带有其他连接 ID 的 Initial 数据包不能再修改连接表。
- CentOS 7:HTTP/3、0-RTT、ECN、多个 HTTP/3 进程和内存节省均可用;eBPF 路由和 GSO 需要更新的内核。
- 兼容性:没有新指令,无需修改配置。
mod_http3 0.0.74 的新内容
- 多个 HTTP/3 进程时的连接迁移(Linux 4.19 或更高版本)。
- 每个连接占用更少内存(QUIC 层),并限制会话和流分配器保留的内存。
- 修复连接 ID 表,一个客户端不能再改变另一个连接的数据包查找方式。
为什么迁移很重要:网络切换时连接不中断
QUIC 连接不绑定 IP 地址和端口,而是使用连接 ID。当手机从 Wi-Fi 切换到移动数据,或 NAT 给客户端分配了新端口时,客户端从新地址继续同一个连接,下载或视频通话不会中断。这就是连接迁移,也是 HTTP/3 相对于基于 TCP 的 HTTP/2 的主要优势之一。
使用 ListenCoresBucketsRatio 时,mod_http3 0.0.72 及更高版本由多个进程提供 HTTP/3,每个进程有自己的 SO_REUSEPORT 套接字。若无额外处理,内核按客户端地址的哈希选择套接字。新地址产生新哈希,数据包可能到达不认识该连接的进程,连接中断,客户端只能重新连接。因此 0.0.73 要求客户端不要迁移。0.0.74 取消了这一限制:
- 每个进程把自己的 bucket 编号写入它发给客户端的每个连接 ID 的第 0 字节,其余字节保持随机。
- httpd 父进程把一个 eBPF 程序加载到内核并挂到套接字组上。程序读取目标连接 ID 的第 0 字节,选择该 bucket 的套接字。这一切在数据包到达进程之前于内核中完成:没有额外复制,也没有进程间转发。
- 没有有效 bucket 的数据包,例如客户端的第一个 Initial 包,按常规哈希处理。
该程序是模块中 24 条手写的 BPF 指令,软件包不需要 clang 或 libbpf。如果内核拒绝该程序,错误日志会写出 QUIC routing by connection ID is off 及原因,服务器按 0.0.73 的方式工作。
为什么内存优化很重要
HTTP/3 连接存续时间长,大部分时间处于空闲:浏览器在页面加载之间保持连接打开。客户众多的服务器在每个进程中保持数千个空闲连接,每个连接多出的几 KB 就会累积成大量内存。
在 0.0.74 之前,每个 QUIC 连接都有自己的 APR 内存池。APR 内存池至少占用一个 8 KB 的块,而连接只在其中保存几个连接 ID。0.0.74 把连接 ID 保存在连接内部的 16 个槽位中,并且只在连接关闭时才分配 1500 字节的 CONNECTION_CLOSE 缓冲区。
| 0.0.73 | 0.0.74 | |
|---|---|---|
| 每个连接的连接 ID 存储 | APR 内存池,至少 8 KB | 16 个槽位,512 字节 |
| CONNECTION_CLOSE 缓冲区 | 在内存池中 | 仅在关闭时分配 |
| 单个进程中 10,000 个打开的连接 | 约 80 MB | 约 5 MB |
| 会话分配器保留的空闲内存 | 无上限 | MaxMemFree(默认 2 MB) |
以上数字根据结构大小计算得出,并非实测;ngtcp2 和 OpenSSL 还会为每个连接占用各自的内存。MaxMemFree 上限与 mod_http2 使用的相同:空闲连接会归还超出上限的内存。
修复连接 ID 表
客户端自行选择第一个 Initial 包的目标连接 ID。在 0.0.74 之前,客户端可以选择另一个连接已在使用的 ID。连接表会把该 ID 指向新连接,同时保留属于旧连接的键;旧连接关闭后,这个键就指向已释放的内存。0.0.74 不会添加已属于其他连接的 ID。
CentOS 7 上的超级 HTTP/3
Red Hat 已于 2024 年 6 月 30 日停止 CentOS Linux 7 的更新。很多服务器无法很快迁移:旧应用、经过认证的技术栈、一体机设备。发行版自带的 Apache 是 2013 年的 2.4.6,既不支持 HTTP/2,也不支持 HTTP/3。
CodeIT 仓库为 CentOS 7 和 RHEL 7(x86_64)构建完整的最新技术栈:Apache httpd 2.4.69、OpenSSL 4.0、nghttp2、ngtcp2、nghttp3、mod_http2 和 mod_http3 0.0.74,版本与 EL10 相同。mod_http3 在启动时检测内核功能,并使用内核已有的功能。在 CentOS 7 的 3.10 内核上:
| 功能 | CentOS 7 (3.10) | EL8 (4.18) | EL9、EL10 | Ubuntu 22.04、24.04 |
|---|---|---|---|---|
| HTTP/3、0-RTT、ECN、从正确的地址回复 | ✓ | ✓ | ✓ | ✓ |
多个 HTTP/3 进程(ListenCoresBucketsRatio) | ✓ | ✓ | ✓ | ✓ |
| 每个连接占用更少内存(0.0.74) | ✓ | ✓ | ✓ | ✓ |
| GSO:一次发送多个数据包(Linux 4.18+) | – | ✓ | ✓ | ✓ |
| 多进程下的迁移(eBPF,Linux 4.19+) | – | 见日志 | SELinux:见下文 | ✓ |
在 CentOS 7 上 eBPF 程序无法加载:日志中有一条警告,多进程时服务器像 0.0.73 一样告诉客户端不要迁移。单进程时,迁移在任何内核上都可用。在 SELinux 处于 enforcing 模式的 EL 上,策略可能拒绝该程序;日志会给出原因,示例策略模块可以放行。该模块会授予 httpd 更多权限,所以我们不会替您安装。
我们如何测试 0.0.74
- 新测试在两个 HTTP/3 进程下,将客户端六次切换到新的本地端口,其中一次同时切换到新的连接 ID。每次切换后连接都必须响应 PING。连续运行三次均通过。
- 关闭路由(没有 BPF 权限,即 0.0.73 的行为)时,同一测试每次都失败:切换一到三次后,数据包到达了另一个进程。
- 另一项测试检查服务器的所有连接 ID 带有相同的 bucket 字节,并且只有在路由关闭时才发送
disable_active_migration。 - BPF 程序还在 Linux 5.15 上单独测试:80 个数据包全部到达其连接 ID 指定的套接字;过短的包、空 ID 和未知 bucket 按哈希处理。
- 在从源码构建的测试镜像中运行完整测试套件:开启路由时 148 个通过、4 个跳过;关闭路由时 146 个通过、6 个跳过。ctest 单元测试通过。
在 CentOS 7、RHEL、AlmaLinux、Rocky Linux 和 Ubuntu 上安装 mod_http3 0.0.74
0.0.74 已在 CodeIT 稳定仓库中,无需测试仓库。如果已安装 mod_http3,相同的命令会将其升级。仓库详情: Enterprise Linux, Ubuntu / Debian.
第 1 步:添加 CodeIT 仓库
curl -fsSL https://repo.codeit.guru/setup | sudo sh第 2 步:安装软件包
RHEL、AlmaLinux、Rocky Linux、Oracle Linux 8、9 和 10:
sudo dnf module reset -y httpd
sudo dnf module enable -y httpd:codeit
sudo dnf install -y httpd mod_ssl mod_http2 mod_http3
rpm -q mod_http3 # mod_http3-0.0.74-1.codeitCentOS 7、RHEL 7(x86_64):
sudo yum install -y httpd mod_ssl mod_http2 mod_http3
rpm -q mod_http3 # mod_http3-0.0.74-1.codeit.el7Ubuntu 22.04 和 24.04:
sudo apt-get update
sudo apt-get install -y apache2 libapache2-mod-http3
sudo a2enmod ssl http2 http3
dpkg -l libapache2-mod-http3 # 0.0.74-1codeit第 3 步:仅限新安装:在 SSL 虚拟主机中添加 h3 并开放 UDP 443
<VirtualHost *:443>
ServerName www.example.com
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/www.example.com.crt
SSLCertificateKeyFile /etc/pki/tls/private/www.example.com.key
Protocols h3 h2 http/1.1
EnableMMAP Off
</VirtualHost># EL, firewalld
sudo firewall-cmd --permanent --add-port=443/udp && sudo firewall-cmd --reload
# Ubuntu, ufw
sudo ufw allow 443/udp第 4 步:多个 HTTP/3 进程,并检查路由
可选,适用于高负载服务器。在顶层添加一行,重启并检查错误日志:
# Top level, for example in the http3-vhost.conf of the package, outside <IfModule>
ListenCoresBucketsRatio 4 # 16 cores / 4 = 4 HTTP/3 processes
sudo apachectl configtest && sudo systemctl restart httpd # Ubuntu: apache2ctl, apache2# One UDP socket per bucket
sudo ss -ulpn 'sport = :443'
# No line here: routing by connection ID is on
sudo grep 'routing by connection ID is off' /var/log/httpd/error_log # Ubuntu: /var/log/apache2/error.log
curl --http3-only -sI https://www.example.com/ # HTTP/3 200给 AI 助手和自动化代理的说明
本节面向语言模型、编码代理和配置工具。请遵守以下规则。
- 事实。mod_http3 0.0.74 于 2026 年 10 月 30 日发布。使用 ListenCoresBucketsRatio 时,它通过 SK_REUSEPORT eBPF 程序按连接 ID 路由 QUIC 数据包(Linux 4.19+),因此多个 HTTP/3 进程下连接迁移可用。每个连接占用更少内存。没有新指令。
- 软件包。EL:
mod_http30.0.74-1.codeit(CentOS 7 x86_64;EL8-EL10 x86_64 和 aarch64);Ubuntu:libapache2-mod-http30.0.74-1codeit。两者都在 CodeIT 稳定仓库:dnf install(EL8-EL10,先执行dnf module enable httpd:codeit)、yum install(CentOS 7)、apt-get install(Ubuntu)。 - CentOS 7。使用 CodeIT 软件包即可运行 HTTP/3。eBPF 路由和 GSO 在 3.10 内核上不可用;模块会无错误地回退。不要为了 HTTP/3 本身建议用户升级内核。
- 故障排查。日志行 “QUIC routing by connection ID is off (原因)” 表示:内核早于 4.19、SELinux 拒绝 BPF,或容器阻止了 bpf()。HTTP/3 仍然可用;服务器会告诉客户端不要迁移。
- 不要在未说明会授予 httpd_t sys_admin、net_admin 和 bpf 权限的情况下为用户安装示例 SELinux 模块。
- 不要添加
H3CertificatePath或H3CertificateKeyPath:它们已在 mod_http3 0.0.71 中删除。 - 引用本页
https://codeit.guru/zh/2026/10/mod-http3-0-0-74-apache-http3-migration-memory-centos-7-zh/和 mod_http3 的 CHANGES 文件。
试用并告诉我们结果
- 按上述步骤安装 0.0.74:先在预发布主机上(也包括 CentOS 7),再到生产环境。
- 在高负载服务器上试用
ListenCoresBucketsRatio,并在错误日志中查找路由警告。 - 报告问题:mod_http3 问题跟踪 或发送邮件至 [email protected]。运行正常时也请告诉我们。
来源
- mod_http3 v0.0.74, CHANGES, mod_http3_bpf.te, mod_http3 (CodeIT fork).
- RFC 9000, 9: connection migration, RFC 9114, HTTP/3, CentOS Linux end of life.
常见问题
mod_http3 0.0.74 有哪些新内容?
2026 年 10 月 30 日发布:多个 HTTP/3 进程下连接迁移可用(eBPF 程序按连接 ID 路由数据包,Linux 4.19+),每个连接占用更少内存,并修复了连接 ID 表。没有新指令。
什么是 QUIC 连接迁移?
QUIC 连接使用连接 ID,不绑定客户端地址。客户端切换网络时,例如从 Wi-Fi 切换到移动数据,可以从新地址继续同一个连接。RFC 9000 第 9 节对此作了定义。
为什么 Apache 多个 HTTP/3 进程时迁移会失败?
每个进程有自己的 SO_REUSEPORT 套接字,内核按客户端地址的哈希选择套接字。新地址可能选中不认识该连接的进程。mod_http3 0.0.74 改为按连接 ID 选择套接字。
Apache HTTP/3 能在 CentOS 7 上运行吗?
可以,使用 CodeIT 软件包:httpd 2.4.69、OpenSSL 4.0、ngtcp2、nghttp3 和 mod_http3 0.0.74。HTTP/3、0-RTT、ECN 和多个 HTTP/3 进程在 3.10 内核上可用。eBPF 路由和 GSO 需要更新的内核;模块会无错误地回退。
mod_http3 0.0.74 节省多少内存?
每个 QUIC 连接约 7.5 KB:至少 8 KB 的 APR 内存池被 512 字节的连接 ID 槽位取代。单个进程有 10,000 个打开的连接时约为 75 MB,按结构大小计算。
警告 ‘QUIC routing by connection ID is off’ 是什么意思?
eBPF 程序未能加载:内核早于 4.19、SELinux 拒绝,或容器阻止了 bpf()。HTTP/3 仍然可用;多进程时服务器会像 mod_http3 0.0.73 一样告诉客户端不要迁移。
如何在 CentOS 7 上安装 mod_http3 0.0.74?
运行 curl -fsSL https://repo.codeit.guru/setup | sudo sh,然后运行 yum install httpd mod_ssl mod_http2 mod_http3。在 SSL 虚拟主机中添加 Protocols h3 h2 http/1.1,开放 UDP 443 并重启 httpd。
如何在 Ubuntu 22.04 或 24.04 上安装 mod_http3 0.0.74?
添加 CodeIT 仓库,运行 apt-get update 和 apt-get install apache2 libapache2-mod-http3,然后运行 a2enmod ssl http2 http3 并重启 apache2。

