Выпущены RPM- и DEB-пакеты NGINX 1.31.5 Mainline с поддержкой HTTP/3, Brotli, TLS 1.3 и OpenSSL 4.0.2 для EL7/EL8/EL9/EL10, Ubuntu 22.04/24.04

nginx 1.31.5 Mainline с поддержкой HTTP/3 добавлен в репозиторий CodeIT. http2 и ngx_cache_purge встроены, а OpenSSL динамически линкуется с официальным OpenSSL 4.0.2 с поддержкой QUIC. Модуль сжатия Brotli от Google и ngx_http_geoip2 поставляются как динамические модули — в пакетах nginx-module-brotli и nginx-module-geoip2, которые rpm-пакет nginx устанавливает автоматически (зависимость оставлена, чтобы существующие установки обновлялись без потери этих директив; через несколько месяцев мы её уберём, и оба модуля станут полностью необязательными). Пакеты собраны для RHEL, CentOS, AlmaLinux, Rocky Linux и Oracle Linux 7, 8, 9 и 10, а также для Ubuntu 22.04 и 24.04.

Остальные динамические модули собраны отдельно и устанавливаются по желанию: nginx-module-lua вместе с lua-resty-core и lua-resty-lrucache, nginx-module-acme для автоматических сертификатов ACMEv2, nginx-module-njs, nginx-module-perl, nginx-module-xslt и nginx-module-image-filter. Каждый пакет сам добавляет строку load_module в /etc/nginx/modules-enabled, поэтому модуль работает сразу после установки и править nginx.conf вручную не нужно. Lua и ACME собираются для EL9, EL10 и Ubuntu; для EL7 вместо них есть nginx-module-geoip, а njs, Perl, XSLT и image-filter доступны только в rpm.

Тот же выпуск есть на Docker Hub как codeitus/nginx: образ собран на AlmaLinux 9 из этих же пакетов и опубликован для amd64 и arm64:

  • самый свежий образ, из того пула, который вышел последним: docker pull codeitus/nginx
  • самый свежий образ Mainline: docker pull codeitus/nginx:mainline
  • именно этот выпуск: docker pull codeitus/nginx:1.31.5

Для HTTP/3 нужно опубликовать и UDP-порт, а не только TCP: docker run -d -p 80:80 -p 443:443 -p 443:443/udp codeitus/nginx

Основные изменения:

  • Функция: управление API.
  • Функция: условия по расположениям.
  • Функция: модуль ngx_http_json_module.
  • Функция: директива «client_body_early_read».
  • Исправлена ошибка: use-after-free мог возникать в рабочем процессе, если выполнялось проксирование с использованием буферизации и ошибка возникала при отправке ответа HTTP/2-клиенту.
  • Исправлена ошибка: рабочий процесс больше не мог не завершаться или в журналах больше не появлялись оповещения «accept4() failed (9: Bad file descriptor)» при исчерпании файловых дескрипторов до начала планового завершения.
  • Исправлена ошибка: запросы к бэкендам FastCGI и uwsgi формировались некорректно, если имя параметра было слишком длинным.
  • Исправлены ошибки в HTTP/3, ngx_http_slice_module и ngx_http_memcached_module.

Обновление безопасности: Выпущены RPM- и DEB-пакеты openssl 4.0.2

openssl 4.0.2 добавлен в репозиторий CodeIT. Пакеты собраны для RHEL, CentOS, AlmaLinux, Rocky Linux и Oracle Linux 7, 8, 9 и 10, а также для Ubuntu 22.04 и 24.04.

Это обновление устраняет уязвимости. Рекомендуется обновиться.

Основные изменения:

  • OpenSSL 4.0.2 — это исправляющий пакет по безопасности. Самая серьёзная из устранённых в этом выпуске уязвимостей — Moderate.
  • В этом выпуске учтены следующие исправления ошибок и меры по снижению рисков:
  • Исправлена проверка тегов аутентификации для пустого шифртекста в режимах AEAD для блочных шифров в режиме CCM.

