预览版NGINX QUIC+HTTP/3实现现已提供二进制软件包

NGINX | 2023年2月08日

[编辑:NGINX现已正式支持基于QUIC的HTTP/3。开源用户可通过NGINX 1.25.1主线版本使用,NGINX Plus R30则面向企业客户提供。]
[ngx_snippet name=’table-style-blog’]
我们很高兴地宣布,NGINX对QUIC+HTTP/3的预览实现现已针对两个发行版提供预构建二进制软件包:

  • Red Hat Enterprise Linux 9及二进制兼容的变体
  • Ubuntu 22.04

这些二进制文件是独立的quic分支提供的最新交付成果。该分支位于托管预览版实现的nginx-quic代码库中。自我们开始在NGINX中开发QUIC+HTTP/3以来,您仍可下载并构建支持QUIC+HTTP/3的NGINX Open Source,并可选择支持QUIC的SSL/TLS库。虽然该代码被标记为实验性代码,但已有多位社区成员表示,他们已成功将nginx-quic用于生产环境。

我们发布预构建二进制文件,主要是为了让 NGINX QUIC+HTTP/3 测试更快捷、更轻松。使用这些二进制文件,无需从源代码编译,并且可以通过标准软件包管理工具进行安装。

截至本文撰写时,开源SSL/TLS领域的事实标准OpenSSL尚不支持QUIC。因此,我们在构建二进制发行版时使用了quictls库软件包,该软件包会作为依赖项自动安装。我们选择quictls,是因为它目前在稳定性、兼容性和功能方面实现了良好平衡。

二进制发行版的安装说明可在NGINX QUIC网站查看。

为QUIC+HTTP/3配置NGINX

配置NGINX以支持QUIC+HTTP/3时需要使用几项新指令,但可以轻松地将这些指令与现有虚拟服务器(server{})配置块中的HTTP/1.1和HTTP/2指令结合使用。

要实现最基本的功能配置,只需在server{}块(及其子location{}块)中添加三条指令:

指令说明
listen 443 quic reuseport;

添加带有quic参数的新listen指令,使NGINX在HTTP/1.1和HTTP/2所用的同一端口(此处为 443)上侦听HTTP/3连接。

当存在多个NGINX工作进程时,必须使用reuseport参数才能正常运行。该参数使内核能够在这些进程之间分配传入的HTTP/3连接。

ssl_protocols TLSv1.3;

按照QUIC的要求,将TLS 1.3加入接受的协议列表。(配置中可能已包含此指令;如有必要,请添加。)

为支持各种浏览器,可能还需要加入较旧的TLS版本。有关浏览器对TLS 1.3的支持情况,请参阅我能否使用TLS 1.3?

add_header Alt-Svc 'h3=":$server_port"; ma=86400';

加入此指令后,NGINX会添加响应标头,告知浏览器可以升级到QUIC以及应连接的端口。

按照惯例,该端口(此处由$server_port变量表示)与HTTP/1.1和HTTP/2使用TLS时的端口相同。

ma的值表示客户端可以放心假定NGINX通过UDP接受HTTP/3流量的秒数;超过该时限后,客户端需要恢复使用TCP。此处指定的值相当于 24小时。

以下是一个示例server{}块:

server {    # for better compatibility we recommend
    # using the same port number for QUIC and TCP
    listen 443 quic reuseport; # QUIC
    listen 443 ssl;             # TCP

    ssl_certificate     certs/example.com.crt;
    ssl_certificate_key certs/example.com.key;
    ssl_protocols       TLSv1.3;

    location / {
        # advertise that QUIC is available on the configured port
        add_header Alt-Svc 'h3=":$server_port"; ma=86400';
                
        #proxy_pass <upstream_group>; 
        #root       /<root_directory>; 
    }
}

新增了多个与HTTP/3相关的可选指令和变量(代码片段中未显示),包括:

  • $http3(变量)设置为h3,表示请求是在HTTP/3会话期间发送的(否则为空字符串)。
  • quic_retry (指令)设置为on时,指示NGINX向请求方发回QUIC重试消息,指定要使用的新连接ID,以验证请求方的IP地址。由于QUIC基于UDP运行,无法使用TCP三次握手来验证连接,QUIC重试数据包可在一定程度上弥补这一不足。
  • ssl_early_data –(指令)设置为on时,如果该客户端此前建立过连接,则指示NGINX接受客户端通过新的TLS 1.3连接发送的首个请求中的应用数据。这称为零往返时间(0‑RTT)连接恢复。发送“早期数据”是TLS 1.3的一项功能。它无需进行TLS握手所需的额外往返消息交换,有助于提升QUIC+HTTP/3的性能。注意:0‑RTT连接恢复可能带来安全风险,因为如果早期数据中包含除GET以外的HTTP请求方法,则GET。有关详细信息,请参阅博客文章TLS 1.3相关章节《NGINX Plus R17发布公告》。

