zkz098's blog

使用caddy2支持QUIC协议

发布于 字数统计 1.9k 字 阅读时长 7 分钟

使用caddy2支持QUIC协议

发布于 字数统计 1,902 阅读时长 10 分钟

本文当做caddy2安装教程就行,更换服务器后已更新为nginx-quic

QUIC与HTTP3

什么是QUIC

QUIC 是 Quick UDP Internet Connections 的缩写,目前分为iQUIC和gQUIC两种
QUIC类似于在内核层实现的TCP + TLS + HTTP/2。但QUIC基于UDP,因此绕开了对TCP进行改造的大量成本
QUIC相较于TLS+HTTP2有几点优势:

  • 首次握手1-RTT
  • 改善了TCP的拥塞
  • 前向纠错,减少重传
  • 连接平滑迁移,网络状态的变更不会影响连接断线

QUIC与HTTP/2+TLS的示意图:
100_1.png

为什么部署QUIC

本网站已经部署了HTTP/2+TLS1.3v,理论上可以实现0-RTT握手
但由于QUIC对弱网环境的优化所以部署了QUIC 4次丢1次的离谱传输
还有一个次要原因就是速度快和我个人比较喜欢新的协议 闲的

理由写的有 亿 点多,进入正题

QUIC部署

本站为纯静态网站且近期才开始部署,所以使用方案较为激进

本站直接使用caddy进行web服务,并没有使用nginx+caddy的方案

安装caddy

caddy仅支持iQUIC的最新草案,支持gQUIC请使用 litespeed

本文针对于ubuntu系统,其他系统见caddy官网

sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo tee /etc/apt/trusted.gpg.d/caddy-stable.asc
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy

执行上述命令即可安装caddy

配置文件

sudo vim /etc/caddy/Caddyfile

创建一个caddyfile然后写入以下内容:

{
    servers {
        protocol {
            experimental_http3
        }
    }
}

然后在这段的下面写入:

你的域名:443 {
    root * /你的网站根目录
    encode zstd gzip # 开启gzip功能
    tls mail@mail.com # 你的邮件,用于申请ssl证书
    file_server
}

域名后的:443不带空格,空格是代码自动处理的错误
如果你自带证书,可以将tls后写成这样:

tls key pem # 先是key文件,然后pem证书

再在域名这个块内插入以下内容:

可以不插入试一下,如果可以就无须插入

header {
    alt-svc h3=":443", ma=2592000
}

然后执行以下命令:

sudo caddy run -config=/etc/caddy/Caddyfile # 你的配置文件路径

如果没有错误,就成功了

验证QUIC

2022/2/6更新
今天打开网页,发现HTTP/2 and SPDY indicator插件变成了绿色:
打开开发者工具查看:
发现几乎全部为http/3协议,安全页也由TLS1.3变成了QUIC
后来发现是最开始没有打开UDP443端口导致QUIC握手一直失败,触发了浏览器的冷却期
直到今天才结束,使用了QUIC握手
ubuntu放行443/udp端口:

sudo ufw allow 443/udp