Исправленные уязвимости:

  • Исправлена возможность того, что QUIC-сервер мог вызывать двойное освобождение при обработке пакета `INITIAL`. (CVE-2026-18798)
  • Исправлен выход за пределы буфера в куче при разворачивании ключей в CMS. (CVE-2026-63072)
  • Исправлено обращение по недопустимому указателю в CMP-сервере через специально сформированный `protectionAlg`. (CVE-2026-63076)
  • Исправлен неограниченный рост памяти в очереди входящих каналов QUIC-сервера. (CVE-2026-14456)
  • Исправлена возможность для RPK-сервера при выборе алгоритма подписи приводить к разыменованию отсутствующего сертификата. (CVE-2026-14457)
  • Исправлено чрезмерное использование памяти при буферизации DTLS-записей для будущего эпоха. (CVE-2026-54874)
  • Исправлена утечка памяти на стороне клиента при проверке ответа OCSP. (CVE-2026-54876)
  • Исправлено использование ненадёжного Sender DN в качестве строки формата при проверке ответа CMP. (CVE-2026-63073)
  • Исправлен бесконечный рост кэша в CMP для `extraCerts`. (CVE-2026-63074)
  • Исправлена возможность того, что удержание пакетов только с ACK в QUIC приводило к исчерпанию памяти. (CVE-2026-63075)
  • Исправлена возможность подделок AEAD с пустым шифртекстом при использовании `EVP_Cipher()`. (CVE-2026-75803)

Библиотеки с поддержкой QUIC по-прежнему поставляются отдельным, не конфликтующим пакетом openssl-quic-libs с собственным суффиксом .so.81.4, чтобы избежать конфликтов с официальным .so.X.

Выпущены RPM- и DEB-пакеты NGINX 1.31.4 Mainline с поддержкой HTTP/3, Brotli, TLS 1.3 и OpenSSL 4.0.1 для EL7/EL8/EL9/EL10, Ubuntu 22.04/24.04

nginx 1.31.4 Mainline с поддержкой HTTP/3 добавлен в репозиторий CodeIT. http2 и ngx_cache_purge встроены, а OpenSSL динамически линкуется с официальным OpenSSL 4.0.1 с поддержкой QUIC. Модуль сжатия Brotli от Google и ngx_http_geoip2 поставляются как динамические модули — в пакетах nginx-module-brotli и nginx-module-geoip2, которые rpm-пакет nginx устанавливает автоматически (зависимость оставлена, чтобы существующие установки обновлялись без потери этих директив; через несколько месяцев мы её уберём, и оба модуля станут полностью необязательными). Пакеты собраны для RHEL, CentOS, AlmaLinux, Rocky Linux и Oracle Linux 7, 8, 9 и 10, а также для Ubuntu 22.04 и 24.04.

Остальные динамические модули собраны отдельно и устанавливаются по желанию: nginx-module-lua вместе с lua-resty-core и lua-resty-lrucache, nginx-module-acme для автоматических сертификатов ACMEv2, nginx-module-njs, nginx-module-perl, nginx-module-xslt и nginx-module-image-filter. Каждый пакет сам добавляет строку load_module в /etc/nginx/modules-enabled, поэтому модуль работает сразу после установки и править nginx.conf вручную не нужно. Lua и ACME собираются для EL9, EL10 и Ubuntu; для EL7 вместо них есть nginx-module-geoip, а njs, Perl, XSLT и image-filter доступны только в rpm.

Тот же выпуск есть на Docker Hub как codeitus/nginx: образ собран на AlmaLinux 9 из этих же пакетов и опубликован для amd64 и arm64:

  • самый свежий образ, из того пула, который вышел последним: docker pull codeitus/nginx
  • самый свежий образ Mainline: docker pull codeitus/nginx:mainline
  • именно этот выпуск: docker pull codeitus/nginx:1.31.4

Для HTTP/3 нужно опубликовать и UDP-порт, а не только TCP: docker run -d -p 80:80 -p 443:443 -p 443:443/udp codeitus/nginx

