背景
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上构建的,构建命令如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# 克隆v2.5.1分支的代码 git clone -b v2.5.1 https://github.com/caddyserver/caddy.git caddy-2.5.1 # 切换到caddy目录 cd caddy-2.5.1/ # 切换到指定目录构建编译工具xcaddy cd cmd/caddy/ # 设置版本号环境变量 export version=$(curl -s "https://api.github.com/repos/caddyserver/caddy/releases/latest" | jq -r .tag_name) # 下载安装xcaddy到当前目录(请注意替换成你实际在使用的系统和架构的下载地址) wget https://github.com/caddyserver/xcaddy/releases/download/v0.3.0/xcaddy_0.3.0_mac_amd64.tar.gz tar -xf xcaddy_0.3.0_mac_amd64.tar.gz # 执行xcaddy ./xcaddy # 执行交叉编译 GOOS=linux GOARCH=386 ./xcaddy build v2.5.1 --output ./caddy_v2.5.1 --with github.com/caddyserver/transform-encoder # 拷贝编译出的二进制包到云主机 scp caddy_v2.5.1 [云主机SSH地址]:~/ |
然后在云主机上将可执行文件放到/usr/local/bin
目录下,Caddy构建完成。
Caddy部署
Caddy2的配置文件做了一些更新,不能直接使用Caddy1的配置文件。因此我们需要重新写一下配置文件。
核心调整为
- 启用实验性的HTTP/3支持
- 去掉Server返回头
- 覆改默认的alt-svc头,将端口号从444改为443
- 将请求转发到nginx上游
配置文件如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
{ http_port 81 servers { protocol { experimental_http3 } } } https://[监听域名1]:444 { tls [证书链pem文件路径] [私钥pem文件路径] header -Server; header alt-svc "h3-29=\":443\"; ma=2592000" { defer } reverse_proxy https://[nginx所在域名]:443 { header_up Host {host} header_up X-Real-IP {remote} header_up X-Forwarded-For {remote} header_up X-Forwarded-Proto {scheme} } log { output file [日志文件路径] format transform "{common_log}" } } |
配置文件完成后,选择使用supervisord做做守护进程。在supervisor配置中增加以下内容
1 2 3 4 5 6 7 8 |
[program:caddy] user=www-data group=www-data command=[Caddy可执行文件路径] run -config [Caddy配置文件路径] autostart=true autorestart=true startsecs=1 |
需要注意调整日志目录,保证www-data用户有权限写入。
重新加载supervisor配置后,使用netstat -antpu | grep :444
确认Caddy成功运行。
配置目的端口转发
这里使用iptables进行目的端口的转发
1 2 |
iptables -t nat -A PREROUTING -p udp -m udp --dport 443 -j REDIRECT --to-ports 444 |
可以将这个命令加入到启动命令中,如/etc/rc.local
验证
鉴于构建HTTP3验证环境目前相对麻烦,这里采取使用在线网站验证HTTP3有效性的方式。访问 http3check.net这个网站,输入配置好的网址,即可验证HTTP3功能是否正常。我将配置好的域名输入,显示QUIC不可用,0-RTT可用,HTTP/3可用。至此配置完成。