Nginx版本更新录(202x)
2023-03-30 11:51:06 阿炯

Nginx ("engine x") 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。是由伊戈尔·西索夫(Igor Sysoev) 所开发,并将源代码以类BSD许可证的形式发布,自其发布以来,已经因为它的稳定性、丰富的功能集、并发能力强(用于解决 C10K 问题)、简明的示例配置文件和低系统资源的消耗而闻名。Nginx 没有采用每客户机一线程的设计模型,而是充分使用异步逻辑,削减了上下文调度开销,所以并发服务能力更强。整体采用模块化设计,有丰富的模块库和第三方模块库,配置灵活。在 Linux 操作系统下,nginx 使用 epoll 事件模型,得益于此,nginx 在 Linux 操作系统下效率相当高;同时 Nginx 在 BSD 操作系统上采用类似于 epoll 的高效事件模型 kqueue。

本文是从Nginx的产品主页分离出来的,专门用于该软件的更新记录,截止到2029年12月31日。


最新版本:1.0
2011年4月12日消息,经过9年的开发,Nginx 终于迎来了1.0版本,第一个公开发布的版本 0.1.0 是在 2004年10月4日发布的。根据W3Techs的报告显示,全球前1百万网站(alexa)中,使用Nginx的占据6.8%。在俄罗斯排名靠前的网站将近一半使用Nginx。Netcraft 的最新报告 “2011年4月份的Web服务器调查报告” 显示目前Nginx在排名百万内网站中,份额已经达 6.52%。Changes with nginx 1.0.0(12 Apr 2011)
1) Bugfix: a cache manager might hog CPU after reload. Thanks to Maxim Dounin.
2) Bugfix: an "image_filter crop" directive worked incorrectly coupled with an "image_filter rotate 180" directive.
3) Bugfix: a "satisfy any" directive disabled custom 401 error page.

最新版本:1.6
该版本修正了一个SSL相关的安全漏洞(CVE-2014-3616),以及两个DNS可能导致请求挂起Bug(1.5.8引入)。

最新版本:1.15
新版是最新的主线(Mainline)版本,更新内容如下:
改动: 现在在 “listen” 指令 nginx 中使用主机名时,将为主机名解析的所有地址创建监听套接字(listening sockets)(以前只使用第一个地址)。
特性: “listen”指令中的端口范围。
特性: 从变量加载 SSL 证书和密钥。
工作区: 使用 OpenSSL 1.1.1 时,$ssl_server_name 变量可能为空
Bug修复: 无法用 Visual Studio 2015(或更新版本 VS)构建 nginx/Windows;这个 bug 已在 1.15.9 出现过。

最新版本:1.16
Nginx 1.16.0 稳定版已发布,包含来自 1.15.x 主线分支的新功能和错误修复:
针对流模块(stream module)中的 UDP 代理改进
随机负载均衡方法(random load balancing method)
支持 TLS 1.3(TLS 1.3 early data)
动态加载 SSL 证书等

更多更新说明请参考CHANGES

最新版本:1.18
Nginx 1.18.0 已发布,这是继 1.16 系列之后的最新稳定版本。1.18.0 加入了 1.17.x mainline 分支中的新功能和 bug 修复,包括 limit_req 和 limit_conn 中的 dry run 模式,limit_rate, limit_rate_after 和 grpc_pass 指令中对变量的支持,以及支持 auth_delay 指令等。auth_delay 指令位于 ngx_http_core_module 模块中,用法如下:
语法:auth_delay time;
默认值:auth_delay 0s;
上下文:http, server, location

通过 401 响应状态码来延迟处理未经授权的请求,以防止因密码、子请求结果或 JWT 导致访问受限而引起的时序攻击(Timing Attack)。其他一些变更:
安全方面的改进,主要是修复针对 HTTP/2 客户端可能导致过多内存消耗和 CPU 使用率升高的问题
修复 nginx 在某些情况下可能过多占用 CPU 的问题,以及许多其他错误修复
需要使用 OpenSSL 0.9.8 或更高版本

