说起 Web 服务器,大家第一反应可能还是 Nginx。Nginx 确实稳,但配置起来也是真的麻烦,尤其是配 HTTPS 证书的时候,又是找证书又是改配置。
今天聊聊 Caddy。这玩意儿在技术圈火了好几年了,虽然在超大规模并发下可能不如 Nginx 那么“硬”,但在中小型项目、个人博客或者内网开发环境里,它简直是“神仙工具”。
Caddy 是个啥?
简单来说,Caddy 是一个用 Go 语言写的开源 Web 服务器。
它最大的卖点就是 “省心”。它在设计之初就把“安全”和“自动化”刻在了骨子里。相比 Nginx 那种繁琐的配置文件,Caddy 的配置文件(Caddyfile)写起来就像是在写大白话。
核心功能点
默认开启 HTTPS:这是它最出名的功能。只要你给它一个域名,它能自动帮你从 Let's Encrypt 申请证书、配置 HTTPS、甚至连证书续期都帮你干了,全程零人工干预。
强大的反向代理:一行代码就能实现反代,支持负载均衡、健康检查、WebSocket 等。
高性能静态文件服务:自带高性能的
file_server。HTTP/3 原生支持:默认开启 HTTP/3(QUIC),不需要像 Nginx 那样还得折腾编译。
单二进制文件:没有任何复杂的依赖,丢进去就能跑。
搞起:Docker Compose 环境搭建
在 Docker 环境下玩 Caddy 是最爽的,持久化证书目录后,即便容器重启,证书也不会丢失。
1. 准备 docker-compose.yml
YAML
services:
caddy:
image: caddy:latest
container_name: caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp" # 为了支持 HTTP/3
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- ./data:/data # 存放自动申请的证书
- ./config:/config # 存放配置文件
- ./html:/srv # 映射本地静态文件
2. 准备 Caddyfile
在同级目录下新建一个 Caddyfile 文件。
需求实战:一个配置搞定所有
假设你现在有这么几个需求:
域名
example.com自动申请 HTTPS。访问
/api转发到另一个名为api-server的 Docker 容器(端口 8080)。访问
/admin需要输入账号密码(BaseAuth)。所有的
http://old.com都要重定向到https://example.com。访问
/files的时候,映射到你本地的/srv/static文件夹。
在 Caddy 里,你的配置文件长这样:
代码段
# 1. 自动申请证书 + 反代 + 认证
example.com {
# 开启 Gzip/Zstd 压缩,提高加载速度
encode zstd gzip
# 3. BaseAuth 认证(注意:密码必须是 Bcrypt 格式)
# 可以用命令生成:docker run --rm caddy caddy hash-password --plaintext 你的密码
basic_auth /admin/* {
admin JDJhJDE0JHFIemNsUjlwMUlZdGJ4di5hTkxSUDZHd2JTekRVdUgvR0dKdkN0RGdDSXFqUmhlIA==
}
# 2. 反代到其他 Docker 接口
# 假设 api-server 是你同一个网络下的容器名
reverse_proxy /api/* api-server:8080
# 5. 特殊链接映射本地文件
handle_path /files/* {
root * /srv/static
file_server browse
}
# 默认首页处理
handle {
root * /srv
file_server
}
}
# 4. 重定向处理
old.com {
redir https://example.com{uri}
}
重点解析:
Automatic HTTPS:只要你在开头写了域名,且服务器 80/443 端口是通的,Caddy 启动时就会自动去申请证书。
basic_auth:一定要记住,Caddy 不允许在配置文件里存明文密码。你得先用
caddy hash-password生成哈希值填进去。handle_path:这个指令很关键。它会自动剥离匹配到的前缀。比如你访问
example.com/files/1.jpg,它会去/srv/static/下找1.jpg,而不是找static/files/1.jpg。reverse_proxy:由于是在 Docker Compose 里,容器之间可以通过容器名通信,非常方便。