说实话,我用 Nginx 用了好多年,个人项目、客户网站、生产服务器都在用。一旦摸透了那些配置文件的门道,确实挺好用的,而且超级稳定。
但是几年前我遇到了 Caddy,瞬间被它的简单给震撼了:
从那之后,我就再也没部署过 Nginx。
看看这个完整的、能用于生产环境的反向代理配置:
api.myapp.com {
reverse_proxy localhost:3000
}
就这样,三行代码!包含了:
我第一次看到这个配置时简直不敢相信:SSL 配置呢?证书路径呢?各种复杂的参数呢?
答案是:不需要,Caddy 全部自动搞定。
假设你有个跑在 3000 端口的 API:
import { Hono } from 'hono';
const app = new Hono();
app.get('/api/health', (c) => {
return c.json({ status: 'ok', timestamp: new Date() });
});
app.post('/api/data', async (c) => {
const body = await c.req.json();
return c.json({ received: body });
});
要让它支持 HTTPS、自定义域名,只需要:
api.yourapp.com {
reverse_proxy localhost:3000
}
caddy start
完事!你的 API 现在就能通过 https://api.yourapp.com
访问了,而且:
api.yourapp.com {
reverse_proxy localhost:3000
}
app.yourapp.com {
reverse_proxy localhost:3001
}
admin.yourapp.com {
reverse_proxy localhost:3002
basicauth {
admin $2a$14$Zkx19XL...
}
}
每个域名自动获得独立的 SSL 证书,想给管理后台加个密码验证?一行代码搞定。
api.yourapp.com {
reverse_proxy localhost:3000 localhost:3001 localhost:3002 {
lb_policy round_robin
health_uri /health
health_interval 10s
}
}
自动轮询分发请求,每 10 秒检查服务器健康状态,挂了的自动踢出去。
*.yourapp.com {
reverse_proxy localhost:3000
}
一行代码搞定所有子域名,特别适合 SaaS 应用,每个客户一个子域名。
不需要任何特殊配置,Caddy 自动识别 WebSocket 请求并正确处理。
这个功能我特别喜欢!你可以在本地用 .local
域名跑 HTTPS:
/etc/hosts
:127.0.0.1 api.myapp.local
127.0.0.1 app.myapp.local
api.myapp.local {
reverse_proxy localhost:3000
}
app.myapp.local {
reverse_proxy localhost:3001
}
caddy run --watch
现在你本地开发就有了:
测试 webhook、OAuth 什么的再也不用担心 HTTPS 问题了。
什么时候还是得用 Nginx:
但对于我们大部分人来说,Caddy 真的简单太多了。
# Ubuntu/Debian
sudo apt install caddy
FROM caddy:alpine
COPY Caddyfile /etc/caddy/Caddyfile
localhost:8080 {
respond "Hello, Caddy!"
}
运行 caddy run
,打开 http://localhost:8080
,你就在用 Caddy 了!
这周找个最简单的项目试试 Caddy,就一个服务就行。我敢打赌你会惊讶于:
试试吧,我觉得你会和我一样,再也不想回到 Nginx 了。
有时候,最好的工具不是功能最多的,而是让你最省心的。