最新版本:1.20
Nginx 最新稳定分支 1.20 已于2021年4月中旬发布,新版本引入了来自 1.19.x 主线分支的新功能和错误修复,其中包括:
使用 OCSP 进行客户端 SSL 证书验证
引入 ssl_reject_handshake 和 ssl_conf_command 指令
使用 lingering_close, keepalive_timeout, keepalive_time 和 keepalive_requests 指令简化和提升对 HTTP/2 连接的处理
以严格模式处理上游服务器的响应
支持处理 cookie flags
基于最小可用空间的缓存清除
从客户端和邮件代理的后端服务器均支持 PROXY 协议
支持在 SMTP 代理后端启用用户身份验证
stream 模块新增 set 指令
……
具体每个指令的介绍,访问此链接进行查看。nginx 1.20.1 稳定版和 1.21.0 主线版已于2021年5月底发布。这两个版本均修复了一个高危的安全漏洞:1-byte memory overwrite,此漏洞存在于 nginx 的 DNS 解析模块,并且仅在配置文件中使用"resolver"指令时才会影响 nginx。攻击者可以利用该漏洞进行远程 DDoS 攻击,甚至远程执行。
"max_errors" 指令已移动至邮件代理模块 (mail proxy module)
邮件代理模块支持 POP3 和 IMAP 管道
"listen"指令的"fastopen"参数位于 stream 模块
在自动重定向过程中,没有对特殊字符进行转义,并附加了反斜杠
当使用 SMTP 管道时,与邮件代理模块中的客户端的连接可能被意外关闭
更多内容查看此处

1.20.2 稳定版于2021年11年中旬正式发布,的变化如下:
兼容 OpenSSL 3.0
SSL 变量在日志中使用时可能为空,该错误在 1.19.5 版本中出现过
与 gRPC 后端建立的 keepalive 连接在收到 GOAWAY 帧后可能不会被关闭
流模块中的后端 SSL 连接可能在 SSL 握手后挂起
如果使用 select、poll 或 /dev/poll 方法,与 gRPC 后端的 SSL 连接可能会挂起
当使用 HTTP/2 和 "aio_write" 指令时,请求可能会挂起
更多详情可查看此处

最新版本:1.21
Nginx 1.21.2 主线版已于2021年9月初发布,此版本引入了许多新特性、变更,以及 Bugfix,主要如下:
nginx 现在会拒绝带有"Transfer-Encoding" header line 的 HTTP/1.0 请求
不再支持导出密码、兼容 OpenSSL 3.0
"Auth-SSL-Protocol" 和 "Auth-SSL-Cipher" header lines 现在会被传递到邮件代理身份验证服务器
请求正文过滤器 API 现在允许缓冲正在处理的数据
修复 stream 模块中的后端 SSL 连接可能会在 SSL 握手后挂起的问题
当在"ssl_ciphers"指令中设置"@SECLEVEL=N"时,OpenSSL 1.1.0 或更高版本中的安全级别不影响服务器证书的加载
如果使用 select、poll 或/dev/poll 方法,包含 gRPC 后端的 SSL 连接可能会挂起
使用 HTTP/2 客户端时,如果请求中不存在"Content-Length" header line,则请求正文会被写入磁盘

Nginx 1.22 于2022年5月下旬发布,全面支持 OpenSSL 3.0,为流模块带来了 OpenSSL 3.0 兼容性、对请求走私和跨协议攻击的强化,以及对应用层协议协商 (ALPN) 的支持。此外,该版本还包括对 PCRE2 库的支持,对 OpenSSL 3.0 和 SSL_sendfile () 的支持,改进了 FreeBSD 上的 sendfile 处理,mp4_start_key_frame 指令等等。

