今天文章的焦点将是互联网上最受欢迎的 Web 服务器 NGINX Open Source 的NGINX 1.19版本。NGINX 1.19 开发分支的推出跟随着早先发布的NGINX 1.18 稳定分支。
我们将讨论 NGINX 版本控制方案,回顾 NGINX 1.17 开发周期内进行的更新,并探索 NGINX 1.19 的特性。
NGINX 在 NGINX Open Source 代码存储库中维护着两个分支,分别为主线版和稳定版:
“稳定”意味着什么?
就 NGINX Open Source 而言,“稳定”一词是指功能和更新频率稳定,与软件质量无关。稳定分支在其生命周期中不接收任何新功能,通常仅接收一两个更新用于修复严重的错误。
稳定分支的生命周期为一年。每年四月,我们就会停止对当前稳定分支的维护,不再提供任何错误修复。这会触发两个事件:
NGINX Open Source 分支的 2020 年度版本升级
作为 NGINX 的商业版本,NGINX Plus在单独的专用代码存储库中进行维护。它始终基于 NGINX 主线分支的最新版本,并整合了 NGINX Plus 中的其他专有功能。在撰写本文时,最新版本是基于 NGINX 1.17.10 的NGINX Plus R21。
我们通常建议使用主线分支。它包含了我们添加的所有新功能、性能改进和增强功能。我们会积极对主线分支进行测试和质量检查,并且作为 NGINX Plus 构建的来源,它完全适合生产使用。
如果您担心因监控主线分支新功能和错误修复而产生额外开销,那就使用稳定分支,这样您只需每年检查一次新功能,并且不需要经常进行错误修复。
NGINX 1.17 开发周期引入了一些新功能和增强功能,包括分别对 ngx_http_limit_req_module 和 ngx_http_limit_conn_module 中的请求速率和连接限制进行了增强,为 ngx_http_core_module 添加了身份验证‑延迟指令,为捕捉代理协议服务器地址和端口的 grpc_pass 指令和变量引入变量支持等。在更详细地介绍最重要的增强功能之前,我们先了解下 NGINX 1.17 进行的更新:
对 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 变量,该变量可以包含在访问日志条目中,以捕获速率限制对请求处理的影响,即确定请求处于以下哪种状态:
NGINX 1.17.6 还通过 limit_conn_dry_run 指令添加空运行模式以进行连接限制,并通过和 $limit_conn_status 变量捕捉连接请求处于以下哪种状态:
有关示例配置,请参阅对连接限制的增强。
新 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 模块添加以下变量以捕获该信息:
注意:只有当您还为 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.0 包含对 QUIC (HTTP/3) 的支持,这是对客户端和网站、应用和 API 之间通信传输协议的下一个重要更新。
想要更及时全面地获取NGINX相关的技术干货、互动问答、系列课程、活动资源?请前往NGINX开源社区官方网站 。