博客 | NGINX

NGINX 1.18 和 1.19 简介

NGINX-F5-horiz-black-type-RGB 的一部分
Libby Meren 缩略图
莉比·梅伦
2020 年 5 月 26 日发布

今天我们发布了 NGINX 1.19,这是互联网上最受欢迎的 Web 服务器NGINX 开源的最新版本。 继上个月发布 NGINX 1.18 稳定分支之后,此版本标志着 NGINX 1.19 开发分支的启动。

在这篇博客中,我们讨论了 NGINX 版本控制方案,回顾了 NGINX 1.17 开发周期中发生的事情,并展望了 NGINX 1.19 的未来。

NGINX 版本说明

在 NGINX,我们在 NGINX 开源源代码存储库中维护两个分支,分别名为mainlinestable

  • 主线是活跃的开发分支,其中添加了最新的功能和错误修复。 它用版本号的第二部分中的奇数表示,例如 1。19.0.
  • 稳定版会修复一些高严重程度的错误,但是不会更新新功能。 它用版本号的第二部分中的偶数表示,例如 1。18.0.

“稳定”意味着什么

对于 NGINX 开源来说,“稳定”一词指的是功能和更新频率,而不是软件质量。 稳定分支在其生命周期内永远不会收到新功能,并且通常仅接收一到两个更新,以修复关键的错误。

稳定分支的生命周期为一年。 每年四月,我们都会淘汰当前的稳定分支,此后不再进行任何错误修复。 这会触发两个事件:

  1. 当前主线分支被分叉,以创建下一个稳定分支。 新的稳定分支继承了上一年主线分支中的所有错误修复、功能和其他更改。 上个月,NGINX 1.17.10 被分叉以生成 NGINX 1.18.0。 请注意,在新的主线分支发布之前,“稳定”与当前主线分支相同,并且可能包含几天前发布的新功能(对于 NGINX 1.18 分支,该状态今天结束)。
  2. 主线分支获得“版本升级”;也就是说,版本号的第二部分增加到下一个奇数。 主线分支上的持续开发仍在继续,每四到六周就会从主线构建新版本。 今天是 NGINX 1.19 主线上首次发布的版本,即 NGINX 1.19.0。
NGINX 开源分支 2020 年度“版本升级”

NGINX Plus 使用哪个分支?

NGINX Plus是 NGINX 的商业版本,在单独的私有代码存储库中维护。 它始终基于 NGINX 主线的最新版本,并与 NGINX Plus 中的附加专有特性和能力相合并。 在撰写本文时,最新版本是NGINX Plus R21 ,基于 NGINX 1.17.10。

我应该使用哪个分支?

我们一般建议使用主线分支。 这是我们提交所有新功能、性能改进和增强功能的地方。 我们积极测试和 QA 主线分支,作为 NGINX Plus 的源代码,它完全适合生产使用。

如果您担心监控主线分支的新功能和错误修复的开销,那么使用稳定分支意味着您只需每年审查一次新功能,并偶尔修复错误。

NGINX 1.17 回顾,又称 NGINX 1.18 稳定分支中的新功能

NGINX 1.17 开发周期引入了一些新特性和增强功能,包括分别增强了ngx_http_limit_req_modulengx_http_limit_conn_module中的请求速率和连接限制,向ngx_http_core_module添加了身份验证延迟指令,引入了对grpc_pass指令的变量支持以及使用 PROXY 协议捕获服务器地址和端口的变量等等。 在我们详细了解最重要的增强功能之前,我们先来看一下 NGINX 1.17 的一些数据:

  • 10 个主线版本
  • 修复了 37 个错误
  • 11 个新功能

HTTP 请求速率和连接限制的增强

limit_ratelimit_rate_after指令控制 NGINX 响应请求的带宽(以字节/秒为单位的速率)。 在NGINX 1.17.0及更高版本中,设置速率的参数可以是变量,从而实现根据请求的属性进行动态控制。 有关示例,请参阅动态带宽控制

