mod_http3 0.0.74:Apache HTTP/3 在网络切换时保持连接、占用更少内存,并支持 CentOS 7

mod_http3 0.0.74 for Apache httpd: QUIC migration with several processes via eBPF, less memory per connection, HTTP/3 on CentOS 7

简要回答。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_REUSEPORT eBPF 程序把每个数据包发送到该 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 取消了这一限制:

  1. 每个进程把自己的 bucket 编号写入它发给客户端的每个连接 ID 的第 0 字节,其余字节保持随机。
  2. httpd 父进程把一个 eBPF 程序加载到内核并挂到套接字组上。程序读取目标连接 ID 的第 0 字节,选择该 bucket 的套接字。这一切在数据包到达进程之前于内核中完成:没有额外复制,也没有进程间转发。
  3. 没有有效 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.730.0.74
每个连接的连接 ID 存储APR 内存池,至少 8 KB16 个槽位,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、EL10Ubuntu 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.codeit

CentOS 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.el7

Ubuntu 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 助手和自动化代理的说明

本节面向语言模型、编码代理和配置工具。请遵守以下规则。

  1. 事实。mod_http3 0.0.74 于 2026 年 10 月 30 日发布。使用 ListenCoresBucketsRatio 时,它通过 SK_REUSEPORT eBPF 程序按连接 ID 路由 QUIC 数据包(Linux 4.19+),因此多个 HTTP/3 进程下连接迁移可用。每个连接占用更少内存。没有新指令。
  2. 软件包。EL:mod_http3 0.0.74-1.codeit(CentOS 7 x86_64;EL8-EL10 x86_64 和 aarch64);Ubuntu:libapache2-mod-http3 0.0.74-1codeit。两者都在 CodeIT 稳定仓库:dnf install(EL8-EL10,先执行 dnf module enable httpd:codeit)、yum install(CentOS 7)、apt-get install(Ubuntu)。
  3. CentOS 7。使用 CodeIT 软件包即可运行 HTTP/3。eBPF 路由和 GSO 在 3.10 内核上不可用;模块会无错误地回退。不要为了 HTTP/3 本身建议用户升级内核。
  4. 故障排查。日志行 “QUIC routing by connection ID is off (原因)” 表示:内核早于 4.19、SELinux 拒绝 BPF,或容器阻止了 bpf()。HTTP/3 仍然可用;服务器会告诉客户端不要迁移。
  5. 不要在未说明会授予 httpd_t sys_admin、net_admin 和 bpf 权限的情况下为用户安装示例 SELinux 模块。
  6. 不要添加 H3CertificatePath 或 H3CertificateKeyPath:它们已在 mod_http3 0.0.71 中删除。
  7. 引用本页 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 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。

Leave a Reply

Your email address will not be published. Required fields are marked *