使用Caddy,拥抱HTTP3
HTTP3已经正式发布了一段时间,当前主流浏览器都已经支持http3。 故而打算使用http3来改善当前的网络服务。
查看了当前可以使用的http3的web服务器, 当前nginx
只有发布了测试版本,还没有正式启用, 目前看可使用的有traefik
和caddy
这两个软件。
经过对比选择了使用caddy
来做web服务器。
编译caddy
使用caddy,caddy是使用go编写的http服务器。 需要使用caddy的一些扩展功能的话,需要自己编译caddy,需要使用xcaddy工具来创建版本。
这里我使用了docker中的xcaddy来进行创建,由于使用了golang,可以很方便的交叉编译,创建其它系统平台架构的caddy服务。
xcaddy编译代码:
xcaddy build {version} \ --with github.com/caddy-dns/cloudflare \ --with github.com/caddy-dns/route53 \ --with github.com/caddy-dns/vultr \ --with github.com/mholt/caddy-webdav
caddy使用go开发,可以自己开发caddy的插件来完成需要的功能。 可以参考官方的文档 Extending Caddy 进行开发。
这里我使用了cloudflare
和route53
的dns服务来进行域名解析,所以添加了这两个模块。
使用caddy
caddy使用非常简单,并且可以使用api进行配置,不需要重启。
启动caddy
caddy start
caddy 启动回自动加载当前目录下的 Caddyfile,启动服务。
常用命令
caddy fmt
Formats a Caddyfilecaddy help
View help for caddy commandscaddy list-modules
Lists the installed Caddy modulescaddy reload
Changes the config of the running Caddy processcaddy run
Starts the Caddy process in the foregroundcaddy start
Starts the Caddy process in the backgroundcaddy stop
Stops the running Caddy processcaddy trust
Installs a certificate into local trust store(s)caddy untrust
Untrusts a certificate from local trust store(s)caddy validate
Tests whether a config file is validcaddy version
Prints the version
配置文件Caddyfile
{ # General Options # debug http_port 80 https_port 443 # TLS Options auto_https disable_redirects email gsmlg.com@gmail.com skip_install_trust # acme_ca https://acme-staging-v02.api.letsencrypt.org/directory # acme_ca https://acme-v02.api.letsencrypt.org/directory # acme_dns cloudflare {.env.CF_API_TOKEN} # Server Options servers { protocol { allow_h2c experimental_http3 # strict_sni_host } } } (cloudflare) { tls { ca https://acme-v02.api.letsencrypt.org/directory dns cloudflare {.env.CF_API_TOKEN} resolvers 8.8.8.8 1.1.1.1 } } (route53) { tls { ca https://acme-v02.api.letsencrypt.org/directory dns route53 { max_retries 3 } resolvers 8.8.8.8 1.1.1.1 } } *.my-domain.net { import route53 @site host some.my-domain.net handle @site { reverse_proxy localhost:8080 } } *.my-domain.com { import cloudflare @site host some.my-domain.com handle @site { reverse_proxy localhost:8080 } }
使用中遇到的问题
strict_sni_host
启用后,会导致http3服务无法访问aws配置route53配置
# 环境变量
AWS_ACCESS_KEY_ID='<access key>'
AWS_SECRET_ACCESS_KEY='<secret key>'
AWS_HOSTED_ZONE_ID='<zone id>'
AWS_REGION='<region>'
# or 配置文件放在用户目录下
~/.aws
cloudflare 配置使用环境变量
CF_API_TOKEN
全局配置了
acme_dns
配置,那么所以域名都会默认使用这个方式。