编程 Caddy深度拆解:Go写的Web服务器,自动HTTPS两行配置替代NGINX证书管理

2026-07-25 21:18:33 +0800 CST views 6

Caddy 深度拆解:Go 写的 Web 服务器,自动 HTTPS 两行配置

来源:微信公众号

Caddy:56K Star,Go 写的 Web 服务器,Apache-2.0 协议。核心卖点——配置简单到令人发指,HTTPS 自动搞定。

为什么需要 Caddy

HTTPS 证书管理是 Web 服务器的常见痛点。用 Let's Encrypt 申请证书,90 天过期,要写 cron 任务自动续期。脚本挂了没人发现,直到用户投诉"网站打不开",才发现证书过期了。

Caddy 的思路:配置一行 example.com,自动申请证书,自动续期。从此不用管证书的事。

Caddy 是什么

项目信息详情
GitHubgithub.com/caddyserver/caddy
Star56K+
语言Go
协议Apache-2.0
定位Web 服务器 / 反向代理
特色自动 HTTPS、配置简单
安装二进制 / Docker / 包管理器

Caddy 最早是 Matt Holt 在 2015 年做的。他在做 Web 开发时,发现 NGINX 配置复杂,HTTPS 证书管理麻烦,就写了 Caddy。名字"球童"——高尔夫球童帮你拿球杆,Caddy 帮你搞定 Web 服务的琐事。

Caddyfile:配置有多简单

静态文件服务

localhost:8080 {
    file_server browse
}

反向代理

example.com {
    reverse_proxy localhost:8080
}

两行。HTTPS 自动搞定。

负载均衡

example.com {
    reverse_proxy {
        to localhost:8080 localhost:8081 localhost:8082
    }
}

多站点

example.com {
    reverse_proxy localhost:8080
}

api.example.com {
    reverse_proxy localhost:9090
}

对比 NGINX:NGINX 配置文件长、语法复杂。Caddyfile 短、语法简单。

自动 HTTPS:Let's Encrypt 集成

当你在 Caddyfile 里写 example.com,Caddy 会:

  1. 向 Let's Encrypt 申请证书
  2. 配置 HTTPS(自动重定向 HTTP 到 HTTPS)
  3. 定期续期证书(证书过期前自动续期)

你不用管证书怎么申请、怎么续期。Caddy 全自动。

内部 HTTPS(自签名证书):

https://internal.example.com {
    tls internal
    reverse_proxy localhost:8080
}

tls internal 告诉 Caddy:用自签名证书。Caddy 自动生成根证书,自动配置 TLS。

反向代理和负载均衡

WebSocket 代理:Caddy 自动支持 WebSocket,不用额外配置。

健康检查

example.com {
    reverse_proxy {
        to localhost:8080 localhost:8081
        health_uri /health
        health_interval 10s
    }
}

Caddy 定期检查后端的 /health 端点,如果不健康,停止转发请求。

重试

example.com {
    reverse_proxy {
        to localhost:8080 localhost:8081
        fail_duration 10s
        max_fails 3
    }
}

后端失败了,Caddy 自动重试。

插件系统

Caddy 有插件系统。插件可以扩展功能:

  • caddy-cloudflare:Cloudflare DNS 验证
  • caddy-security:认证、授权
  • caddy-ratelimit:限流
  • caddy-cache:缓存

安装插件:

xcaddy build --with github.com/caddy-dns/cloudflare

xcaddy 是 Caddy 的构建工具,把插件编译进 Caddy。

跟其他方案对比

维度CaddyNGINXTraefikHAProxy
语言GoCGoC
配置Caddyfile(简单)nginx.conf(复杂)动态(K8s/Docker)haproxy.cfg(复杂)
HTTPS自动手动自动(Let's Encrypt)手动
反向代理
负载均衡
Web UI有(API)
学习成本

Caddy 配置最简单、HTTPS 自动、学习成本最低。

Go 代码赏析

Caddy 的代码结构清晰。几个核心包:

功能
cmd/caddy/Caddy 主进程入口
caddyconfig/Caddyfile 解析
modules/caddyhttp/HTTP 模块(反向代理、文件服务)
modules/caddytls/TLS 模块(自动 HTTPS)
modules/caddypki/PKI 模块(内部 CA)
admin/管理 API

代码风格是标准的 Go。函数短小,命名清晰。错误处理显式。

不足

  • 性能不如 NGINX:Caddy 是 Go 写的,NGINX 是 C 写的。大规模高并发场景,NGINX 性能更好。
  • 功能不如 NGINX 全:NGINX 有很多高级功能——复杂的 rewrite 规则、精细的缓存策略、各种 filter。Caddy 的功能相对简单。
  • 插件生态有限:NGINX 的模块生态庞大,社区活跃。Caddy 的插件少很多。
  • 升级有坑:跨版本升级有时不兼容,特别是 Caddyfile 语法变化。
  • 内存占用高:Go 的 goroutine 有内存开销,Caddy 的内存占用比 NGINX 高。

适用场景

  • 个人项目:跑个人博客、个人项目?Caddy 一行配置搞定 HTTPS。
  • 小团队:没有专职运维,不想在 Web 服务器上花时间?Caddy 配置简单,自动 HTTPS,让你专注业务。
  • API 网关:要跑 API 服务,需要反向代理、负载均衡?Caddy 几行配置就能搭起来。
  • 静态文件服务file_server 一条指令,目录浏览都给你开了。
  • 本地开发 HTTPStls internal 自动生成自签名证书。

总结

NGINX 配置复杂,HTTPS 证书要手动申请、手动续期。Caddy 换了个思路:配置简单到令人发指,HTTPS 全自动。两行配置,跑起来一个 HTTPS 站点。证书申请、续期,都不用你管。

如果你的项目还在用 NGINX,被复杂配置和证书管理折磨,花一天看看 Caddy。可能会让你重新认识 Web 服务器。

GitHub:https://github.com/caddyserver/caddy
官网:https://caddyserver.com/docs

推荐文章

Chrome DevTools MCP 深度实战
2026-06-22 20:27:14 +0800 CST
【SQL注入】关于GORM的SQL注入问题
2024-11-19 06:54:57 +0800 CST
pin.gl是基于WebRTC的屏幕共享工具
2024-11-19 06:38:05 +0800 CST
地图标注管理系统
2024-11-19 09:14:52 +0800 CST
详解 Nginx 的 `sub_filter` 指令
2024-11-19 02:09:49 +0800 CST
程序员茄子在线接单