点赞
评论
收藏
分享
举报
NGINX QUIC 和 HTTP/3 开发路线图
发表于2022-03-30 12:07

浏览 1.7k

文章标签

原文作者:Liam Crilly of F5
原文链接:NGINX QUIC 和 HTTP/3 开发路线图 - NGINX
转载来源:NGINX官方网站


Internet 从未停止过前进的脚步。早在 2015 年 HTTP/2 标准化之前,QUIC 的相关工作就已经开始了,而在之后 QUIC 成为了 HTTP/3。在向 IETF 提交首个 QUIC 规范草案五年之后的现在,我们有了 RFC 9000“QUIC:基于 UDP 的多路复用安全传输”。

当然,演变之路并不是那么轻松。在撰写本文时,业内共发布了四个 RFC,用于描述核心 QUIC 传输层和加密层。而另外 11 个相关的规范(包括 HTTP/3 的最终定义)仍处于草案阶段。然而,许多客户端和服务端的HTTP/3实现已得到广泛使用。事实上,得益于 CDN 提供商和科技巨头们向来紧跟标准草案的步伐,20% 的网站现已支持 HTTP/3。我们也不例外。

去年,我们推出了QUIC 和 HTTP/3 的技术预览版,之后还开展了许多工作。以下是 NGINX 实现 QUIC 和 HTTP/3 的关键开发工作摘要:

  • 我们实现了多个 HTTP/3 草案版本,从草案 23草案 29(目前应用最广泛的版本),当然还有已经发布的 HTTP/3 标准(草案 34)。
  • 我们参与了 QUIC 互操作测试,以便持续测试我们的实现与多种客户端的互操作性,并与其他服务器实现进行了对比。
  • 我们开发了一个 eBPF 程序以利用 NGINX 的多进程架构。NGINX 使用多工作进程模式,可充分利用CPU多核来扩展性能。为了获得最大效率,针对每一个连接,我们倾向于使用同一工作进程来进行处理。然而 QUIC 使得这种处理方式变得棘手,因为连接不再与客户端的 IP 地址绑定,且 Linux 内核不提供 UDP 端口到进程的关联。为了解决这个问题,我们实现了一个 eBPF 扩展来集成 SO_REUSEPORT,因此可以将 QUIC 连接 ID 映射到首先处理它的工作进程。这被巧妙地集成到 NGINX 内核中,以便 NGINX 将 eBPF 字节码加载到内核的套接字选择代码中。
  • 我们将新增的代码重构为两部分:较小的部分包含影响 NGINX 内核的更改,较大的部分包含传输协议的实现。通过以这种方式组织代码库,我们可以将对 NGINX 内核的变更保持在最低限度,从而降低将引入安全漏洞到NGINX的风险。


NGINX 路线图

我们的 QUIC + HTTP/3 路线图有两大里程碑:
  1. 将 nginx-quic 开发分支合并到 NGINX 主线分支
  2. 实现性能优化
QUIC 和 HTTP/3 协议的实现已基本完成,我们正在谨慎地将 nginx-quic 分支中的新代码合并到 NGINX 主线分支(即我们发布新功能的主线版本)。对 NGINX 内核的更改相对较小(约 3,000 行代码),合并正在顺利进行中。而工作量比较大的是合并传输协议代码(约 27,000 行代码)。根据以往将 HTTP/2 实现合并到 NGINX 的经验,这项工作预计将会耗时几个月。

我们当前的目标是,在 2021 年底将代码全部合并到 NGINX 主线分支,之后它将被后续版本的 NGINX 主线分支及 NGINX Plus 所包含。

在这之后,我们将专注于优化性能。QUIC 的有些优势是立竿见影的,但有些优势则需要时日才能显现。TCP 和 UDP 在操作系统内核和网络驱动程序层面的开发有着数十年的时间,因而具有一定优势,但 QUIC 主要是在操作系统用户空间中实现的 —— 这意味着一些我们认为理所当然的事情(例如拥塞通知和首选数据包大小检测),现在必须由每个客户端和服务器软件供应商自行实现。


集成 QUIC 的 TLS 层

QUIC 中加密传输成为了网络协议栈中强制性、不可协商的组成部分。QUIC 支持 TLS 1.3 标准,但 TLS 的软件实现也必须支持 QUIC 接口。NGINX 通常将 OpenSSL 用作外部依赖项,这意味着我们可以使用 官方 NGINX 开源版软件包和 NGINX Plus 中的操作系统自带的 SSL/TLS 库。通过将加密实现从 NGINX 中解耦,我们可以在不升级 NGINX 的情况下修复 SSL/TLS 库中的错误和安全漏洞。

在撰写本文时,OpenSSL 尚不支持 QUIC,而自带支持 QUIC 的 SSL/TLS 库的操作系统版本可能还需要好几个月的时间才能被交付。我们的 QUIC 实现目前支持 BoringSSLOpenSSL 的 quictls 分支,不过它们必须使用 NGINX 进行编译。

我们预计,在我们将 nginx-quic 开发分支合并到 NGINX 主线分支的过程中, SSL/TLS 库对于 QUIC 的支持情况也将变得更加清晰。


如何助我们一臂之力

您可以帮助我们测试我们的 QUIC + HTTP/3 实现。您发现的错误和边界情况越多,我们就能越快地完成合并过程,从而使 NGINX 正式支持 QUIC + HTTP/3。
  • 如果您熟悉 QUIC 和/或 HTTP/3,请对您熟悉的部分进行代码评审。
  • 如果您运行大规模Internet服务,请为一些用户或服务部署 nginx-quic,以进行 A/B 测试。
  • 如果您管理 Web 网站和/或应用,请在您的自动化测试(而非当前版本)中试用 nginx-quic
  • 烦请您通过 NGINX 开发者邮件列表与我们分享您的发现。
