适用场景:Ubuntu/Debian 服务器,使用 Caddy 为本地服务配置反向代理 + 自动 HTTPS 证书。


一、安装 Caddy

sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl

curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' \
  | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg

curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' \
  | sudo tee /etc/apt/sources.list.d/caddy-stable.list

sudo apt update && sudo apt install caddy

安装完成后 Caddy 会自动注册为 systemd 服务并启动。


二、配置反向代理

编辑 Caddyfile:

sudo nano /etc/caddy/Caddyfile

将原有内容(默认有80端口的规则删除)替换为:

your.domain.com {
    reverse_proxy 127.0.0.1:端口号
}

例如代理本地 6743 端口的服务:

xxx.example.com {
    reverse_proxy 127.0.0.1:6743
}

保存后重载配置:

sudo systemctl reload caddy

Caddy 会自动申请并续期 Let's Encrypt 证书,无需任何额外配置。


三、防火墙放行端口

确保服务器放行 80 和 443 端口(ACME 验证和 HTTPS 访问必须):

# iptables
# 在 INPUT 链第 3 行插入一条规则:放行所有来源的 TCP 443 端口入站流量,具体第几行,端口号可自行修改。
sudo iptables -I INPUT 4 -p tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT 3 -p tcp --dport 443 -j ACCEPT


#查看所有端口
sudo iptables -L INPUT --line-numbers

#例如删除规则第3条
sudo iptables -D INPUT 3 

云服务器还需在控制台安全组中放行 80 和 443 入站规则。


四、Cloudflare 域名托管注意事项

如果域名使用了 Cloudflare,证书申请有两种方案:

方案 A:关闭 Cloudflare 代理(推荐)

在 Cloudflare DNS 面板将对应记录的云朵图标设为灰色(仅 DNS 模式),等待几分钟后 Caddy 自动完成 HTTP-01 验证并获取证书。证书申请成功后可按需开启代理。

方案 B:保留橙云,使用 DNS-01 验证

需要安装带 Cloudflare DNS 插件的 Caddy:

# 停止服务
sudo systemctl stop caddy

#下载带Cloudflare插件的Caddy替换已有安装的caddy,amd64 换成 arm64 就适配 ARM 机器
curl -fsSL "https://caddyserver.com/api/download?os=linux&arch=amd64&p=github.com%2Fcaddy-dns%2Fcloudflare" \
  -o caddy && chmod +x caddy && sudo mv caddy /usr/bin/caddy

#查看插件,正常应该显示有dns.providers.cloudflare
caddy list-modules | grep cloudflare

#重启服务
sudo systemctl start caddy

Caddyfile 配置:

#对于CF代理的域名,可添加tls字段
your.domain.com {
    reverse_proxy 127.0.0.1:端口号
    tls {
        dns cloudflare {env.CF_API_TOKEN}
        resolvers 1.1.1.1 #可选添加
    }
}
#或者通过下面,对所有的生效
*.domain.com {
    tls {
        dns cloudflare {env.CF_API_TOKEN}
        resolvers 1.1.1.1 #可选添加
    }
}

同时设置 Cloudflare API Token 环境变量:

sudo systemctl edit caddy

添加:

[Service]
Environment="CF_API_TOKEN=你的CF_API_Token"

保存后:

sudo systemctl daemon-reload && sudo systemctl restart caddy

五、多个服务同时反代

Caddyfile 支持配置多个站点块,直接追加即可:

komari.example.com {
    reverse_proxy 127.0.0.1:14753
}

blog.example.com {
    reverse_proxy 127.0.0.1:8090
}

api.example.com {
    reverse_proxy 127.0.0.1:3000
}

六、常用管理命令

# 查看运行状态
sudo systemctl status caddy

# 重载配置(不中断服务)
sudo systemctl reload caddy

# 重启服务
sudo systemctl restart caddy

# 实时查看日志
journalctl -u caddy -f

# 验证配置文件语法
caddy validate --config /etc/caddy/Caddyfile