正在进入ing...

用caddy平替nginx

发布时间:2025-11-30 浏览量: 7 文章分类: 运维相关

背景

我是一台阿里云的服务器,主要部署的内容围绕都是 web 和 api 的服务,主要技术栈是围绕pythonvue项目,python 集中在djangofastapi 项目。大概有 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

在网上我查了一些资料,在高请求并发下caddynginx差了一些,但在请求量不大的情况下,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_certificatessl_certificate_keyssl_trusted_certificate 等一大堆路径 还有acme.sh的配置来说 简直不能太友好了。