Caddy、nginx、Apache 配置对比:同一站点,三种写法
Caddy、nginx、Apache httpd 都能服务静态文件、终止 TLS、反向代理到后端。差别最大的是配置语言,以及有多少配置根本不用写。以下基于 Caddy v2.11.4、nginx 1.31.3 mainline、Apache httpd 2.4.68,全部跑官方 alpine 镜像。
三个项目的底色
| Caddy | nginx | Apache httpd | |
|---|---|---|---|
| 许可证 | Apache 2.0 | 2-clause BSD | Apache 2.0 |
| 发布方 | ZeroSSL(HID Global) | F5 | Apache 软件基金会 |
| 当前版本 | v2.11.4(2026-06-03) | mainline 1.31.3 / stable 1.30.4 | 2.4.68(2026-06-08) |
| 发布线 | 单线 | mainline 每 1–2 月、stable 约每年 | 2.4.x |
配置语言本身
Caddy 的原生格式是 JSON——任何其他格式都由 config adapter 转成 JSON,Caddyfile 就是标准构建里的那个 adapter。caddy adapt 打印转换结果:Caddyfile 里 example.com { root /var/www/html; file_server } 展开成一棵 JSON 路由树(监听 443、host 匹配、vars 设 root、file_server handler)。JSON 才是服务器真正运行的,Caddyfile 只是产出它的一种方式。
nginx 是指令文件:简单指令以分号结尾,块指令用花括号。能含其他指令的块叫 context(events、http、server、location)。指令只在当前层缺失时才从外层继承。
Apache 也是指令文件,用容器节(<VirtualHost>、<Directory>、<Location>、<If> 等)限定作用域。节按固定组顺序合并:<Directory>(连同 .htaccess)→ <DirectoryMatch> → <Files>/<FilesMatch> → <Location>/<LocationMatch> → <If> 最后。所以 <Location> 永远在 <Directory> 之后应用。
文件顺序的意义各不相同
- Caddy:文件顺序基本被忽略。adapter 把 HTTP handler 指令排进固定内建顺序,同名指令按 matcher 具体程度排序;route 块内保持书写顺序;插件指令不在内建顺序里,需要 order 全局选项或 route 块指定位置。
- nginx:文件顺序决定哪个正则 location 先试。先查前缀 location 并保留最长匹配,然后按出现顺序试正则 location、取第一个命中;都不中则用保留的前缀。最长前缀加
^~跳过正则步骤,=精确匹配直接停止搜索。 - Apache:文件顺序在组内决定、跨组不决定。
<Directory>组内是特例:最短路径优先(/var/web/dir先于/var/web/dir/subdir),文件顺序只在同名目录的节之间起作用。
请求匹配:每个服务器恰好选一个块
- Caddy:地址最具体的 site block 处理请求,其他 site block 不应用。
- nginx:server_name 按固定顺序匹配——精确名 → 星号开头的通配 → 星号结尾的通配 → 第一个匹配的正则;都不中走该地址端口的默认 server。
- Apache:恰好选一个
<VirtualHost>,其他匹配虚拟主机的指令永不合并进来。
同一站点三种写法
站点需求:从目录服务静态文件、/api/ 反代到 127.0.0.1:8080(保留客户端 Host、设 X-Forwarded-For/Proto)、终止 HTTPS、HTTP 301 到 HTTPS、压缩文本响应、写访问日志。
Caddy(约 10 行,TLS 自动、压缩/日志内置):
example.com {
root /var/www/html
encode
reverse_proxy /api/* 127.0.0.1:8080
file_server
log { output file /var/log/caddy/access.log }
}
nginx(约 45 行):worker/events/http 三层 context、mime 与 gzip 配置、80 端口 301 server + 443 端口 ssl server、location /api/ 里四条 proxy_set_header。TLS 证书要自己生成管理。
Apache(约 55 行):先 LoadModule 一长串模块(ssl/proxy/deflate/headers…)、ServerName/日志格式、<Directory "/"> 全局拒绝、两个 <VirtualHost>(80 重定向 + 443 SSL)、AddOutputFilterByType 压缩等。
选型要点
- 默认安全与自动化的 TLS:Caddy 明显领先——自动 HTTPS 证书获取/续期是内置的,nginx/Apache 要自己管 certbot。
- 配置规模与心智负担:同一需求 Caddy ~10 行 vs nginx ~45 行 vs Apache ~55 行;nginx 的正则 location 匹配顺序与 Apache 的组顺序是需要背的规则,Caddy 的"adapter 排序 + 最具体优先"更可预测。
- 生态与既有资产:nginx 的 location/rewrite 生态与教程存量最大,Apache 的 .htaccess 与模块化历史最久(也最繁琐);Caddy 适合新项目与个人站,JSON 配置可编程化能力强。
- 性能:三者在常规负载下差距不大,nginx 高并发下历史口碑最好,但配置复杂度才是日常真正的成本。
来源:Comparing Caddy, nginx and Apache Configuration - DEV Community