提醒:本文最后更新于 1124 天前,文中所描述的信息可能已发生改变,请仔细核实。

CF最近推出了个项目quiche,用于为Nginx添加QUIC支持,并支持HTTP3。
具体可以查看传送门。为此,我也更新了patch,重新整合了下。因为SPDY早已过期,所以这次新的patch就没再整合进来。
Patch为Nginx添加了以下特性:
Add QUIC Support.
Add HTTP2 HPACK Encoding Support.
Add Dynamic TLS Record support.
需要spdy的话,可以用这个Patch。
目前已知Arch、Ubuntu 18可以直接编译成功。
像Debian 10和CentOS 8,需要编译部分组件,特别是需要最新版的rust支持。
通过以下命令可以安装最新版rust:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
然后在shell界面通过
source $HOME/.cargo/env
来临时添加环境变量调用。
具体patch使用,可以见上面CF文章传送门,我这里也大概讲下。
支持Nginx稳定版(1.16)和主要分支(1.17)的最新版本。
首先,获取quiche项目备用:
git clone --recursive https://github.com/cloudflare/quiche
其次,进入到Nginx源码目录,打我的patch或者是CF的patch。
接着,编译参数除了自定参数外,添加以下参数:
--with-http_v3_module
--with-openssl=/path/to/quiche/deps/boringssl
--with-quiche=/path/to/quiche
注意,按照实际更改位置。然后编译即可。也可以参考下我之前的文章:《我的Nginx编译之旅》
Nginx配置方面,在Server段,需要两个listen,一个是udp,也就是quic,一个是tcp,也就是正常的443 SSL这些。
并且,需要新增一个Header,还有TLS1.3支持。配置大概如下:
server {
# Enable QUIC and HTTP/3.
listen 443 quic reuseport;
# Enable HTTP/2 (optional).
listen 443 ssl http2;
ssl_certificate cert.crt;
ssl_certificate_key cert.key;
# Enable all TLS versions (TLSv1.3 is required for QUIC).
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
# Request buffering in not currently supported for HTTP/3.
proxy_request_buffering off;
# Add Alt-Svc header to negotiate HTTP/3.
add_header alt-svc 'h3-27=":443"; ma=86400';
}
最早的时候,CF文章,忘记提示需要添加header,现在文章也已经有了。
其他就没啥坑了。
HTTP3测试可以通过quiche项目的工具检查,也可以通过这里检查。
不过讲道理,现在HTTP3没什么浏览器支持,QUIC也没多少支持的,虽说目前协议是已经是完善的了,但暂时仅限尝鲜。
但不得不吐槽的是Nginx官方速度真的慢,之前明明说好已经在给Nginx添加QUIC支持了,然后今年都快完了,还没弄出来。
另外quiche用了BoringSSL,而BoringSSL不支持OCSP Stapling,可以使用这个Patch解决。
自动更新OCSP Stapling File,请查看这篇文章《让Nginx使用BoringSSL时支持OCSP Stapling》。
然后目前博客服务器的Nginx已经rollback。。等以后再上了。
谈谈patch,下一版本,肯定是放弃spdy的了。
毕竟已经被废弃这么久了,加上明年上半年,主流浏览器也不会再支持TLS 1.0和TLS 1.1,那就更没有留的必要了。
我最迟可能也会在明年5月就取消这部分(SPDY、TLS 1.0和TLS 1.1)支持。
转载请注明转自: kn007的个人博客 的《小试HTTP3》


升级到HTTP/3
玩不来了,真的老了
对我们博客有多大影响,期待给我们普及一下
有点溜啊,http/2我都没搞懂是什么回事
所以,tomcat什么时候支持quic
请问您使用的是什么状态页的监控 status.kn007.net 麻烦您告知一下,谢谢
@Terrance: 朋友的一个项目,项目地址:
https://github.com/giuem/uptimerobot-page
@kn007: 大神,如何部署status page页呢 部署没有成功.访问网页报错 {"stack":null},谢谢!
害,http2还没上呢
patch -p1 < nginx_with_quic.patch
返回 patch: **** Only garbage was found in the patch input.
nginx版本是1.17.7
请问怎么解决?
@ahu: 很明显你文件下错了。。
很多小白并不是下载raw文件,而是下了个html,然后就想patch
@kn007:
这 TM 就尴尬了,还真是 
哈哈,祝 kn007 老大新年快乐~谢谢这么及时的提醒!
@ahu: 客气,新年快乐
做完 h3升级后,运行 nginx -t 报nginx: [emerg] PEM_read_bio_DHparams("/etc/nginx/ssl/dhparam.pem") failed (SSL: error:0900006e:PEM routines:OPENSSL_internal:NO_START_LINE:Expecting: DH PARAMETERS)
可是这个dhparam.pem没动过,之前好好的。重新生成了新的,也还是不行。不知道是怎么回事...
@ahu: 不打补丁呢?
这个一般是openssl的so导致的。
不过从未遇到过,无法解答。
@kn007: 我之前也是参照你的教程进行编译的,没有问题。
但之前使用的是 openssl 而不是 boringssl——这可能是最大的区别吧。
所以我估计问题不是你的补丁...
@ahu: 按照我的nginx编译之旅的参数的话,记得不要with-openssl-opt。然后with-openssl记得指向quiche的boringssl
@kn007: 对,就是这样操作的。
所以我怀疑是 boringssl 的锅
@ahu: 最新的quiche patch直接作用于1.17.7上,boringssl直接编译失败了(我cmake是最新版本)。。
可能boringssl确实有点问题,这个要追溯根源从google那边,还要比对cf的修改,比较麻烦。
@kn007: 补充:看了下,CF使用的是原版BoringSSL,回头确认一下变化
@ahu: 用了最新版的BoringSSL替代CF指定的后(需要最新的cargo和rust),一切正常。
@ahu: 等闲下来,我再更新下patch看看。
-------------
已更新Patch,另外BoringSSL源码里自带了4096位dh,不需要自己加
其实chrome和edge貌似都默认开启quic支持了,国内的话可以看下搜狐视频,他们的视频服务器已经是QUIC连接的了
但是他们开源的那个补丁真的头痛,不仅要拖全套的chromium源码,还不能有多个server块,吐了
但那个应该是我能找到的唯一一个gQUIC实现了
@Zxilly: 搜狐那个用了chromium了,我知道。
那个有点麻烦。。。不过支持还行
@kn007: 额,那您试过那个patch吗
我反正没法让他跑起来,主要的问题是https://github.com/evansun922/nginx-quic/issues/7
@Zxilly: 没有。过于麻烦