本文当做 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 对弱网环境的优化所以部署了 QUIC4 次丢 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