kn007的个人博客
♥ You are here: Home > 软件与网络 > VPS > 小试HTTP3

小试HTTP3

by | 39 Comments


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

donate
有所帮助?

Comments

39 Comments立即评论
  1. 升级到HTTP/3 ;-)

  2. 玩不来了,真的老了 :|

  3. 对我们博客有多大影响,期待给我们普及一下 ;-)

  4. 有点溜啊,http/2我都没搞懂是什么回事

  5. 回复

    所以,tomcat什么时候支持quic :grin:

  6. 回复

    请问您使用的是什么状态页的监控 status.kn007.net 麻烦您告知一下,谢谢

    1. MOD回复

      @Terrance: 朋友的一个项目,项目地址:
      https://github.com/giuem/uptimerobot-page

    2. 回复

      @kn007: 大神,如何部署status page页呢 部署没有成功.访问网页报错 {"stack":null},谢谢!

  7. 回复

    害,http2还没上呢

  8. 回复

    patch -p1 < nginx_with_quic.patch
    返回 patch: **** Only garbage was found in the patch input.
    nginx版本是1.17.7
    请问怎么解决?

    1. MOD回复

      @ahu: 很明显你文件下错了。。

      很多小白并不是下载raw文件,而是下了个html,然后就想patch :grin:

    2. 回复

      @kn007: :smile: 这 TM 就尴尬了,还真是 :o
      哈哈,祝 kn007 老大新年快乐~谢谢这么及时的提醒!

    3. MOD回复

      @ahu: 客气,新年快乐

  9. 回复

    做完 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没动过,之前好好的。重新生成了新的,也还是不行。不知道是怎么回事...

    1. MOD回复

      @ahu: 不打补丁呢?
      这个一般是openssl的so导致的。

      不过从未遇到过,无法解答。

    2. 回复

      @kn007: 我之前也是参照你的教程进行编译的,没有问题。
      但之前使用的是 openssl 而不是 boringssl——这可能是最大的区别吧。
      所以我估计问题不是你的补丁...

    3. MOD回复

      @ahu: 按照我的nginx编译之旅的参数的话,记得不要with-openssl-opt。然后with-openssl记得指向quiche的boringssl

    4. 回复

      @kn007: 对,就是这样操作的。
      所以我怀疑是 boringssl 的锅 :sad:

    5. MOD回复

      @ahu: 最新的quiche patch直接作用于1.17.7上,boringssl直接编译失败了(我cmake是最新版本)。。

      可能boringssl确实有点问题,这个要追溯根源从google那边,还要比对cf的修改,比较麻烦。

    6. MOD回复

      @kn007: 补充:看了下,CF使用的是原版BoringSSL,回头确认一下变化

    7. MOD回复

      @ahu: 用了最新版的BoringSSL替代CF指定的后(需要最新的cargo和rust),一切正常。

    8. MOD回复

      @ahu: 等闲下来,我再更新下patch看看。

      -------------

      已更新Patch,另外BoringSSL源码里自带了4096位dh,不需要自己加

  10. 回复

    其实chrome和edge貌似都默认开启quic支持了,国内的话可以看下搜狐视频,他们的视频服务器已经是QUIC连接的了
    但是他们开源的那个补丁真的头痛,不仅要拖全套的chromium源码,还不能有多个server块,吐了
    但那个应该是我能找到的唯一一个gQUIC实现了

    1. MOD回复

      @Zxilly: 搜狐那个用了chromium了,我知道。
      那个有点麻烦。。。不过支持还行

    2. 回复

      @kn007: 额,那您试过那个patch吗
      我反正没法让他跑起来,主要的问题是https://github.com/evansun922/nginx-quic/issues/7

    3. MOD回复

      @Zxilly: 没有。过于麻烦

icon_wink.gificon_neutral.gificon_mad.gificon_twisted.gificon_smile.gificon_eek.gificon_sad.gificon_rolleyes.gificon_razz.gificon_redface.gificon_surprised.gificon_mrgreen.gificon_lol.gificon_idea.gificon_biggrin.gificon_evil.gificon_cry.gificon_cool.gificon_arrow.gificon_confused.gificon_question.gificon_exclaim.gif