Основные изменения:

  • Feature: директива «proxy_protocol» в модулях stream и mail теперь поддерживает версию 2 протокола PROXY.
  • Change: запросы к бэкендам для HTTP/2 и gRPC теперь всегда отправляются с псевдозаголовком «:authority», а запросы HTTP/1.1 — с заголовком «Host».
  • Bugfix: в рабочем процессе может возникать аварийное завершение, если использовался метод «select».
  • Bugfix: неполные ответы gRPC с строкой заголовка «Content-Length» со значением не нулевым теперь считаются некорректными.
  • Bugfix: устранена проблема двоичной совместимости с сторонними модулями, использующими коды сценариев; ошибка возникала в 1.31.3.
  • Bugfix: устранена ошибка в модуле ngx_http_perl_module.
  • Bugfixes в HTTP/2, HTTP/3, ngx_http_image_filter_module и ngx_http_grpc_module.

Обновление безопасности: Выпущены RPM- и DEB-пакеты apr-util 1.6.5

apr-util 1.6.5 добавлен в репозиторий CodeIT. Пакеты собраны для RHEL, CentOS, AlmaLinux, Rocky Linux и Oracle Linux 7, 8, 9 и 10, а также для Ubuntu 22.04 и 24.04.

Это обновление устраняет уязвимости. Рекомендуется обновиться.

Основные изменения:

  • Исправлены ошибки компиляции oracle DBD, добавленные в 1.6.4. PR 70170.
  • apr_brigade: Разделение последней LF в apr_brigade_split_line больше не выполняется, чтобы не создавать пустой бакет. PR 64273
  • apr_brigade: Бакеты метаданных теперь игнорируются в apr_brigade_split_line, apr_brigade_flatten и apr_brigade_to_iovec, исправляя возможное неопределённое поведение. PR 68278
  • apr_crypto_openssl: Совместимость с OpenSSL 3.
  • apr_crypto_openssl: Используется OPENSSL_init_crypto() для инициализации OpenSSL в версиях 1.1+.
  • apr_memcache: Исправлен поиск имени, чтобы поддерживались и IPv6, и IPv4.
  • configure: Исправлено обнаружение Berkeley DB компиляторами, которые требуют строгую совместимость с C99. PR 66396.

Исправленные уязвимости:

  • SECURITY: CVE-2026-34502: Переполнение буфера в куче в клиенте memcached APR: уязвимость переполнения буфера на основе кучи в клиенте Apache Portable Runtime Utility memcached. Эта проблема затрагивает Apache Portable Runtime Utility: начиная с 1.3.0 и по 1.6.3 включительно.
  • SECURITY: CVE-2026-34501: Apache Portable Runtime Utility: Переполнение буфера в куче в клиенте redis APR: уязвимость переполнения буфера на основе кучи в клиенте Apache Portable Runtime Utility redis. Эта проблема затрагивает Apache Portable Runtime Utility: начиная с 1.6.0 и по 1.6.3 включительно. Пользователям рекомендуется выполнить обновление до версии 1.6.4, которая устраняет проблему.
  • SECURITY: CVE-2026-34191: Apache Portable Runtime Utility: SQL Injection в apr_dbd_oracle: Недостаточная нейтрализация специальных элементов, используемых в команде SQL («SQL Injection»), в уязвимости Apache Portable Runtime Utility через провайдер apr_dbd_oracle. Эта проблема затрагивает Apache Portable Runtime Utility: начиная с 1.6.0 и по 1.6.3 включительно. Пользователям рекомендуется выполнить обновление до версии 1.6.4, которая устраняет проблему.
  • SECURITY: CVE-2026-32327: Apache Portable Runtime Utility: аварийное завершение из‑за рекурсии в XML-стеке в apr-util: ошибка в APR-util версии 1.6.3 (и более ранних) позволяет атаковать рекурсией в стеке любого потребителя библиотек, который выполняет разбор XML из ненадёжных источников и использует функцию apr_xml_quote_elem(). Пользователям рекомендуется выполнить обновление до версии 1.6.4, которая устраняет проблему.
  • SECURITY: CVE-2025-49506: apr_password_validate() уязвима к атаке по времени APR-util версии 1.6.3 (и более ранние) функция apr_password_validate() не выполняла сравнение хэшей или паролей за постоянное время, что потенциально могло раскрывать их содержимое через побочный канал по времени атаки, особенно на платформах без crypt() таких как Windows, BeOS, NetWare или Android. Пользователям рекомендуется выполнить обновление до версии 1.6.4, которая устраняет проблему.

