Caddy 常用功能配置文件模板
作者:Ake 发布于:2025年3月16日
通常使用 Caddyfile 对 Caddy 进行配置。该文件位于/etc/caddy/Caddyfile。
文件托管
example.com {
root * /var/www/html
file_server
# 可选:启用gzip压缩
encode gzip
}
托管单页面应用文件时记得加上try_files,不然前端会报错:
example.com {
root * /var/www/spa
file_server {
try_files {path} {path}/ /index.html
}
}
反向代理
app.example.com {
reverse_proxy localhost:3000
}
通常反向代理时,需要将一些信息添加到请求头中,或者重写请求头部分字段,这时可以使用header_up实现,如:
app.example.com {
reverse_proxy localhost:3000 {
header_up Host {host}
header_up X-Real-IP {remote}
}
}
或者可能需要重写请求路径,比如去掉/api前缀,这时可以使用rewrite实现,如:
app.example.com {
# {path:1}表示捕获第一个通配符后的内容(即去掉/api后的路径)
rewrite /api/* /{path:1}
reverse_proxy localhost:3000 {
header_up Host {host}
header_up X-Real-IP {remote}
}
}
针对这种去除前缀的场景,还有一种更直观的写法,使用strip_prefix指令,如:
app.example.com {
route /api/* {
uri strip_prefix /api
reverse_proxy localhost:3000 {
header_up Host {host}
header_up X-Real-IP {remote}
}
}
}
结合实现
当然,有些情况下可能需要将/api开头的请求转发到后端服务,而其他请求直接返回静态文件,这时可以使用route块分别处理实现,如:
example.com {
# Caddy按route块的定义顺序匹配请求。将/api/*的路由放在前面,可以确保它优先于静态文件路由被处理
route /api/* {
uri strip_prefix /api
reverse_proxy localhost:3000 {
header_up Host {host}
header_up X-Real-IP {remote}
}
}
# route块不指定路径时,默认匹配所有未命中其他路由的请求
route {
root * /var/www/html
file_server
encode gzip
}
}
配置完成后重启 Caddy 以使配置生效:
sudo systemctl reload caddy