该图重点说明了使用QUIC+HTTP/3进行0‑RTT连接恢复如何提升性能:客户端在恢复与NGINX的QUIC连接时,可以在第一条消息中发送HTTP请求。相比之下,对于采用TLS的TCP连接,客户端必须与NGINX重新执行TLS握手以建立安全连接,因此需要额外进行数次往返通信。

比较TCP+TLS与QUIC恢复HTTP连接所需消息的示意图

有关所有新增指令和变量的信息,请参阅3. 配置部分,详见nginx-quic README。

使用QUIC+HTTP/3测试NGINX

如前所述,我们发布预构建二进制文件的动机之一,是为了更轻松地测试NGINX能否正确处理HTTP/3流量。对于简单的命令行测试,可以构建支持HTTP/3的curl with HTTP/3 support,也可以使用预构建容器。此外,大多数浏览器的较新版本都支持QUIC+HTTP/3。

要验证启用QUIC的网站是否能够响应浏览器发出的HTTP/3连接请求,可以使用浏览器的开发者工具检查NGINX返回的HTTP标头。如果NGINX在响应浏览器通过TCP发出的初始HTTP请求时包含Alt-Svc标头(如上文所述),则表示QUIC+HTTP/3实现运行正常。

此时,支持QUIC的浏览器会通过Alt-Svc指令中指定的端口建立QUIC连接,后续HTTP请求和响应均通过QUIC传输。还可以添加另一个add_header指令,将自定义HTTP标头的值设置为$server-protocol变量捕获的协议,以验证是否正在使用QUIC+HTTP/3。可以跟踪该标头值的变化:建立QUIC连接前为HTTP/1.x,使用QUIC时则变为HTTP/3.0。

以下是一个示例location块,其中自定义HTTP标头为X-protocol:

location / {     # advertise that QUIC is available on the configured port 
    add_header Alt-Svc 'h3=":$server_port"; ma=86400'; 
       
    # signal whether we are using QUIC+HTTP/3
    add_header X-protocol $server_protocol always;        
    
    #proxy_pass <upstream_group>; 
    #root /<root_directory>; 
}

或者,也可以使用Chrome的HTTP Indicator扩展程序等工具,直观显示当前使用的协议。(请注意,此处并非推荐任何浏览器扩展程序。您必须根据自身情况评估扩展程序可能带来的安全影响,并确认这些影响可以接受。)

后续步骤

未来几周,我们将继续交付QUIC+HTTP/3解决方案,并提供更多NGINX优化示例。在此期间,请分享您的测试结果,为我们的决策提供参考。您可以通过NGINX开发邮件列表以及NGINX Community Slack上的#quic‑http3频道分享反馈。

如需获取我们在QUIC+HTTP/3方面的最新进展,包括下一个重要里程碑(将nginx-quic代码库合并到NGINX Open Source主线分支),请订阅NGINX公告邮件列表。

观看网络研讨会

也欢迎参加我们即将举办的网络研讨会:NGINX 与 QUIC+HTTP/3 实操体验,时间为 2023 年 4 月 19 日(星期三):


分享
标签: F5 NGINX, Tech, 2023

相关博客文章

NGINX Plus R26 正式发布
NGINX | 2022/02/15

NGINX Plus R26 正式发布

NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
NGINX | 2022/02/10

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击

gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
NGINX | 2021/09/13

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划

了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。

NGINX Plus R19 正式发布
NGINX | 2019/09/03

NGINX Plus R19 正式发布

NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。

NGINX现已正式加入F5
NGINX | 2019/05/09

NGINX现已正式加入F5

NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。

使用NGINX和NGINX Plus实现高性能缓存
NGINX | 2016/08/24

使用NGINX和NGINX Plus实现高性能缓存

我将介绍NGINX在内容缓存和性能方面的工作原理,并分享一些控制NGINX内容缓存方式的技巧。