Выпущены RPM- и DEB-пакеты sshoq 0.5.0

sshoq 0.5.0 добавлен в репозиторий CodeIT. Пакеты собраны для RHEL, CentOS, AlmaLinux, Rocky Linux и Oracle Linux 8, 9 и 10, а также для Ubuntu 22.04 и 24.04.

Основные изменения:

  • Экранирование и кавычки путей в стиле OpenSSH в клиенте SFTP
  • feat: отображается прогресс передачи (процент и скорость) для операций sftp/scp
  • feat: добавлена возможность отменять передачи sftp/scp с помощью Ctrl+C
  • feat: добавлены сокращения cd в стиле OpenSSH в клиенте SFTP
  • feat: добавлена поддержка подстановочных символов для исходных файлов put/get в клиенте SFTP
  • perf: конвейеризация передач SFTP для устранения узкого места с дополнительными задержками на каждый блок при обмене туда-обратно
  • fix: путь к файлу включается во все сообщения об ошибках клиента/сервера sftp
  • sftp: по умолчанию следуют символическим ссылкам на клиенте, добавлен ключ -no-follow-symlinks
  • perf: заменён JSON-протокол SFTP на компактный двоичный формат
  • Увеличено окно передачи
  • sftp: продолжение выполнения get -r после файлов с ошибкой permission-denied

sshoq 0.4.0 rpms released

sshoq 0.4.0 rpms released and added to all supported platforms.

Major changes since 0.3.0:

— fix(auth): return error on key load failure instead of panicking on nil key — fix: print error to stderr when sshoq-server fails to start — Feature/default ssh keys from dot ssh — wildcard for get -r — SFTP client: Add readline-style arrow keys support — feat: add -scp mode for non-interactive file transfer — feat: support multiple simultaneous local and remote port forwardings — fix: correct the port forwarding syntax error message — feat: add tab completion for file paths in the SFTP client — sftp client: add wildcard/glob support to ls — sftp client: add wildcard/glob support to get — fix: reassemble chunked SFTP messages across channel data messages — fix: linux-arm64 release build and drop windows client-only pipeline

sshoq 0.3.0 rpms released

sshoq 0.3.0 rpms released and added to all supported platforms.

Major changes:

— SFTP is enabled on the server by default, but can be disabled with `sshoq-server -disable-sftp` On the client, do `sshoq -sftp user@host` to enter sftp shell. Normal commands like `ls`, `cd`, `put`, `get` etc. are supported including recursive mode (e.g. `get -r path`). Tab completion and wildcards are not implemented yet for SFTP so exact paths must be used. — fix: two small problem by @nameearly — Add sftp support by @h4sh5 — Harden SFTP server with user-scoped permission checks and fd-relative no-follow filesystem ops by @h4sh5 with @Copilot — Reject disabled SFTP channels with SSH channel-open failure by @h4sh5 with @Copilot — Add recursive directory transfers to SFTP mode by @h4sh5 with @Copilot — Harden SFTP stat: enforce ancestor-execute permissions via Fstatat by @h4sh5 with @Copilot — SFTP handler: drop privileges to the logged-in user by @h4sh5 with @Copilot in — add ownership details (user and group) to sftp ls command by @h4sh5 — allow running integration tests locally by @h4sh5 — @nameearly made their first contribution — @h4sh5 with @Copilot made their first contribution

mod_http3 0.0.54 for Apache httpd 2.4.68 is available for testing

Experimental mod_http3 0.0.54 packages are now available in the CodeIT testing repository for EL7, EL8, EL9 and EL10.

The module requires our patched httpd 2.4.68-2 package, which includes MPM changes required for externally managed QUIC connections.

HTTP/3 support remains experimental. Use these packages on testing systems before considering production deployment.

Changes