如要试用 nginx-quic 实现,您只需用浏览器打开 https://quic.nginx.org/ ,即可查看 README 了解更多信息。如要在您自己的环境中进行快速概念验证,请使用该 Dockerfile 构建自己的 nginx-quic 镜像,然后按照前面提到的 README 中的配置说明进行配置。

[编者按 – 后面的 Dockerfile 已在 2021 年 12 月更新,以修改原始版本中的错误。]

FROM nginx:1.21.1 AS build

WORKDIR /src
RUN apt-get update && \
apt-get install -y git gcc make g++ cmake perl libunwind-dev golang && \
git clone https://boringssl.googlesource.com/boringssl && \
mkdir boringssl/build && \
cd boringssl/build && \
cmake .. && \
make

RUN apt-get install -y mercurial libperl-dev libpcre3-dev zlib1g-dev libxslt1-dev libgd-ocaml-dev libgeoip-dev && \
hg clone https://hg.nginx.org/nginx-quic && \
hg clone http://hg.nginx.org/njs -r "0.6.2" && \
cd nginx-quic && \
hg update quic && \
auto/configure `nginx -V 2>&1 | sed "s/ \-\-/ \\\ \n\t--/g" | grep "\-\-" | grep -ve opt= -e param= -e build=` \
--build=nginx-quic --with-debug \
--with-http_v3_module --with-http_quic_module --with-stream_quic_module \
--with-cc-opt="-I/src/boringssl/include" --with-ld-opt="-L/src/boringssl/build/ssl -L/src/boringssl/build/crypto" && \
make

FROM nginx:1.21.1
COPY nginx.conf /etc/nginx/nginx.conf
COPY www.example.com.crt /etc/ssl/www.example.com.crt
COPY www.example.com.key /etc/ssl/www.example.com.key
COPY index.html /etc/nginx/html/index.html
COPY --from=build /src/nginx-quic/objs/nginx /usr/sbin
RUN /usr/sbin/nginx -V > /dev/stderr
EXPOSE 8443


更多资源

想要更及时全面地获取NGINX相关的技术干货、互动问答、系列课程、活动资源?
请前往NGINX开源社区:


已修改于2023-03-09 02:15
本作品系原创
创作不易,留下一份鼓励
NGINX官方账号

暂无个人介绍

关注



写下您的评论
发表评论
全部评论(0)

按点赞数排序

按时间排序

关于作者
NGINX官方账号
这家伙很懒还未留下介绍~
228
文章
21
问答
198
粉丝
相关文章
介绍nginx网页配置工具QQ技术交流群1:1106758598QQ技术交流群2:560797506邮箱: cym1102@qq.com官网地址: http://www.nginxwebui.cn码云: https://gitee.com/cym1102/nginxWebUIgithub: https://github.com/cym1102/nginxWebUI功能特点nginxWebUI也可管理多个nginx服务器集群,随时一键切换到对应服务器上进行nginx配置,也可以一键将某台服务器配置同步到其他服务器,方便集群管理.部署此项目后,配置nginx再也不用上网各种搜索配置代码,再也不用手动申请和配置ssl证书,只需要在本项目中进行增删改查就可方便的配置和启动nginx。技术说明本项目是基于springBoot的web系统,数据库使用sqlite,因此服务器上不需要安装任何数据库项目启动时会释放一个.sqlite.db到系统用户文件夹中,注意进行备份本系统通过Let'sencrypt申请证书,使用acme.sh脚本
点赞 6
浏览 6.1k
  前三周学习了陶辉老师的“NGINX基础培训系列课程”,感觉受益良多,在这里想把一些知识点记录一下,和大家分享一下知识点,也方便日后的随手查看,温故知新。  首先,我们了解到了Nginx的版本,Nginx发布版本分为主线版本和稳定版本,区分两个版本也非常简单,主线版本版本号为单数,比如1.19,稳定版本为双数,比如1.18,今天我要说的是稳定版本,这个版本会尽量少的减少Nginx的bug问题,适用于生产环境,这里我不建议使用Nginx和其他软件一样在生产环境中落后一个或多个大版本使用,之前生产环境做过漏扫,发现我们编译自带的Nginx版本为:nginx/1.13.3(查询命令为nginx-V),结果出现了多个漏洞,四个高危和一个中危漏洞:        通过升级Nginx到稳定版最新版本后修复!  其次,是Nginx发行版本的选择,目前比较流行的有:nginx、nginxplus、Tengine、openresty、ope
点赞 1
浏览 3.2k
感谢您参加“NGINX从入门到精通进阶系列培训”!以下为培训的问答、课件和录像,希望您能通过此培训学有所得,祝学习进步!>问与答:- 基础篇+高级篇 - 应用篇+实战篇(New)>课件(PPT):基础篇:-NGINX概要、安装、配置:https://interact.f5.com/rs/653-SMC-783/images/CNFEB22-NginxCoreCourse-Setup.pdf-NGINX日志、运维:https://interact.f5.com/rs/653-SMC-783/images/cnfeb22-nginxcorecourse-maintenance.pdf高级篇:-NGINX变量、API:https://interact.f5.com/rs/653-SMC-783/images/CNFEB22-NginxCoreCourse-API.pdf-NGINXSSL、NJS:https://interact.f5.com/rs/653-SMC-783/images/CNFEB22-NginxCoreCourse-SSL.pdf
点赞 10
浏览 4.8k