今天,我们发布了 互联网上最受欢迎的 Web 服务器 NGINX Open Source 的最新版本 NGINX 1.19。该发布标志着 NGINX 1.19 开发分支的推出,上个月我们刚发布了 NGINX 1.18 稳定分支。
在本文中,我们将讨论 NGINX 版本控制方案,回顾 NGINX 1.17 开发周期内进行的更新,并展望 NGINX 1.19 的特性。
NGINX 版本控制介绍
NGINX 在 NGINX Open Source 代码存储库中维护着两个分支,分别为主线版和稳定版:
- 主线版 是更新活跃的开发分支,会添加最新功能和错误修复。其版本号的第二位用奇数表示,例如 1.19.0。
- 稳定版 接收针对高严重性错误的修复,但不会加入新功能。其版本号的第二位用偶数表示,例如 1.18.0。
“稳定”意味着什么?
就 NGINX Open Source 而言,“稳定”一词是指功能和更新频率稳定,与软件质量无关。稳定分支在其生命周期中不接收任何新功能,通常仅接收一两个更新用于修复严重的错误。
稳定分支的生命周期为一年。每年四月,我们就会停止对当前稳定分支的维护,不再提供任何错误修复。这会触发两个事件:
- 对当前主线分支进行复刻 (Fork),以创建下一个稳定分支。新的稳定分支会继承主线分支在过去一年中进行的所有错误修复、功能更新和其他更改。上个月,就是通过对 NGINX 1.17.10 进行复刻,创建了 NGINX 1.18.0。请注意,在发布新的主线分支之前,“稳定分支”与当前主线分支完全相同,并且可能包含近几天内新增的功能(NGINX 1.18 分支从今天起终止此状态)。
- 主线分支会获得版本升级;也就是说,其版本号的第二位会增加为下一个奇数。我们会持续对主线分支进行开发,每四到六周就会基于主线分支创建一个新版本。今天发布的 NGINX 1.19.0 是基于 NGINX 1.19 主线分支创建的首个版本。
NGINX Plus 使用哪个分支?
作为 NGINX 的商业版本,NGINX Plus在单独的专用代码存储库中进行维护。它始终基于 NGINX 主线分支的最新版本,并整合了 NGINX Plus 中的其他专有功能。在撰写本文时,最新版本是基于 NGINX 1.17.10 的NGINX Plus R21。
我应该使用哪个分支?
我们通常建议使用主线分支。它包含了我们添加的所有新功能、性能改进和增强功能。我们会积极对主线分支进行测试和质量检查,并且作为 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
指令和变量引入变量支持等。在更详细地介绍最重要的增强功能之前,我们先了解下 NGINX 1.17 进行的更新:
- 10 个主线版
- 37 个错误修复
- 11 项新功能
对 HTTP 请求速率和连接限制进行了增强
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
指令
auth_delay
指令(添加在 NGINX 1.17.10 中)支持对未授权请求进行延迟处理,并将状态代码 401
(未授权)
返回客户端。这可以在处理访问请求时防御 定时攻击 。可用的身份验证方法包括:
- 密码(当使用 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 协议变量
TPROXY 协议支持第 4 层代理将原始客户端信息提供给处理请求的下一个代理或负载均衡器。这对于需要了解客户端 IP 地址的用例来说非常重要,例如限制每个客户端的连接数(使用least_conn
指令)。该数据在$proxy_protocol_addr
变量 (HTTP | Stream) 中提供。
当部署多个4 层代理时,NGINX 需要知道客户端最初所连接的代理服务器的 IP 地址和端口。PROXY 协议元数据包含此信息,NGINX 1.17.6 向 HTTP 和 Stream 模块添加以下变量以捕获该信息:
注意: 只有当您还为 listen
指令添加了 proxy_protocol
参数,以支持代理协议处理时,这些变量才会被填充。
将变量支持添加到了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 Perl module 中 internal_redirect
函数的 uri
参数可以是转义 URI 或已命名位置。
NGINX 1.19 有哪些特性?
NGINX 1.19 主线分支的第一个版本即将推出。NGINX 1.19.0 包含对 QUIC (HTTP/3) 的支持,这是对客户端和网站、应用和 API 之间通信传输协议的下一个重要更新
如果您想试用 NGINX Plus 中的增强功能,请立即下载 30 天免费试用版 或 与我们联系以讨论您的用例。