— applies the core LimitRequestFields and LimitRequestFieldSize to HTTP/3 requests, which nothing did before, and advertises the bound as SETTINGS_MAX_FIELD_SECTION_SIZE instead of nghttp3’s (1<<62)-1 — bounds a response that makes no progress (H3StreamTimeout) so a client that stops reading cannot hold a worker thread, and closes a connection past H3MaxStreamErrors — advertises a QPACK dynamic table (H3QpackTableCapacity, H3QpackBlockedStreams); it was disabled, so HTTP/3 compressed request headers worse than HTTP/2 on the same server — exposes the request worker pool (H3MinWorkers, H3MaxWorkers, H3MaxWorkerIdleSeconds), previously hardcoded at 16/64 — resolves mod_logio once instead of once per request

Installation

For EL8, EL9 and EL10:

dnf module reset -y httpd
dnf module enable -y httpd:codeit
dnf config-manager --setopt=CodeIT-testing.module_hotfixes=1 --save

dnf --enablerepo=CodeIT-testing install -y \
    httpd mod_ssl mod_http2 mod_http3

For EL7:

yum --enablerepo=CodeIT-testing install -y \
    httpd mod_ssl mod_http2 mod_http3

Verify the installed versions:

rpm -q httpd mod_http3

Expected versions:

httpd-2.4.68-2...
mod_http3-0.0.54-1...

Configuration

Default example configuration file is /etc/httpd/vhosts.d/http3-vhost.conf (installed together with the package):

EnableMMAP Off

# Keep the existing Listen directive.
# Do not duplicate it if another configuration file already contains it:
# Listen 443 https

<VirtualHost *:443>
    ServerName example.com

    SSLEngine on
    SSLCertificateFile    /etc/pki/tls/certs/localhost.crt
    SSLCertificateKeyFile /etc/pki/tls/private/localhost.key

    Protocols h3 h2 http/1.1

    H3Port 443
    H3QuicEngine openssl
    H3CertificatePath    /etc/pki/tls/certs/localhost.crt
    H3CertificateKeyPath /etc/pki/tls/private/localhost.key

    DocumentRoot /var/www/html

    <Directory /var/www/html>
        Require all granted
    </Directory>
</VirtualHost>

Check the configuration and restart Apache:

httpd -t
httpd -M | grep -E 'http3|http2|ssl'
systemctl restart httpd

Firewall

HTTP/3 uses QUIC over UDP. Both TCP and UDP port 443 must be open:

firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --add-port=443/udp
firewall-cmd --reload

Check the listeners:

ss -lntup | grep ':443'

Testing HTTP/3

The CodeIT ngtcp2 package includes the osslclient QUIC test client. To test the local Apache instance while sending example.com as the target hostname, run:

dnf install ngtcp2
osslclient 127.0.0.1 443 https://example.com

This connects directly to UDP port 443 on localhost and performs an HTTP/3 request using example.com for TLS and HTTP hostname handling.

You can also use a curl build that lists HTTP3 in curl -V:

curl --http3-only -vkI https://example.com/

A successful response should contain:

HTTP/3 200

You can also test graceful restart behavior while an HTTP/3 connection is active:

apachectl graceful
journalctl -u httpd -f

The first browser request may use HTTP/2 while the browser discovers HTTP/3 through Alt-Svc. Reload the page and check the Protocol column in browser Developer Tools for h3.

Please report successful installations, crashes, compatibility issues and graceful-restart problems through comments.

mod_http3 0.0.53 for Apache httpd 2.4.68 is available for testing

Experimental mod_http3 0.0.53 packages are now available in the CodeIT testing repository for EL7, EL8, EL9 and EL10.

The module requires our patched httpd 2.4.68-2 package, which includes MPM changes required for externally managed QUIC connections.

HTTP/3 support remains experimental. Use these packages on testing systems before considering production deployment.

Changes

*) Rejected malformed HTTP/3 requests (missing or duplicate pseudo-header fields, connection-specific fields, content-length mismatch) with a stream error of type H3_MESSAGE_ERROR per RFC 9114 4.1.2. Previously one malformed request closed the whole QUIC connection, ending every other request in flight on it.
[Alexander Gerasimov]

*) Added support for building against httpd 2.4.52+. Without response buckets the module removes the core HTTP_HEADER filter from its requests and snapshots status and headers itself, mirroring mod_http2’s !AP_HAS_RESPONSE_BUCKETS path.
[Alexander Gerasimov]

