今天,我们发布NGINX 1.19,这是NGINX Open Source的最新版本,也是在互联网上广受欢迎的Web服务器。继上个月发布NGINX 1.18稳定分支后,此次发布标志着NGINX 1.19开发分支正式推出。
本文将介绍NGINX版本编号方案,回顾NGINX 1.17开发周期,并展望NGINX 1.19将带来的新内容。
NGINX版本控制详解
NGINX在NGINX Open Source代码仓库中维护两个分支,分别名为“mainline”和“stable”:
“Stable”的含义
对于NGINX Open Source,“稳定”是指功能和更新频率,而非软件质量。稳定分支在其生命周期内不会获得新功能,通常只会更新一两次,用于修复严重错误。
稳定分支的生命周期为一年。每年4月,我们都会停用当前的稳定分支,此后不再修复任何错误。这会触发两个事件:
- 从当前主线分支创建分支,形成下一个稳定分支。新稳定分支会继承过去一年中纳入主线分支的所有错误修复、功能和其他更改。上个月,从NGINX 1.17.10创建了NGINX 1.18.0。请注意,在新主线分支发布之前,“稳定”分支与当前主线分支完全相同,其中可能包含几天前才新增的功能(对于NGINX 1.18分支,这种状态于今天结束)。
- 主线分支将进行“版本升级”,即版本号的第二部分递增至下一个奇数。后续开发工作将在主线分支上继续进行,每4至6周基于主线分支构建一个新版本。今天发布的NGINX 1.19.0是NGINX 1.19主线分支的首个版本。

NGINX Plus 使用哪个分支?
NGINX Plus是NGINX的商业版本,在独立的私有代码存储库中维护。它始终基于最新版本的NGINX主线分支,并整合NGINX Plus的其他专有特性和功能。截至本文撰写时,最新版本为NGINX Plus R21,基于NGINX 1.17.10。
应该使用哪个分支?
我们通常建议使用主线分支。所有新功能、性能改进和增强功能都会提交到该分支。我们会主动对主线分支进行测试和质量保证;该分支也是NGINX Plus构建版本的源代码,因此完全适合用于生产环境。
如果担心持续关注主线分支中的新功能和错误修复会带来额外开销,可以使用稳定分支。这样只需每年审查一次新功能,并且仅偶尔审查错误修复。
NGINX 1.17 回顾,也就是 NGINX 1.18 稳定分支的新变化
NGINX 1.17开发周期引入了一些新功能和增强功能,包括分别增强ngx_http_limit_req_module和ngx_http_limit_conn_module中的请求速率限制和连接数限制,为ngx_http_core_module添加延迟身份验证的指令,为grpc_pass指令引入变量支持,以及引入通过PROXY Protocol捕获服务器地址和端口的变量等。在详细介绍其中的重要增强功能之前,先通过以下数字了解NGINX 1.17:
- 10 个主线版本
- 37项错误修复
- 11项新功能
HTTP请求速率和连接限制功能增强
The limit_rate和limit_rate_after指令用于控制NGINX响应请求时的带宽(速率以字节/秒为单位)。在NGINX 1.17.0及更高版本中,设置速率的参数可以是变量,从而可根据请求属性进行动态控制。有关示例,请参阅“动态带宽控制”。
NGINX 1.17.1通过limit_req_dry_run指令为请求速率限制新增了试运行模式。在试运行模式下,NGINX Plus不会强制执行速率限制,但仍会在共享内存区中跟踪超限请求的速率,并为每个超过配置限制的请求在错误日志中写入一条记录。这样可以更轻松地确定适合站点流量模式的速率限制。有关更多详细信息,请参阅《在试运行模式下测试速率限制》。
为了进一步提升试运行模式的实用性,NGINX 1.17.6 新增了 $limit_req_status 变量。该变量可包含在访问日志条目中,用于记录速率限制对请求处理的影响,具体而言,即请求是否:
- 已通过(已立即转发至后端服务器)[
PASSED] - 已延迟[
DELAYED] - 已被拒绝[
REJECTED] - 在试运行模式下被计为延迟[
DELAYED_DRY_RUN] - 在试运行模式下计为已拒绝[
REJECTED_DRY_RUN]
NGINX 1.17.6还通过limit_conn_dry_run指令为连接限制添加了试运行模式,并可使用$limit_conn_status变量记录连接请求何时:
- 已通过(已转发至后端服务器)[
PASSED] - 已被拒绝[
REJECTED] - 在试运行模式下计为已拒绝[
REJECTED_DRY_RUN]
有关配置示例,请参阅《连接限制增强功能》。
新增auth_delay指令
The auth_delay指令(在NGINX 1.17.10中新增)可延迟处理未经授权的请求,并向客户端返回状态码401 (Unauthorized)。这可防止处理访问请求时遭受时序攻击。可用的身份验证方法包括:
- 密码(使用ngx_http_auth_basic_module时)
- 子请求的结果(可用于ngx_http_auth_request_module)
- 是否存在JWT(可在ngx_http_auth_jwt_module中使用)
对grpc_pass指令的变量支持
NGINX 1.13.10新增了对gRPC流量的原生支持,其中包括grpc_pass指令,用于指定NGINX将gRPC请求传递到的服务器。NGINX 1.17.8支持在服务器标识符中包含域名,以便在上游服务器组中进行搜索。如果找不到该域名,NGINX会改用解析器来确定服务器地址。
其他PROXY协议变量
PROXY Protocol使第4层代理能够向处理请求的下一个代理或负载均衡器提供原始客户端信息。这对于需要获知客户端IP地址的用例非常重要,例如,限制每个客户端的连接数(使用least_conn指令)。这些数据可通过$proxy_protocol_addr变量获取(HTTP|Stream)。
部署多个第 4 层代理时,NGINX 可能需要知道客户端最初连接的代理服务器的 IP 地址和端口。PROXY Protocol 元数据包含这些信息,NGINX 1.17.6 在 HTTP 和 Stream 模块中添加了以下变量来获取这些信息:
注意:仅当还在proxy_protocol参数中包含listen指令以启用PROXY协议处理时,才会填充这些变量。
新增变量支持:proxy_upload_rate 和 proxy_download_rate 指令
Stream模块中的proxy_upload_rate和proxy_download_rate指令分别控制NGINX从客户端和被代理服务器读取数据的速率。在NGINX 1.17.0及更高版本中,这些指令接受变量参数,可用于定义特定条件下的速率。
新增对ioctl(FIONREAD)系统调用的支持
在Linux系统中,ioctl()系统调用可提供可从主机设备读取的字节数。NGINX 1.17.5新增了ioctl(FIONREAD),用于防止数据写入套接字缓冲区的速度超过NGINX读取和处理速度时发生循环。当内核不提供可用字节数时,可以使用ioctl(FIONREAD)从已有数据的缓冲区中获取此信息。
在Perl internal_redirect 函数中指定命名位置
在NGINX 1.17.2及更高版本中,NGINX uri 模块的 internal_redirect 函数所使用的 Perl 参数可以是转义URI或命名位置。
NGINX 1.19 即将推出的功能
NGINX 1.19主线版本即将迎来首个版本。NGINX 1.19.0支持QUIC(HTTP/3),这是客户端与网站、应用和API之间通信所用传输协议的又一次重大更新。
如果想体验NGINX Plus的增强功能,可立即开始30天免费试用,或联系我们,讨论您的使用场景。
相关博客文章
NGINX Plus R26 正式发布
NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。
使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。
Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。
NGINX Plus R19 正式发布
NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。
NGINX现已正式加入F5
NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。
