今天我们发布了 NGINX 1.19,这是互联网上最受欢迎的 Web 服务器NGINX 开源的最新版本。 继上个月发布 NGINX 1.18 稳定分支之后,此版本标志着 NGINX 1.19 开发分支的启动。
在这篇博客中,我们讨论了 NGINX 版本控制方案,回顾了 NGINX 1.17 开发周期中发生的事情,并展望了 NGINX 1.19 的未来。
在 NGINX,我们在 NGINX 开源源代码存储库中维护两个分支,分别名为mainline和stable :
对于 NGINX 开源来说,“稳定”一词指的是功能和更新频率,而不是软件质量。 稳定分支在其生命周期内永远不会收到新功能,并且通常仅接收一到两个更新,以修复关键的错误。
稳定分支的生命周期为一年。 每年四月,我们都会淘汰当前的稳定分支,此后不再进行任何错误修复。 这会触发两个事件:
NGINX Plus是 NGINX 的商业版本,在单独的私有代码存储库中维护。 它始终基于 NGINX 主线的最新版本,并与 NGINX Plus 中的附加专有特性和能力相合并。 在撰写本文时,最新版本是NGINX Plus R21 ,基于 NGINX 1.17.10。
我们一般建议使用主线分支。 这是我们提交所有新功能、性能改进和增强功能的地方。 我们积极测试和 QA 主线分支,作为 NGINX Plus 的源代码,它完全适合生产使用。
如果您担心监控主线分支的新功能和错误修复的开销,那么使用稳定分支意味着您只需每年审查一次新功能,并偶尔修复错误。
NGINX 1.17 开发周期引入了一些新特性和增强功能,包括分别增强了ngx_http_limit_req_module和ngx_http_limit_conn_module中的请求速率和连接限制,向ngx_http_core_module添加了身份验证延迟指令,引入了对grpc_pass
指令的变量支持以及使用 PROXY 协议捕获服务器地址和端口的变量等等。 在我们详细了解最重要的增强功能之前,我们先来看一下 NGINX 1.17 的一些数据:
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
变量,该变量可以包含在访问日志条目中,以捕获速率限制对请求处理的影响 - 具体来说,请求是否:
已通过
]延误
]被拒绝
]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 协议使第 4 层代理能够向处理请求的下一个代理或负载均衡器提供原始客户端信息。 这对于需要了解客户端 IP 地址的用例很重要 - 例如,限制每个客户端的连接数(使用least_conn
指令)。 该数据可在$proxy_protocol_addr
变量( HTTP | Stream )中找到。
当部署多个第 4 层代理时,NGINX 知道客户端最初连接到的代理服务器的 IP 地址和端口非常重要。 PROXY 协议元数据包含此信息,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)
从填充的缓冲区中获取此信息。
internal_redirect
函数中指定命名位置在 NGINX 1.17.2 及更高版本中,NGINX Perl 模块中internal_redirect
函数的uri
参数可以是转义的 URI 或命名位置。
NGINX 1.19 主线上的第一个版本即将发布。 NGINX 1.19.0 包含对QUIC (HTTP/3) 的支持,这是客户端与网站、应用和 API 之间通信的传输协议的下一个重要更新。
如果您想试用 NGINX Plus 中的增强功能,请立即开始30 天免费试用或联系我们讨论您的用例。
“这篇博文可能引用了不再可用和/或不再支持的产品。 有关 F5 NGINX 产品和解决方案的最新信息,请探索我们的NGINX 产品系列。 NGINX 现在是 F5 的一部分。 所有之前的 NGINX.com 链接都将重定向至 F5.com 上的类似 NGINX 内容。”