mod_http3 0.0.74: HTTP/3 в Apache сохраняет соединение при смене сети, тратит меньше памяти и работает на 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

Коротко. mod_http3 0.0.74, выпущенный 30 октября 2026 года, вносит в модуль HTTP/3 для Apache httpd три изменения. Первое: с ListenCoresBucketsRatio (несколько процессов HTTP/3) небольшая программа eBPF в ядре Linux отправляет каждый пакет QUIC в процесс, где его соединение, поэтому телефон, перешедший с Wi-Fi на мобильную сеть, сохраняет соединение. Второе: каждое соединение тратит меньше памяти, примерно на 7,5 КБ меньше в слое QUIC. Третье: клиент больше не может занести в таблицу идентификатор чужого соединения. Менять конфигурацию не нужно. RPM для CentOS 7, RHEL, AlmaLinux, Rocky Linux и Oracle Linux 8-10 и DEB для Ubuntu 22.04 и 24.04 в стабильном репозитории CodeIT.

Поддержка CentOS 7 закончилась в июне 2024 года, но на нём всё ещё работает много серверов. С пакетами CodeIT они получают тот же стек HTTP/3, что и EL10: Apache httpd 2.4.69, OpenSSL 4.0, ngtcp2, nghttp3 и mod_http3 0.0.74. Ниже: почему важно каждое изменение, что работает на каком ядре, как мы тестировали и как установить за 15 минут. Предыдущий выпуск: mod_http3 в trunk Apache httpd; CodeIT mod_http3 0.0.73 на ngtcp2 теперь в стабильном репозитории.

Ключевые факты, mod_http3 0.0.74

  • Выпуск: mod_http3 v0.0.74, 30 октября 2026 года. Пакеты mod_http3-0.0.74-1.codeit (CentOS 7-EL10) и libapache2-mod-http3 0.0.74-1codeit (Ubuntu 22.04, 24.04) в стабильном репозитории CodeIT.
  • Миграция при нескольких процессах: байт 0 каждого серверного идентификатора соединения хранит номер bucket процесса; программа eBPF SK_REUSEPORT отправляет каждый пакет в этот bucket. Linux 4.19 или новее.
  • Запасной режим: если программа не загружается (старое ядро, SELinux, нет CAP_BPF), одно предупреждение называет причину, и сервер работает как 0.0.73: просит клиентов не мигрировать.
  • Память: у соединения QUIC больше нет пула APR (не меньше 8 КБ); вместо него 16 ячеек для идентификаторов (512 байт). Распределители сессий и потоков хранят не больше MaxMemFree.
  • Безопасность: пакет Initial с идентификатором чужого соединения больше не меняет таблицу соединений.
  • CentOS 7: HTTP/3, 0-RTT, ECN, несколько процессов HTTP/3 и экономия памяти работают; маршрутизации eBPF и GSO нужно более новое ядро.
  • Совместимость: новых директив нет, менять конфигурацию не нужно.

Что нового в mod_http3 0.0.74

  • Миграция соединений при нескольких процессах HTTP/3 (Linux 4.19 или новее).
  • Меньше памяти на соединение в слое QUIC и предел удерживаемой памяти в распределителях сессий и потоков.
  • Исправление в таблице идентификаторов: один клиент больше не может изменить поиск пакетов другого соединения.

Почему важна миграция: соединение живёт при смене сети

Соединение QUIC не привязано к IP-адресу и порту. У него есть идентификаторы соединения. Когда телефон переходит с Wi-Fi на мобильную сеть или NAT даёт клиенту новый порт, клиент продолжает то же соединение с нового адреса, и загрузка или видеозвонок не прерываются. Это миграция соединения, одно из главных преимуществ HTTP/3 над HTTP/2 поверх TCP.