最新版本:1.23
Nginx 1.23.0 主线版已于2022年6月下旬发布,主要变化如下:
内部 API 变化:header 头现在以链表 (linked lists) 形式展示。
nginx 将数据发送到 FastCGI、SCGI 和 uwsgi 后端时,在 ngx_http_perl_module 的 $r->header_in () 方法中,以及在查找 "$http_...", "$sent_http_...", "$sent_trailer_...", "$upstream_http_..." 和 "$upstream_trailer_..." 变量期间,会组合具有完全相同名称的任意 header 头。
Bugfix:如果后端响应中有多个 "Vary" header 头,nginx 仅在缓存时使用最后一个。
Bugfix:如果后端响应中有多个 "WWW-Authenticate" header 头,并且代码 401 的错误被拦截或使用了 “auth_request” 指令,则 nginx 仅将第一个 header 头发送到客户端。
Change: the logging level of the "application data after close notify" SSL errors has been lowered from "crit" to "info".
"application data after close notify" SSL 的错误日志记录级别已从 "crit" 降低到 "info"。
Bugfix:如果 nginx 是在 Linux 2.6.17 或更高版本上构建的,但在不支持 EPOLLRDHUP 的系统上使用,尤其是在具有 epoll 仿真层的系统上使用时,连接可能会挂起;该错误已在 1.17.5 中复现。
Bugfix:如果 "Expires" 响应 header 头禁用缓存,nginx 不会缓存响应,但会遵循 "Cache-Control" header 头启用缓存。

Nginx 于2022年10月下旬发布了两个新版本,分别是 stable 分支的 1.22.1 和 mainline 分支的 1.23.2,更新内容主要是修复安全问题。

nginx 1.22.1
安全修复:使用 ngx_http_mp4_module 模块处理特制的 mp4 文件时,可能会导致 worker 进程崩溃、worker 进程内存泄漏和损坏,也可能产生潜在的其他影响 (CVE-2022-41741, CVE-2022-41742)。

nginx 1.23.2
新特性:引入 "$proxy_protocol_tlv_..." 变量,当在 "ssl_session_cache" 指令中使用共享内存时,TLS 会话凭据加密密钥会自动切换
变化:"bad record type" SSL 错误的日志级别从 "crit" 降低到 "info",当在 "ssl_session_cache" 指令中使用共享内存时,“无法分配新会话” 的错误被记录在 "warn" 级别,而不是此前的 "alert",并且不超过每秒钟一次。
Bugfix:修复 nginx/Windows 无法使用 OpenSSL 3.0.x 构建的问题,修复 PROXY 协议的日志错误
Workaround:当使用搭载 OpenSSL 的 TLSv1.3 时,来自 "ssl_session_cache" 指令的共享内存被用在使用 TLS 会话凭据的会话上,当使用搭载 OpenSSL 或 BoringSSL 的 TLSv1.3 时,使用 "ssl_session_timeout" 指令指定的超时不起作用。

nginx 1.23.4 主线版已于2023年3月下旬发布,引入了新的特性、变化,以及错误修复,更新内容如下:
变化:现在默认启用 TLSv1.3 协议
变化:现在如果一个监听套接字的协议参数被重新定义,nginx 会发出警告
变化:如果客户端使用了 Pipeline,现在 nginx 会关闭有滞留的连接
功能:在 ngx_http_gzip_static_module 中支持字节范围
错误修复:"listen" 指令中的端口范围不起作用;该错误出现在 1.23.3 版本中
错误修复:如果在配置中使用了超过 255 个字符的前缀位置,可能会选择不正确的位置来处理请求
错误修复:ngx_http_autoindex_module、ngx_http_dav_module 和 "include" 指令,不支持 Windows 下文件名中的非 ASCII 字符
错误修复:在使用 HTTP/2 和 "error_page" 指令来重定向代码为 400 的错误时,可能会发生套接字泄漏
当使用 zlib-ng 时,"gzip filter failed to use preallocated memory" 的警告出现在日志中
错误修复:邮件代理服务器。

最新版本:1.24
Nginx 1.24 现已于2023年4月中旬发布,该版本合并了 1.23.x 主线分支的新功能和错误修复,具体内容包括:
改进了对具有相同名称的多个 header lines 的处理
优化了 SSL 代理配置中的内存使用
更好的完整性检查 listen 指令协议参数
默认启用的 TLSv1.3 协议
在 ssl_session_cache 指令中使用共享内存时自动轮换 TLS session tickets 加密密钥等。

