Tengine-3.2.0-rc1
Pre-releaseSuperseded by 3.2.0-rc2 — it signs every package, splits out debug symbols, ships
ngx_http_perl_moduleas its own subpackage, and adds SLES 16, openEuler 22.03, Anolis 23, Ubuntu 26.04 and Alpine 3.21–3.24. Please test that one instead.
Chinese changelog: CHANGES.cn
This is the first release candidate of Tengine 3.2.0, the first release since 3.1.0 (October 2023). It is feature complete: we are looking for field testing and bug reports before the final release. Please do not use it in production yet.
What to test
We are especially interested in reports about the new distribution packages and container images, HTTP/3 over xquic on lossy networks, and the load-balancing changes. Please open an issue with the output of tengine -V, the relevant configuration, and the platform.
Security
- fixed CVE-2026-49975, HPACK/QPACK header decompression bomb in HTTP/1, HTTP/2 and HTTP/3 @lianglli
- fixed CVE-2026-9256, heap buffer overflow with overlapping captures in ngx_http_rewrite_module @lianglli
- fixed CVE-2026-42945, escaping issue and possible buffer overrun in ngx_http_rewrite_module @drawing
- fixed CVE-2026-42946, buffer overread when parsing a split status line in ngx_http_scgi_module and ngx_http_uwsgi_module @drawing
- fixed CVE-2026-42934, buffer overread in recode_from_utf8() of ngx_http_charset_module @drawing
- fixed CVE-2026-40701, use-after-free in the OCSP resolver of ngx_http_ssl_module @drawing
- fixed CVE-2026-1642, a premature plain text response from an SSL backend was parsed before the handshake @drawing
- fixed an out-of-bounds read in mod_dubbo @orbisai0security
Highlights
- core updated to nginx 1.31.3 @lianglli
- HTTP/3 connection management and multiplexing, for lower latency and higher resilience to packet loss on unstable networks, with BBR as the default congestion control [xquic] @lianglli @lurker-Chen
- distribution packages (rpm, deb and apk) and multi-arch container images, all built with the full feature set — Tongsuo, xquic and Lua @lianglli
- new module
ngx_zstdfor Zstandard response compression and serving pre-compressed static files @lianglli - new module
ngx_http_upstream_iwrr_module, a weighted round-robin with O(1) time and O(n) memory @jizhuozhi - request and upstream timing statistics variables, e.g.
$request_recv_time,$response_send_time,$server_rtand$upstream_first_pkg_time@lianglli - dynamically configure failover to a backup upstream or a redirect by response status code [tengine-ingress] @lianglli
ngx_http_lua_moduleupdated to 0.10.29, which adds PCRE2 support @liangllingx_http_upstream_rbtree_lookup()is now a public API, so third-party modules can look up an upstream by name @lhanjian
47 changes in total: 18 features, 16 bugfixes, 8 security fixes and 5 changes — the complete list is in CHANGES.te.
Known limitations in RC1
ngx_http_tunnel_moduleis optional and off by default — it conflicts withngx_http_proxy_connect_moduleon the CONNECT method.least_timeandstickyare disabled in the HTTP/2 rework and are being revisited.- The package file names carry no
rc1marker; artifacts here are named3.2.0-<timestamp>. - Compared with the platforms nginx publishes packages for, Ubuntu 26.04 and SLES 16 are not covered yet, and Alpine ships only for 3.22 rather than 3.21 through 3.24. Everything is built for x86_64 and aarch64 only.
Every artifact here is built with the full feature set: Tongsuo (NTLS / TLCP, Chinese cryptography), xquic (QUIC and HTTP/3) and the LuaJIT scripting stack, all from the versions pinned in packages/build/deps.env. Tongsuo is linked statically, so these builds do not follow the system OpenSSL.
The server installs as /usr/sbin/tengine, configured through /etc/tengine/tengine.conf, and can coexist with a distro nginx.
Install
RPM (RHEL / Rocky / Alma / Anolis / openEuler / SLES) — replace el9 with your platform's tag (el7, el8, el10, an8, oe2403, sles15):
dnf install https://github.com/alibaba/tengine/releases/download/3.2.0-rc1/tengine-3.2.0-20260801200506.el9.x86_64.rpmDEB (Debian / Ubuntu) — replace bookworm with your codename (bullseye, trixie, jammy, noble):
curl -fLO https://github.com/alibaba/tengine/releases/download/3.2.0-rc1/tengine_3.2.0-20260801200506.bookworm_amd64.deb
apt install ./tengine_3.2.0-20260801200506.bookworm_amd64.debAlpine:
curl -fLO https://github.com/alibaba/tengine/releases/download/3.2.0-rc1/tengine-3.2.0_p20260801200506-r0.x86_64.apk
apk add --allow-untrusted ./tengine-3.2.0_p20260801200506-r0.x86_64.apkDebug symbols ship separately as tengine-debuginfo / tengine-debugsource (rpm) and tengine-dbgsym (deb); the tengine-doc and tengine-openrc apks are optional subpackages.
Container images
docker pull ghcr.io/alibaba/tengine:3.2.0-rc1
docker pull ghcr.io/alibaba/tengine:3.2.0-rc1-alpineBoth are multi-arch (amd64 + arm64).
Verify
curl -fLO https://github.com/alibaba/tengine/releases/download/3.2.0-rc1/SHA256SUMS
sha256sum --ignore-missing -c SHA256SUMScovers every package here, so --ignore-missing restricts the check to the files you actually downloaded. On Alpine the busybox sha256sum has no such flag — use grep <filename> SHA256SUMS | sha256sum -c there, or install coreutils.
A deb needs one extra step. GitHub replaces ~ with . when it serves a release asset, while SHA256SUMS records the name the package was built with — so the deb you download is …-20260801200506.bookworm_amd64.deb while the checksum file lists …-20260801200506~bookworm_amd64.deb. Because --ignore-missing skips a name it cannot find, a run that also checked an rpm reports success while every deb went unverified. Rename it back first:
f=tengine_3.2.0-20260801200506.bookworm_amd64.deb
mv "$f" "${f/.bookworm/~bookworm}"
grep -F "${f/.bookworm/~bookworm}" SHA256SUMS | sha256sum -cThe contents are unaffected — only the file name differs. The final release will normalise the names so that this step is no longer needed.
What's Changed
- open ngx_http_upstream_rbtree_lookup as api by @lhanjian in #1868
- Readme: dynamically configure HTTP routing based on modulo operation … by @lianglli in #1886
- fix close request after upstream finished by @lurker-Chen in #1887
- default use bbr as cc instead of cubic by @lurker-Chen in #1888
- add request_start_time variable by @drawing in #1867
- iwrr: a wrr with always O(1) time and O(n) memory by @jizhuozhi in #1729
- set socket buffer when proxy request by @drawing in #1892
- CI: checkout lua-resty-core 0.1.27 for tengine with ngx_http_lua_module 0.10.25 by @lianglli in #1898
- fix nameserver testcase by @drawing in #1966
- add change pipe size command by @drawing in #1965
- Set pip size function only on linux by @drawing in #1994
- fix http3 ssl_handshake_time variable by @drawing in #2001
- fix: adapt xquic module to v1.9.1 API and resolve SSL connection issues by @drawing in #2020
- Fix lua ngx.location.capture 504 by @yelili422 in #1992
- fix: resolve CI test failures in ssl.t and ngx_http_xquic.t by @drawing in #2021
- fix: update test cases for ntls and xquic integration by @drawing in #2022
- fix: Security patches for CVE-2026-42945, CVE-2026-42946, CVE-2026-42934, CVE-2026-40701 by @drawing in #2027
- fix: CVE-2026-1642 - SSL upstream injection via premature plain text response by @drawing in #2028
- fix: Use copied string length consistently in ngx_dubbo_util by @orbisai0security in #2029
- Add test case about CVE-2026-42945 by @lianglli in #2030
- fix(http2,h3): respect server_tag directive in HTTP/2 and HTTP/3 responses by @drawing in #2031
- fix: CVE-2026-9256 - heap buffer overflow with overlapping captures i… by @lianglli in #2035
- HTTP/3: connection management and multiplexing work in tandem to deliver lower latency, higher resilience to packet loss, and improved performance on unstable/mobile networks by @lianglli in #2039
- fix: CVE-2026-49975 H2/HPACK Boom and H3/QPACK Boom by @lianglli in #2041
- CVE-2026-49975: warn log about too many headers of H1, H2 and H3 by @lianglli in #2042
- Core: sync core/event/http/stream/mail by @lianglli in #2048
- HTTP method/encoding compatibility, timing observability, SSL logging & upstream error-code enhancements by @lianglli in #2051
- Feature: sync ngx_ingress_module with failover routing and its supporting mod_common & round-robin capabilities by @lianglli in #2052
- Feature: add ngx_zstd and health-check keepalive fix; License: drop GPL-derived hlist; CI: stabilize flaky timing tests by @lianglli in #2054
- CI: add distro packaging, enable the upstream_check test cases, and make status checks gate-able by @lianglli in #2055
- Release 3.2.0: full-featured distro packages, container images and changelogs by @lianglli in #2056
- Fix the PCRE2 build failure of ngx_http_lua_module by @lianglli in #2058
- Fix unix socket health checking and the GCC 14 build by @lianglli in #2065
New Contributors
- @yelili422 made their first contribution in #1992
- @orbisai0security made their first contribution in #2029
Full Changelog: 3.1.0...3.2.0-rc1