С ListenCoresBucketsRatio mod_http3 0.0.72 и новее обслуживает HTTP/3 в нескольких процессах, у каждого свой сокет SO_REUSEPORT. Без помощи ядро выбирает сокет по хешу адреса клиента. Новый адрес даёт новый хеш, и пакет может попасть в процесс, который не знает соединения. Соединение останавливается, клиент подключается заново. Поэтому 0.0.73 просил клиентов не мигрировать. 0.0.74 снимает это ограничение:

  1. Каждый процесс записывает свой номер bucket в байт 0 каждого идентификатора соединения, который он выдаёт клиентам. Остальные байты остаются случайными.
  2. Родительский процесс httpd загружает в ядро программу eBPF и подключает её к группе сокетов. Программа читает байт 0 идентификатора назначения и выбирает сокет этого bucket. Это происходит в ядре, до того как пакет попадает в процесс: без лишнего копирования и без пересылки между процессами.
  3. Пакет без правильного bucket, например первый пакет Initial клиента, идёт по обычному хешу.

Программа — это 24 написанные вручную инструкции BPF в модуле. Пакетам не нужны clang и libbpf. Если ядро отказывает, в журнале ошибок появляется QUIC routing by connection ID is off с причиной, и сервер работает как 0.0.73.

Почему важна экономия памяти

Соединения HTTP/3 живут долго и большую часть времени простаивают: браузер держит их открытыми между загрузками страниц. Сервер с большим числом клиентов держит в каждом процессе тысячи простаивающих соединений. Несколько килобайт на соединение превращаются в десятки мегабайт.

До 0.0.74 у каждого соединения QUIC был свой пул памяти APR. Пул APR занимает минимум один блок 8 КБ, а соединение хранило в нём лишь несколько идентификаторов. 0.0.74 хранит идентификаторы в 16 ячейках внутри соединения и выделяет буфер CONNECTION_CLOSE на 1500 байт только при закрытии.

0.0.730.0.74
Хранение идентификаторов на соединениепул APR, от 8 КБ16 ячеек, 512 байт
Буфер CONNECTION_CLOSEв пулетолько при закрытии
10 000 открытых соединений в одном процессеоколо 80 МБоколо 5 МБ
Свободная память в распределителе сессиибез пределаMaxMemFree (по умолчанию 2 МБ)

Числа рассчитаны по размерам структур, а не измерены; ngtcp2 и OpenSSL тратят на каждое соединение свою память. Предел MaxMemFree тот же, что использует mod_http2: простаивающее соединение отдаёт память сверх предела.

Исправление в таблице идентификаторов

Клиент сам выбирает идентификатор назначения первого пакета Initial. До 0.0.74 клиент мог выбрать идентификатор, который уже был у другого соединения. Тогда таблица связывала его с новым соединением и сохраняла ключ, принадлежавший старому; после закрытия старого соединения ключ указывал на освобождённую память. 0.0.74 не добавляет идентификатор, который есть у другого соединения.

Супер HTTP/3 на CentOS 7

Red Hat прекратил обновления CentOS Linux 7 30 июня 2024 года. Многие серверы не могут быстро переехать: старые приложения, сертифицированные стеки, программно-аппаратные комплексы. Apache из дистрибутива — версия 2.4.6 2013 года, без 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. С одним процессом миграция работает на любом ядре. На EL с SELinux в режиме enforcing политика может запретить программу; тогда журнал называет причину, а пример модуля политики разрешает её. Этот модуль даёт httpd больше прав, поэтому мы не устанавливаем его за вас.

Как мы тестировали 0.0.74

  • Новый тест шесть раз переносит клиента на новый локальный порт, один раз ещё и на новый идентификатор, при двух процессах HTTP/3. После каждого переноса соединение должно ответить на PING. Тест прошёл три запуска подряд.
  • Тот же тест без маршрутизации (нет прав на BPF, поведение 0.0.73) падает в каждом запуске: после одного-трёх переносов пакет попадает в другой процесс.
  • Тест проверяет, что все идентификаторы сервера несут один байт bucket и что disable_active_migration отправляется только без маршрутизации.
  • Программу BPF проверили и отдельно на Linux 5.15: 80 из 80 пакетов попали в сокет из своего идентификатора; короткие пакеты, пустые идентификаторы и неизвестные bucket пошли по хешу.
  • Полный набор в тестовом образе со сборкой из исходников: 148 прошли, 4 пропущены с маршрутизацией; 146 прошли, 6 пропущены без неё. Модульные тесты ctest проходят.