*) Made the MPM connection-count notifications optional. Stock 2.4.x MPMs do not provide them; the module then runs in a degraded mode where a graceful child stop does not wait for active QUIC connections to drain. The patch in .patches/httpd-2.4.66-pr699.patch adds the notifications to httpd 2.4.x.
[Alexander Gerasimov]

*) Enforced H3IdleTimeout in the module’s own event loop. The QUIC stacks keep an otherwise idle connection alive by themselves — OpenSSL sends a keepalive PING at half the idle interval to hold NAT state open — which resets both endpoints’ idle timers, so the transport timeout never fired and a finished connection held its session pool and its H3MaxConnections slot until the client went away.
[Alexander Gerasimov]

*) Read queued datagrams in one batch with recvmmsg() where the platform has
it, and read the socket’s local address once per event-loop pass instead
of once per datagram, halving the syscalls the ngtcp2 engine spends on a
busy socket. The OpenSSL engine already batches inside its own datagram
BIO. Also dropped a per-pass walk of the connection list whose result was
never used.
[Alexander Gerasimov]

*) Added H3SocketBufferSize, which asks for the QUIC socket send and receive buffer size. A receive buffer left at the OS default overflows once a single connection runs at speed, and each dropped datagram costs a retransmit; the OS still caps what it grants, and a capped grant is logged rather than fatal.
[Alexander Gerasimov]

*) Added H3SessionTickets, which controls whether TLS 1.3 session tickets are issued so a returning client can resume instead of running a full handshake. Tickets stay on by default, as before, and each worker process keeps its own ticket keys, so a client resumes only when it returns to the process that issued its ticket.
[Alexander Gerasimov]

*) Added H3EarlyData, off by default, together with an engine capability bit saying whether 0-RTT can be accepted at all. The OpenSSL QUIC stack has no server-side 0-RTT, so turning early data on there now logs a warning that names the engine instead of silently doing nothing.
[Alexander Gerasimov]

*) Published the mod_ssl TLS environment for HTTP/3 requests: SSL_PROTOCOL, SSL_CIPHER, SSL_CIPHER_USEKEYSIZE, SSL_CIPHER_ALGKEYSIZE, SSL_CIPHER_EXPORT and SSL_SESSION_RESUMED, under the names mod_ssl uses. mod_ssl does not manage these connections, so scripts and rewrite conditions that read them saw nothing but HTTPS=on over HTTP/3. The values are read from the QUIC engine through a new conn.tls_info entry and formatted once per connection, not per request.
[Alexander Gerasimov]

Installation

For EL8, EL9 and EL10:

dnf module reset -y httpd
dnf module enable -y httpd:codeit
dnf config-manager --setopt=CodeIT-testing.module_hotfixes=1 --save

dnf --enablerepo=CodeIT-testing install -y \
    httpd mod_ssl mod_http2 mod_http3

For EL7:

yum --enablerepo=CodeIT-testing install -y \
    httpd mod_ssl mod_http2 mod_http3

Verify the installed versions:

rpm -q httpd mod_http3

Expected versions:

httpd-2.4.68-2...
mod_http3-0.0.53-1...

Configuration

Default example configuration file is /etc/httpd/vhosts.d/http3-vhost.conf (installed together with the package):

EnableMMAP Off

# Keep the existing Listen directive.
# Do not duplicate it if another configuration file already contains it:
# Listen 443 https

<VirtualHost *:443>
    ServerName example.com

    SSLEngine on
    SSLCertificateFile    /etc/pki/tls/certs/localhost.crt
    SSLCertificateKeyFile /etc/pki/tls/private/localhost.key

    Protocols h3 h2 http/1.1

    H3Port 443
    H3QuicEngine openssl
    H3CertificatePath    /etc/pki/tls/certs/localhost.crt
    H3CertificateKeyPath /etc/pki/tls/private/localhost.key

    DocumentRoot /var/www/html

    <Directory /var/www/html>
        Require all granted
    </Directory>
</VirtualHost>

Check the configuration and restart Apache:

httpd -t
httpd -M | grep -E 'http3|http2|ssl'
systemctl restart httpd

Firewall