最新版本:1.25
nginx 1.25.1 已于2023年6月发布,主要变化有:
Feature: "http2" 指令支持在每个服务器上启用 HTTP/2,"listen" 指令的 "http2" 参数已被弃用
Change: 移除 HTTP/2 服务器推送支持,不再支持被弃用的 "ssl" 指令
Bugfix: 修复使用 OpenSSL 时在 HTTP/3 出现的错误

值得注意的是,从 nginx 1.25 开始,已实验性支持 HTTP/3。

2023年8月中旬发布的1.25.2主线版主要变化如下:
使用 HTTP/3 时启用 path MTU discovery、支持 TLS_AES_128_CCM_SHA256 密码套件
nginx 在加载 OpenSSL 配置时使用应用程序名称 "nginx"
如果使用 --with-openssl 选项构建 OpenSSL,且未设置 OPENSSL_CONF 环境变量,则 nginx 不会尝试加载 OpenSSL 配置
修复当使用 HTTP/3 时,在 $body_bytes_sent 变量中出现的错误

2023年10月下旬发布的1.25.3主线版主要变化如下:
Change: 使用 HTTP/2 时,改进对行为异常客户端的检测
Feature: 在使用大量 location 时提升启动速度
Bugfix: 在使用不包含 SSL 的 HTTP/2 时,worker process 中可能会出现段错误;该错误在 1.25.1 中出现
Bugfix: 修复没有正确处理带有 reason phrase 的 "Status" 后端响应 header 行
Bugfix: 修复使用 PCRE2 库时重新配置过程中的内存泄漏
针对 HTTP/3 支持的修复和改进
从 1.25 开始,nginx 已实验性支持 HTTP/3。

最新版本:1.26
v1.26.0 稳定版已于2024年4月下旬发布,主要变化如下:
合并来自 1.25.x 主线分支的新功能和错误修复
实验性支持 HTTP/3
流模块 (stream module) 引入虚拟服务器
支持将流连接传递给监听套接字
HTTP/2 on a per-server basis

最新版本:1.27
v1.27.3 主线版已于2024年12月上旬发布,主要变化如下:
"upstream" 模块的 "server" 指令支持 "resolve" 参数
"upstream" 模块新增 "resolver" 和 "resolver_timeout" 指令
支持 SmarterMail 特定模式: 在邮件代理模块中,SmarterMail 特定模式支持 IMAP LOGIN 与无标记的 CAPABILITY 响应
默认禁用 TLSv1 和 TLSv1.1 协议
可在 “proxy_bind”、“fastcgi_bind”、“grpc_bind”、“memcached_bind”、“sgi_bind ” 和 “uwsgi_bind ” 指令中指定带方括号的 IPv6 地址,但不指定端口,也可在 ngx_http_realip_module 中指定客户端地址
修复 ngx_http_mp4_module 中的错误
修复 "listen" 指令的 "so_keepalive" 参数可能在 DragonFly BSD 上处理不当
修复 "proxy_store" 指令的问题

最新版本:1.28
v1.28.0于2025年5月正式发布,本次更新基于前沿的主线版本1.27.x,融合多项核心性能优化、安全增强和新特性开发,全方位提升复杂场景下的表现与安全性。v1.28.0版本的丰富变化,详细梳理重要功能增强、性能调优及关键漏洞修复,全面剖析这次发布对于Web服务生态和运维实务的非凡价值。主要亮点如下:
性能与资源优化:
针对复杂的 SSL 配置,显著优化了内存使用和 CPU 使用效率。
对 QUIC 协议进行了性能增强,包括引入 CUBIC 拥塞控制算法。

