使用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 Caddyfile -
caddy help
View help for caddy commands -
caddy list-modules
Lists the installed Caddy modules -
caddy reload
Changes the config of the running Caddy process -
caddy run
Starts the Caddy process in the foreground -
caddy start
Starts the Caddy process in the background -
caddy stop
Stops the running Caddy process -
caddy 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 valid -
caddy 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
配置,那么所以域名都会默认使用这个方式。