HTTP/3 uses QUIC over UDP. Both TCP and UDP port 443 must be open:

firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --add-port=443/udp
firewall-cmd --reload

Check the listeners:

ss -lntup | grep ':443'

Testing HTTP/3

The CodeIT ngtcp2 package includes the osslclient QUIC test client. To test the local Apache instance while sending example.com as the target hostname, run:

dnf install ngtcp2
osslclient 127.0.0.1 443 https://example.com

This connects directly to UDP port 443 on localhost and performs an HTTP/3 request using example.com for TLS and HTTP hostname handling.

You can also use a curl build that lists HTTP3 in curl -V:

curl --http3-only -vkI https://example.com/

A successful response should contain:

HTTP/3 200

You can also test graceful restart behavior while an HTTP/3 connection is active:

apachectl graceful
journalctl -u httpd -f

The first browser request may use HTTP/2 while the browser discovers HTTP/3 through Alt-Svc. Reload the page and check the Protocol column in browser Developer Tools for h3.

Please report successful installations, crashes, compatibility issues and graceful-restart problems through comments.

mod_http3 0.0.52 for Apache httpd 2.4.68 is available for testing

Experimental mod_http3 0.0.52 packages are now available in the CodeIT testing repository for EL7, EL8, EL9 and EL10.

The module requires our patched httpd 2.4.68-2 package, which includes MPM changes required for externally managed QUIC connections.

HTTP/3 support remains experimental. Use these packages on testing systems before considering production deployment.

Installation

For EL8, EL9 and EL10:

dnf module reset -y httpd
dnf module enable -y httpd:codeit
dnf config-manager --setopt=CodeIT-testing.module_hotfixes=1 --save

dnf --enablerepo=CodeIT-testing install -y \
    httpd mod_ssl mod_http2 mod_http3

For EL7:

yum --enablerepo=CodeIT-testing install -y \
    httpd mod_ssl mod_http2 mod_http3

Verify the installed versions:

rpm -q httpd mod_http3

Expected versions:

httpd-2.4.68-2...
mod_http3-0.0.52-1...

Configuration

Default example configuration file is /etc/httpd/vhosts.d/http3-vhost.conf (installed together with the package):

EnableMMAP Off

# Keep the existing Listen directive.
# Do not duplicate it if another configuration file already contains it:
# Listen 443 https

<VirtualHost *:443>
    ServerName example.com

    SSLEngine on
    SSLCertificateFile    /etc/pki/tls/certs/localhost.crt
    SSLCertificateKeyFile /etc/pki/tls/private/localhost.key

    Protocols h3 h2 http/1.1

    H3Port 443
    H3QuicEngine openssl
    H3CertificatePath    /etc/pki/tls/certs/localhost.crt
    H3CertificateKeyPath /etc/pki/tls/private/localhost.key

    DocumentRoot /var/www/html

    <Directory /var/www/html>
        Require all granted
    </Directory>
</VirtualHost>

Check the configuration and restart Apache:

httpd -t
httpd -M | grep -E 'http3|http2|ssl'
systemctl restart httpd

Firewall

HTTP/3 uses QUIC over UDP. Both TCP and UDP port 443 must be open:

firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --add-port=443/udp
firewall-cmd --reload

Check the listeners:

ss -lntup | grep ':443'

Testing HTTP/3

The CodeIT ngtcp2 package includes the osslclient QUIC test client. To test the local Apache instance while sending example.com as the target hostname, run:

dnf install ngtcp2
osslclient 127.0.0.1 443 https://example.com

This connects directly to UDP port 443 on localhost and performs an HTTP/3 request using example.com for TLS and HTTP hostname handling.

You can also use a curl build that lists HTTP3 in curl -V:

curl --http3-only -vkI https://example.com/

A successful response should contain:

HTTP/3 200

You can also test graceful restart behavior while an HTTP/3 connection is active:

apachectl graceful
journalctl -u httpd -f

The first browser request may use HTTP/2 while the browser discovers HTTP/3 through Alt-Svc. Reload the page and check the Protocol column in browser Developer Tools for h3.

Please report successful installations, crashes, compatibility issues and graceful-restart problems through comments.