功能增强:
动态上游解析:支持在上游服务器组 (upstream groups) 中自动重新解析主机名,提高了动态环境下的灵活性和可靠性。
Stream 模块 SSL 功能:Stream 模块现已支持对客户端 SSL 证书进行 OCSP 验证以及 OCSP Stapling,增强了流代理的安全性。
限速指令支持变量:proxy_limit_rate, fastcgi_limit_rate, scgi_limit_rate, 和 uwsgi_limit_rate 指令现在支持使用变量,使限速配置更加灵活。
新增 proxy_pass_trailers 指令:允许控制是否将客户端请求的 Trailer 头字段传递给后端服务器。
新增 keepalive_min_timeout 指令:允许更精细地控制空闲 keepalive 连接的关闭时间。

安全性改进等:
默认禁用了较旧且不安全的 TLSv1 和 TLSv1.1 协议。
修复了多个模块中的错误,包括 QUIC、MP4、Upstream、SSL 等。
改进了对 IPv6 地址格式(无端口号时使用方括号)的处理。
更新了对 zlib-ng 2.2.x 和 PCRE2 10.45 等库的兼容性。

接上述简介,下面将做较详细的介绍。

1、版本背景与升级意义
随着HTTP/3(基于QUIC)协议逐渐普及,网络服务对安全性能、连接稳定性与负载均衡的要求日益提升,Nginx作为业界标杆产品,持续加码对前沿技术的支持和底层性能强化。此次v1.28.0版本的推出,正是响应用户需求与技术趋势融合的里程碑。本版本整合了1.27.x主线分支的创新成果,涵盖从协议层面到模块指令的多角度改进,旨在帮助企业和开发者建立更安全、更高效、更易管理的现代Web架构。

2、重磅新特性聚焦
1. QUIC协议性能与稳定性跃升
v1.28.0中针对QUIC协议进行了系列性能优化与bug修复,包括:
• 防止无效数据流帧重传,降低网络垃圾消息对性能的影响(修复#230)
• 解决0-RTT场景下客户端请求超时问题,实现更流畅连接恢复(修复#353)
• 避免版本协商包干扰,提升协议兼容与稳定性(修复#411)
• 修复过早释放流访问异常,保障数据流安全与完整(修复#413)
• 引入CUBIC拥塞控制算法,改善网络拥塞处理(合并#443)
• 修复资源泄漏问题,提升长期运行环境的稳定性(修复#348)

这些改进不仅提升了QUIC协议下的传输效率和可靠性,还增强了用户访问的安全保障,为HTTP/3推广奠定坚实基础。

2. SSL模块革新:更智能、更安全、更高效
SSL作为保障网络安全的核心组件,此次更新重点强化:
• 复杂SSL场景下的内存及CPU使用优化,确保高并发环境下资源占用降低
• 支持客户端SSL证书的OCSP(在线证书状态协议)校验,提升证书链安全性
• 流模块支持OCSP stapling,缩短握手时间,增强连接速度与安全
• 新增ssl_client_certificate为ssl_verify_client提供可选配置,灵活满足多样认证需求
• 默认禁用TLSv1与TLSv1.1协议,符合业界最严格安全标准
• 引入SSL对象缓存机制,提升握手效率,降低CPU负载

此外,针对微软VS编译环境(MSVC)的兼容性修复也让Windows平台构建更加顺畅。

3. 动态代理与限速指令的灵活升级
代理模块和限速控制功能大幅增强:
• 新增proxy_pass_trailers指令,支持将后端响应的Trailer头自动传递给客户端,极大提升应用协议灵活性
• 所有限速指令(proxy_limit_rate、fastcgi_limit_rate、scgi_limit_rate、uwsgi_limit_rate)均新增支持变量,允许限速动态调整,满足复杂流量管理需求
• 在上游服务器组实现动态重解析(re-resolvable servers),提升DNS解析灵活性,解决IP更新引发的服务不可用问题

这意味着负载均衡配置将更具弹性和智能,保障服务持续稳定。

4. 上游服务器自动重解析,提升冗错能力
自动重新解析上游服务器主机名可以解决在动态IP环境和云服务变更后的连接问题。这一特性由社区贡献,极大提升了Nginx集群环境的自愈能力,有效避免因IP变更引发的服务中断。

5. 配置及构建体系的全面完善
• 引入GitHub Actions持续集成(CI),保障代码仓库稳定与质量
• 改善支持MSVC编译套件,完美兼容PCRE2 10.45版本
• 修正DragonFly BSD平台下TCP keepalive单位,提升跨平台一致性
• 启用统一的代码风格与错误日志规范,便于维护与开发者协作

6. 新增keepalive_min_timeout指令,细粒度控制长连接超时,优化资源利用。

3、细节优化与BUG修复揭秘
本次版本不只是新增功能,更着眼于细节打磨与漏洞修复:
• 修复了Proxy相关路径为空导致的安全隐患
• 用更合理的错误消息提示SSL缓存机制异常,便于排查
• 修正了MP4文件处理中的STSC原子解析问题,使多媒体支持更可靠
• 兼容Zlib-ng 2.2.x版本的Gzip压缩,保障压缩功能稳定
• 解决子请求错误计数不准确的问题,提高监控数据质量
• 修复了字符集过滤器对于utf-8映射的校验逻辑
• 解决动态证书密码支持缺失,提升证书管理能力
• 修正IPv6地址格式限制,允许无端口方括号包裹IPv6地址,提升IPv6兼容性

另外针对多个安全规范,调整了实验性功能描述及默认协议版本,保障默认配置的安全优先。

4、实际场景下的部署优势
企业和运维人员将直接受益于v1.28.0带来的众多升级,比如:
• 大流量复杂SSL部署时CPU和内存消耗显著降低,提升服务器承载能力
• QUIC加速的页面加载时延缩短,移动端访问体验明显提升
• 动态DNS环境中集群负载均衡不再因IP变化而卡死,极大提高高可用性
• 变量限速与Trailer转发对互联网直播、API网关等场景支持更细粒度流量管控
• Windows与BSD等多平台构建和运行更友好,拓宽了应用范围

5、升级指导与兼容性说明
升级建议:
• 备份当前配置及日志,重点注意自定义模块兼容性
• 查看ssl_client_certificate及限速指令新增用法,检查配置适配
• 测试QUIC相关功能,特别是0-RTT和版本协商环节
• 对使用动态DNS与多节点负载均衡的用户,建议启用上游servers重解析功能
• 监控内存与CPU变化,确保符合预期性能提升

兼容性:
• 默认禁用TLSv1/TLSv1.1,若旧版兼容需求请自行调整ssl_protocols配置
• 多数变更为向下兼容修正,个别新指令需添加配置文件支持

6、未来展望与社区动态
Nginx团队持续聚焦下一代网络技术,除继续优化HTTP/3支持、QUIC稳定性外,正在研发更多安全防护与边缘计算集成特性。同时项目迈向完全自动化CI/CD和更社区驱动的模块生态。开源社区贡献依然活跃,各类插件和企业扩展不断涌现,推动Nginx持续成为数字经济基础设施不二选择。

最新版本:1.29
v1.29.1 主线版现已于2025年8月中旬发布,具体更新内容如下:
Security:在 ngx_mail_smtp_module 中使用 “none” 身份验证方法时,处理特制的登录名/密码可能会导致工作进程内存泄露给身份验证服务器(CVE-2025-53859)。
Change:现在默认禁用 TLSv1.3 certificate compression。
Feature:“ssl_certificate_compression” 指令。
Feature:使用 OpenSSL 3.5.1 或更新版本时支持 QUIC 中的 0-RTT。
错误修复:使用 HTTP/2 和 “early_hints” 指令时,103 响应可能会被缓冲。
错误修复:使用 HTTP/2 时处理具有相等值的 “Host” 和 “:authority”header lines;该错误出现在 1.17.9 中。
错误修复:使用 HTTP/3 时处理带有 port 的 “Host” header lines。
错误修复:无法在 NetBSD 10.0 上构建 nginx。
错误修复:“smtp_auth” 指令的 “none” 参数。