教程

Nginx 还是 Caddy?一篇写给实际运维者的对比指南

2026-06-12 #Nginx#Caddy

如果你要给一个网站、API 或者一堆容器选一个反向代理 / Web 服务器,2026 年的今天你大概率会在 Nginx 和 Caddy 之间犹豫。这篇文章不站队,而是从配置体验、HTTPS、性能、生态、扩展性几个维度把两者掰开讲清楚,最后给出明确的选型建议。

一句话认识两位选手

  • Nginx:2004 年诞生,C 语言编写,事件驱动架构的鼻祖级实现。占据全球 Web 服务器市场的头部份额,几乎是”反向代理”的代名词。
  • Caddy:2015 年发布,Go 语言编写,主打”默认 HTTPS”和极简配置。Caddy 2 重写后以模块化架构和 JSON 配置 API 为核心。

配置体验:最直观的差距

先看一个最常见的需求:把 example.com 反向代理到本地 8080 端口,并启用 HTTPS。

Caddy(Caddyfile,3 行):

1
2
3
example.com {
reverse_proxy localhost:8080
}

证书自动申请、自动续期、HTTP 自动跳转 HTTPS——全部默认完成。

Nginx(约 25 行 + certbot):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}

server {
listen 443 ssl http2;
server_name example.com;

ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

还需要额外跑 certbot 申请证书并配置定时续期。

但要公平地说:Nginx 的冗长换来的是显式与精细proxy_set_header 每一行都看得见摸得着;而 Caddy 帮你做的事藏在默认值里,出问题时你需要知道它默认做了什么。对于配置规模庞大、需要精确控制每个 header、buffer、timeout 的场景,Nginx 的配置语言虽然啰嗦,但表达力和社区可参考的范例数量是压倒性的。

HTTPS 与证书管理

这是 Caddy 的主场:

  • 自动 HTTPS:通过 ACME(Let’s Encrypt / ZeroSSL)自动签发、续期、轮换证书,包括 OCSP 装订,零配置。
  • 按需 TLS(On-Demand TLS):在 TLS 握手时才为新域名签证书,是 SaaS 自定义域名(客户绑定自己的域名)场景的杀手锏。Nginx 体系要实现同样的效果通常得上 OpenResty + lua-resty-auto-ssl,复杂度完全不在一个量级。
  • 内部 CA:内置本地 CA,localhost 开发环境也能用受信任的 HTTPS。

Nginx 这边,证书管理依赖外部工具(certbot、acme.sh、lego),工作得也很成熟,但本质上是”胶水方案”:多一个进程、多一个 cron、多一个 reload 钩子,多一处可能坏的地方。

性能:差距比你想象的小

网络上流传”C 写的肯定比 Go 快”,实际测试中:

  • 静态文件与常规反向代理:两者在绝大多数真实负载下吞吐量处于同一量级。Nginx 在极限 RPS 和内存占用上通常仍有优势(C + 精细的内存管理 vs Go runtime + GC),尤其是数十万并发连接的极端场景。
  • 尾延迟:Go 的 GC 在高压下可能带来轻微的 P99 抖动,但对绝大多数业务无感。
  • HTTP/3:两者都已支持 QUIC/HTTP3,Caddy 默认启用,Nginx 需要显式配置。

结论:除非你在做 CDN 边缘节点或单机要扛几十万并发,性能不应该是你们之间的决定因素。 瓶颈几乎总在上游应用,而不是代理层。

运维与生态

维度 Nginx Caddy
配置热加载 nginx -s reload,成熟可靠 Admin API 优雅热加载,零停机
动态配置 原生不支持,需 reload 或商业版/OpenResty 内置 JSON Admin API,可编程修改运行时配置
文档与搜索答案 二十年积累,几乎任何问题都有现成答案 文档质量高但社区体量小得多
容器/K8s 生态 ingress-nginx 等久经考验 有 Ingress Controller 但成熟度和采用率较低
扩展方式 C 模块(需重新编译)、OpenResty/Lua、njs Go 插件生态,xcaddy 一条命令编译定制版本
二进制分发 包管理器,模块依赖发行版 单一静态二进制,跨平台部署极其省心
商业支持 Nginx Plus(F5) 官方赞助/商业授权

几个值得展开的点:

  • 扩展性:Caddy 的插件体验显著更好。xcaddy build --with github.com/... 一条命令就能编出带 Cloudflare DNS 验证、限流、安全模块的定制二进制。Nginx 编第三方 C 模块的痛苦,折腾过的人都懂(这也是 OpenResty 存在的原因)。
  • 配置即 API:Caddy 的本质是一个 JSON 配置引擎,Caddyfile 只是人类友好的前端。这让它天然适合被程序驱动——平台型产品动态增删站点不需要生成配置文件再 reload。
  • 久经考验:Nginx 的边缘案例处理、与各种奇怪客户端/上游的兼容性,是二十年生产流量喂出来的。保守的大型生产环境选它,不会有人质疑。

选型建议

选 Caddy,如果你是:

  • 个人项目、中小团队、初创公司——把省下来的证书运维时间拿去写业务
  • SaaS 平台需要客户自定义域名(On-Demand TLS 几乎是唯一省心方案)
  • 需要通过 API 动态管理大量站点配置
  • 团队没有专职运维,希望配置文件三行能看懂

选 Nginx,如果你是:

  • 已有大量 Nginx 配置和团队经验——迁移收益撑不起迁移成本
  • 极端高并发 / 边缘节点 / 对内存和尾延迟敏感的场景
  • 重度依赖 Kubernetes ingress-nginx 或 OpenResty/Lua 生态
  • 需要 Nginx Plus 的商业特性与支持,或所在组织要求”最保守的选择”

也可以都要:不少团队用 Caddy 做边缘 TLS 终结(享受自动证书),后面挂 Nginx/原有架构不动。架构上完全成立。

写在最后

Nginx 和 Caddy 的关系,有点像 Vim 和 VS Code:前者无所不能但要求你懂它,后者把 90% 的常见需求做成了开箱即用。2026 年的今天,对于新项目我会默认从 Caddy 开始——直到遇到它解决不了的问题再换,而这一天对大多数项目来说不会到来。但如果你手里已经有一套运转良好的 Nginx,请记住运维界的第一定律:If it works, don’t fix it.

评论
分享

评论