用caddy平替nginx
背景
我是一台阿里云的服务器,主要部署的内容围绕都是 web 和 api 的服务,主要技术栈是围绕python 、 vue项目,python 集中在django 、 fastapi 项目。大概有 5~6 个域名 + 10多个服务。每个请求量都不大,域名解析主要是用的nginx + acme.sh来做 https域名证书管理。
宿主机部署nginx来做第一层的拦截,acme.sh来做域名管理,其余的服务全部跑在docker里面。
现在背景介绍完毕了以后,在说一下我的痛点。
痛点
证书管理和nginx没有整合
acme.sh 已经很好用了,但是随着域名增加或更换,每次在配置了nginx后还需要配套调整 acme.sh,虽然不麻烦,但是每次要调整,不然最多 3 个月后可能会出现证书过期等问题,很早就关注了caddy来平替nginx并且整合了证书管理,能节省很多时间。
容器化管理转发问题
本身我的 vue项目也是跑在docker中的,在容器中会用nginx来管理并暴漏端口给到宿主机,就变成了要维护 2 套,这个是我的问题 ,因为一直是这个模式,就比较懒,后续的项目全都是用这个方式来做部署了。
新方式
在新方式我把docker也替换成了podman
docker-compose 替换成了 podman-compose。
在网上我查了一些资料,在高请求并发下caddy比nginx差了一些,但在请求量不大的情况下,caddy刚好能满足我的需求,并且帮我解决了割裂部署的情况。
同时由于历史问题,之前我的项目是用的django,最近 2 年开始所有的项目都是基于fastapi来做部署。这样容器化更好管理,而且除了网上都说的一些权限安全性问题,在性能上我觉得podman-compose也更加突出了轻量化的概念,同样的机器 + 服务, 我的小水管服务器上 cpu 性能占比直接下降了 10%,内存占比下降了5%。这个我在继续关注,后续会专门来讲一下,而且本身我项目上的一些迁移也是从docker-swarm也在持续迁移到k8s上,后续使用podman也会心智负担更低。
正题
这里在来讲一下关注caddy的配置一些优势。我用的是阿里云的域名 + 机器,在开始安装的时候,需要额外先安装go,然后在重新下载源码,编译阿里云版本,便于后续自动续期 https 证书。这个网上很多资料,照着操作就可以了,基本没什么坑。
基本配置
caddy的基本配置很简单,就是基于一个Caddyfile文件实现
# Caddyfile
{
# 申请证书用的邮箱
email 你的邮箱,便于收到失败续期等结果
acme_dns alidns {
access_key_id 阿里云的id
access_key_secret 你的阿里云密钥
}
}
# 引入各域名配置
import sites/*.caddyfile
没了,就这么简单,其实什么东西都没了, 除了上面 2 个啥都不用写了,注意我下面的import sites/*.caddyfile,那我在同目录下创建了多个域名.caddfile文件,用来做不同的域名的管理。
http://mingtae.com, http://*.mingtae.com {
redir https://{host}{uri} permanent
}
https://mingtae.com, https://*.mingtae.com {
# 限制请求体大小
request_body 200MB
tls {
protocols tls1.2 tls1.3
ciphers TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 T
LS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
}
# 导入静态文件路径,如果有多个就配置多个
handle_path /static/* {
root * /home/static
file_server
}
# ---- 其余请求反代到 python ----
handle {
reverse_proxy 127.0.0.1:8001
}
}
然后输入完毕后执行sudo caddy reload就会立刻生效,非常的简单。比之前的 nginx 要配置ssl_certificate 、 ssl_certificate_key 、 ssl_trusted_certificate 等一大堆路径 还有acme.sh的配置来说 简直不能太友好了。