使用caddy配合nginx支持HTTP3

背景

HTTP3从2022年6月起随RFC9114成为正式提案标准,我们之前部署的QUIC服务也应当正式升级成为HTTP3了。那应该如何构建方案呢。

这是一篇补记,caddy配合nginx支持HTTP3方案是在2022年6月初部署的

方案

大的方案还是使用nginx在443端口进行监听提供基于TCP的服务,Caddy在444端口进行监听提供UDP服务,但我们通过目的端口映射到443,让访问者看起来像是访问443端口可以获得TCP和UDP两种服务。

看到这里有人可能会问,为什么不直接使用Caddy来提供完整的web服务,还要再转发到nginx上呢?我的考虑是因为我用了多年的nginx,日志、鉴权、防攻击、转发到上游等配置等都是非常成熟且现成可用的,因此不希望再重新去学习一遍在Caddy上如何配置。我相信还是有不少人和我的场景是一样的。

下面来看看具体怎么操作。

Caddy构建

首先部署Caddy。根据官网的说明,我选择了Caddy 2.5.1版本进行部署。由于我的云主机为了节省内存选择了32位操作系统,官方不提供预编译的二进制包,因此我需要手工构建。如果你的环是64位环境,则不存在这个问题,直接使用官方的预编译二进制包即可。

我是在macOS上构建的,构建命令如下

然后在云主机上将可执行文件放到/usr/local/bin目录下,Caddy构建完成。

Caddy部署

Caddy2的配置文件做了一些更新,不能直接使用Caddy1的配置文件。因此我们需要重新写一下配置文件。

核心调整为

  • 启用实验性的HTTP/3支持
  • 去掉Server返回头
  • 覆改默认的alt-svc头,将端口号从444改为443
  • 将请求转发到nginx上游

配置文件如下

配置文件完成后,选择使用supervisord做做守护进程。在supervisor配置中增加以下内容

需要注意调整日志目录,保证www-data用户有权限写入。
重新加载supervisor配置后,使用netstat -antpu | grep :444确认Caddy成功运行。

配置目的端口转发

这里使用iptables进行目的端口的转发

可以将这个命令加入到启动命令中,如/etc/rc.local

验证

鉴于构建HTTP3验证环境目前相对麻烦,这里采取使用在线网站验证HTTP3有效性的方式。访问 http3check.net这个网站,输入配置好的网址,即可验证HTTP3功能是否正常。我将配置好的域名输入,显示QUIC不可用,0-RTT可用,HTTP/3可用。至此配置完成。

发表评论

为防机器,验证码请直接输入4个数字1

*