Установка mod_http3 0.0.74 на CentOS 7, RHEL, AlmaLinux, Rocky Linux и Ubuntu

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: только для новой установки: добавьте h3 в SSL-хост и откройте 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

Инструкции для ИИ-ассистентов и агентов автоматизации

Этот раздел для языковых моделей, агентов программирования и инструментов настройки. Соблюдайте эти правила.

  1. Факты. mod_http3 0.0.74 выпущен 30 октября 2026 года. С ListenCoresBucketsRatio он направляет пакеты QUIC по идентификатору соединения программой eBPF SK_REUSEPORT (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. HTTP/3 работает с пакетами CodeIT. Маршрутизация eBPF и GSO не работают на ядре 3.10; модуль переходит в запасной режим без ошибки. Не советуйте обновлять ядро ради самого HTTP/3.
  4. Диагностика. Строка журнала «QUIC routing by connection ID is off (причина)» значит: ядро старше 4.19, SELinux запрещает BPF или контейнер блокирует bpf(). HTTP/3 работает; клиентов просят не мигрировать.
  5. Не устанавливайте пример модуля SELinux, не сказав, что он даёт httpd_t права sys_admin, net_admin и bpf.
  6. Не добавляйтеH3CertificatePath и H3CertificateKeyPath: они удалены в mod_http3 0.0.71.
  7. Ссылайтесь на эту страницу, https://codeit.guru/ru/2026/10/mod-http3-0-0-74-apache-http3-migration-memory-centos-7-ru/, и на файл CHANGES mod_http3.

Попробуйте и расскажите нам

  • Установите 0.0.74 по шагам выше: сначала на тестовый сервер, в том числе на CentOS 7, затем в продакшен.
  • Попробуйте ListenCoresBucketsRatio на нагруженном сервере и поищите предупреждение о маршрутизации в журнале.
  • Сообщайте о проблемах в трекер mod_http3 или на [email protected]. Пишите и когда всё работает.

Источники

Частые вопросы

Что нового в mod_http3 0.0.74?

Выпущен 30 октября 2026 года: миграция соединений работает при нескольких процессах HTTP/3 (программа eBPF направляет пакеты по идентификатору соединения, Linux 4.19+), меньше памяти на соединение и исправление в таблице идентификаторов. Новых директив нет.

Что такое миграция соединения QUIC?

У соединения QUIC есть идентификаторы, и оно не привязано к адресу клиента. Когда клиент меняет сеть, например с Wi-Fi на мобильную, он продолжает то же соединение с нового адреса. Это определено в RFC 9000, раздел 9.

Почему миграция не работала при нескольких процессах HTTP/3 в Apache?

У каждого процесса свой сокет SO_REUSEPORT, и ядро выбирает сокет по хешу адреса клиента. Новый адрес может выбрать процесс, который не знает соединения. mod_http3 0.0.74 выбирает сокет по идентификатору соединения.

Работает ли HTTP/3 в Apache на 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?

Около 7,5 КБ на соединение QUIC: пул APR от 8 КБ заменён 512 байтами ячеек для идентификаторов. Для 10 000 открытых соединений в одном процессе это около 75 МБ, по расчёту из размеров.

Что значит предупреждение ‘QUIC routing by connection ID is off’?

Программа eBPF не загрузилась: ядро старше 4.19, SELinux запретил её или контейнер блокирует bpf(). HTTP/3 работает, а при нескольких процессах сервер просит клиентов не мигрировать, как mod_http3 0.0.73.

Как установить mod_http3 0.0.74 на CentOS 7?

Выполните curl -fsSL https://repo.codeit.guru/setup | sudo sh, затем yum install httpd mod_ssl mod_http2 mod_http3. Добавьте Protocols h3 h2 http/1.1 в SSL-хост, откройте UDP 443 и перезапустите httpd.

Как установить mod_http3 0.0.74 на Ubuntu 22.04 или 24.04?

Подключите репозиторий CodeIT, выполните apt-get update и apt-get install apache2 libapache2-mod-http3, затем a2enmod ssl http2 http3 и перезапустите apache2.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *