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