NGINX 1.17.1 使用limit_req_dry_run指令添加了用于限制请求速率的试运行模式。 在试运行模式下,NGINX Plus 不强制执行速率限制,但仍会跟踪共享内存区域中过多请求的速率,并将每个超过配置限制的请求写入错误日志。 这使得您可以更轻松地确定哪种速率限制适合您站点的流量模式。 有关更多详细信息,请参阅在试运行模式下测试速率限制

为了使试运行模式更加有用,NGINX 1.17.6 添加了$limit_req_status变量,该变量可以包含在访问日志条目中,以捕获速率限制对请求处理的影响 - 具体来说,请求是否:

  • 已通过(已立即转发至后端服务器)[已通过]
  • 延误 [延误]
  • 被拒绝 [被拒绝]
  • 在试运行模式下被视为延迟 [ DELAYED_DRY_RUN ]
  • 在试运行模式下被算作拒绝 [ REJECTED_DRY_RUN ]

NGINX 1.17.6 还添加了使用limit_conn_dry_run指令进行连接限制的 dry-run 模式,并使用$limit_conn_status变量来捕获连接请求:

  • 已通过(已转发至后端服务器)[已通过]
  • 被拒绝 [被拒绝]
  • 在试运行模式下被算作拒绝 [ REJECTED_DRY_RUN ]

有关示例配置,请参阅连接限制增强功能

新的auth_delay指令

auth_delay指令(在 NGINX 1.17.10 中添加)允许延迟处理未经授权的请求,并带有状态代码401(未授权)返回给客户端。 这可以防止处理访问请求时的时序攻击。 可用的身份验证方法包括:

grpc_pass指令的变量支持

NGINX 1.13.10 中添加了对 gRPC 流量的原生支持,包括grpc_pass指令,该指令指定 NGINX 将 gRPC 请求传递到的服务器。 在 NGINX 1.17.8 中,我们添加了在服务器标识符中包含域名的功能,以支持在上游服务器组之间进行搜索。 如果找不到域名,NGINX 将转而使用解析器来识别服务器地址。

附加 PROXY 协议变量

PROXY 协议使第 4 层代理能够向处理请求的下一个代理或负载均衡器提供原始客户端信息。 这对于需要了解客户端 IP 地址的用例很重要 - 例如,限制每个客户端的连接数(使用least_conn指令)。 该数据可在$proxy_protocol_addr变量( HTTP | Stream )中找到。

当部署多个第 4 层代理时,NGINX 知道客户端最初连接到的代理服务器的 IP 地址和端口非常重要。 PROXY 协议元数据包含此信息,NGINX 1.17.6 向 HTTP 和 Stream 模块添加了以下变量来捕获它:

  • $proxy_protocol_server_addrHTTP |
  • $proxy_protocol_server_portHTTP |

笔记: 仅当您将proxy_protocol参数包含在listen指令中以启用 PROXY 协议的处理时,才会填充变量。

proxy_upload_rateproxy_download_rate指令添加了变量支持

Stream 模块中的proxy_upload_rateproxy_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 Perl 模块internal_redirect函数的uri参数可以是转义的 URI 或命名位置。

NGINX 1.19 即将推出的功能

NGINX 1.19 主线上的第一个版本即将发布。 NGINX 1.19.0 包含对QUIC (HTTP/3) 的支持,这是客户端与网站、应用和 API 之间通信的传输协议的下一个重要更新。

如果您想试用 NGINX Plus 中的增强功能,请立即开始30 天免费试用联系我们讨论您的用例


“这篇博文可能引用了不再可用和/或不再支持的产品。 有关 F5 NGINX 产品和解决方案的最新信息,请探索我们的NGINX 产品系列。 NGINX 现在是 F5 的一部分。 所有之前的 NGINX.com 链接都将重定向至 F5.com 上的类似 NGINX 内容。”