参考资料
目录
- [一. 前期准备](#一. 前期准备)
-
- [1.1 简介](#1.1 简介)
- [1.2 安装依赖](#1.2 安装依赖)
- [1.3 创建配置目录](#1.3 创建配置目录)
- [1.4 创建caddy用户和组](#1.4 创建caddy用户和组)
- [1.5 为配置目录设置权限](#1.5 为配置目录设置权限)
- [二. 配置caddy](#二. 配置caddy)
-
- [2.1 下载](#2.1 下载)
- [2.2 编辑配置文件](#2.2 编辑配置文件)
- [2.3 检查配置文件](#2.3 检查配置文件)
- [2.4 配置service](#2.4 配置service)
- [2.5 配置caddy用户绑定443端口](#2.5 配置caddy用户绑定443端口)
- [三. 启动](#三. 启动)
一. 前期准备
1.1 简介
🔷Caddy 是一款开源的、默认启用 HTTPS 的 Web 服务器,使用 Go 语言编写。最大的特点是配置简单,自动 HTTPS,当检测到用户配置了域名之后,Caddy会自动:
- 申请 TLS/SSL 证书
- 完成 HTTPS 配置
- 自动续期
- 监听 HTTPS
| Caddy | Nginx | |
|---|---|---|
| Web 服务器 | ✅ | ✅ |
| 反向代理 | ✅ | ✅ |
| HTTPS | ✅ | ✅ |
| 自动申请证书 | ⭐ 非常方便 | 需要额外配置 |
| 自动续期 | ✅ | 通常需要 Certbot 等 |
| 配置文件 | Caddyfile 很简单 | nginx.conf 较复杂 |
| 性能 | 很好 | 非常好 |
| 学习成本 | 较低 | 较高 |
| Go 编写 | ✅ | C 编写 |
1.2 安装依赖
🔷caddy运行依赖于定时任务,因此需要安装cron
- Amazon Linux / RHEL系
bash
sudo yum install cronie -y
sudo systemctl enable --now crond
- Ubuntu / Debian系
bash
sudo apt install cron -y
sudo systemctl enable --now cron
| 系统 | 安装包 | systemd 服务 |
|---|---|---|
| Amazon Linux / RHEL | cronie |
crond |
| Ubuntu / Debian | cron |
cron |
1.3 创建配置目录
bash
# 存放静态页面
sudo mkdir -p /data/www/default
# 存放配置文件
sudo mkdir -p /etc/caddy/
sudo mkdir -p /etc/caddy/conf.d/
# caddy用户目录
sudo mkdir -p /var/lib/caddy/
# 存放log
sudo mkdir -p /var/log/caddy/
1.4 创建caddy用户和组
- 创建系统组caddy,该组只是为了运行caddy中间件
- 因为caddy用户只是为了运行caddy中间件而已,所以设置为系统用户,并且禁止使用shell进行登录
bash
sudo groupadd --system caddy
sudo useradd --system --gid caddy --create-home --home-dir /var/lib/caddy --shell /usr/sbin/nologin caddy
1.5 为配置目录设置权限
bash
sudo chown -R caddy:caddy /var/log/caddy/
sudo chown -R caddy:caddy /var/lib/caddy/
sudo chown -R caddy:caddy /data/www/default/
二. 配置caddy
🔷为了更好的学习,本文采用手动安装的方式
2.1 下载
https://caddyserver.com/api/download?os=linux\&arch=amd64
bash
# 下载
[ec2-user@ip-172-31-25-58 ~]$ curl -L https://caddyserver.com/api/download?os=linux\&arch=amd64 -o caddy
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 46980k 0 46980k 0 0 13515k 0 --:--:-- 0:00:03 --:--:-- 13511k
[ec2-user@ip-172-31-25-58 ~]$
[ec2-user@ip-172-31-25-58 ~]$ ls -l
-rw-r--r--. 1 ec2-user ec2-user 48107682 Sep 1 09:44 caddy
# 赋予执行权限
[ec2-user@ip-172-31-25-58 ~]$ chmod +x caddy
[ec2-user@ip-172-31-25-58 ~]$ sudo mv caddy /usr/bin/caddy
[ec2-user@ip-172-31-25-58 ~]$
[ec2-user@ip-172-31-25-58 ~]$ ls -l /usr/bin/caddy
-rwxr-xr-x. 1 ec2-user ec2-user 48107682 Sep 1 09:44 /usr/bin/caddy
# 查看版本
[ec2-user@ip-172-31-25-58 ~]$ caddy version
v2.11.4 h1:XKxkMTgNSizEvKG6QHue6cAsFOteU2qA61w2tKkCWi0=
2.2 编辑配置文件
Caddyfile总配置文件- 💥注意,使用tab空格,而不是四个space
bash
[ec2-user@ip-172-31-25-58 ~]$ cat /etc/caddy/Caddyfile
{
admin off
}
:80 {
# 设置网站的根目录
root * /data/www/default
# 开启压缩
encode gzip
# 开启静态文件服务
file_server {
index index.html
}
# 日志配置
log {
output file /var/log/caddy/access.log
}
}
# 导入配置文件
import /etc/caddy/conf.d/*.conf
[ec2-user@ip-172-31-25-58 ~]$
[ec2-user@ip-172-31-25-58 ~]$ cat /data/www/default/index.html
<h1>Hello World</h1>
[ec2-user@ip-172-31-25-58 ~]$
- 配置根路径重定向
- 当访问
fengyehong.dpdns.org时,重定向到fengyehong.dpdns.org/mw
- 当访问
- 面板运行在A服务器的8080端口,而订阅节点运行在A服务器的2096端口
- 不想让服务器暴露太多端口,因此设置域名反向代理
- 将一个域名指向代理服务器(如 Nginx 或 caddy),由代理服务器接收用户的访问请求
- 再转发到内网或不同端口的实际后端服务器
fengyehong.dpdns.org走的是 8080端口fengyehong.dpdns.org/xv/*和fengyehong.dpdns.org/data/*走的是 2096端口
bash
[ec2-user@ip-172-31-25-58 ~]$ cat /etc/caddy/conf.d/fengyehong.dpdns.org.conf
fengyehong.dpdns.org {
encode gzip
# 根路径重定向到 /mw 路径
redir / /mw 302
# 3X-UI 常规订阅
handle /xv/* {
reverse_proxy 127.0.0.1:2096
}
# 3X-UI JSON订阅
handle /data/* {
reverse_proxy 127.0.0.1:2096
}
# 3X-UI 面板
handle {
reverse_proxy 127.0.0.1:8080
}
# 日志配置
log {
output file /var/log/caddy/fengyehong_access.log {
roll_size 60mb
roll_keep 3
roll_keep_for 7d
}
}
}
[ec2-user@ip-172-31-25-58 ~]$
2.3 检查配置文件
bash
[ec2-user@ip-172-31-25-58 ~]$ sudo caddy validate --config /etc/caddy/Caddyfile
2026/09/03 10:28:26.983 INFO using config from file {"file": "/etc/caddy/Caddyfile"}
2026/09/03 10:28:26.985 INFO adapted config to JSON {"adapter": "caddyfile"}
2026/09/03 10:28:26.986 INFO http.auto_https server is listening only on the HTTPS port but has no TLS connection policies; adding one to enable TLS {"server_name": "srv0", "https_port": 443}
2026/09/03 10:28:26.986 INFO http.auto_https enabling automatic HTTP->HTTPS redirects {"server_name": "srv0"}
2026/09/03 10:28:26.986 WARN http.auto_https server is listening only on the HTTP port, so no automatic HTTPS will be applied to this server {"server_name": "srv1", "http_port": 80}
2026/09/03 10:28:26.987 INFO tls.cache.maintenance started background certificate maintenance {"cache": "0x9cbd10fa880"}
2026/09/03 10:28:26.987 INFO http servers shutting down with eternal grace period
2026/09/03 10:28:26.987 INFO tls.cache.maintenance stopped background certificate maintenance {"cache": "0x9cbd10fa880"}
Valid configuration
[ec2-user@ip-172-31-25-58 ~]$
2.4 配置service
bash
[ec2-user@ip-172-31-25-58 ~]$ cat /etc/systemd/system/caddy.service
[Unit]
Description=Caddy
Documentation=https://caddyserver.com/docs/
After=network.target network-online.target
Requires=network-online.target
[Service]
Type=notify
User=caddy
Group=caddy
ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/Caddyfile
ExecReload=/usr/bin/caddy reload --config /etc/caddy/Caddyfile
TimeoutStopSec=5s
LimitNOFILE=1048576
PrivateTmp=true
ProtectSystem=full
ProtectHome=true
[Install]
WantedBy=multi-user.target
[ec2-user@ip-172-31-25-58 ~]$
2.5 配置caddy用户绑定443端口
- Linux默认规定root之外的用户不能直接绑定1024以下的端口,但是caddy用户运行caddy服务的时候需要却需要监听系统的443端口
- 可以给caddy用户添加
capability中的cap_net_bind_service,允许绑定1024以下的端口
bash
[ec2-user@ip-172-31-25-58 ~]$ sudo setcap cap_net_bind_service=+ep /usr/bin/caddy
[ec2-user@ip-172-31-25-58 ~]$
[ec2-user@ip-172-31-25-58 ~]$ getcap /usr/bin/caddy
/usr/bin/caddy cap_net_bind_service=ep
[ec2-user@ip-172-31-25-58 ~]$
三. 启动
- 启动
bash
# 加载配置
sudo systemctl daemon-reload
# 开启启动并立马重新启动
sudo systemctl enable --now caddy
# 重新启动
sudo systemctl restart caddy
- 查看状态
bash
[ec2-user@ip-172-31-25-58 ~]$ systemctl status caddy | head -n 11
● caddy.service - Caddy
Loaded: loaded (/etc/systemd/system/caddy.service; enabled; preset: disabled)
Active: active (running) since Wed 2026-09-02 17:04:44 JST; 1 day 2h ago
Docs: https://caddyserver.com/docs/
Main PID: 240435 (caddy)
Tasks: 9 (limit: 1059)
Memory: 13.3M
CPU: 12.787s
CGroup: /system.slice/caddy.service
└─240435 /usr/bin/caddy run --environ --config /etc/caddy/Caddyfile
[ec2-user@ip-172-31-25-58 ~]$
- 查看端口占用情况
bash
[ec2-user@ip-172-31-25-58 ~]$ sudo ss -lntp | grep caddy
LISTEN 0 4096 *:443 *:* users:(("caddy",pid=240435,fd=4))
LISTEN 0 4096 *:80 *:* users:(("caddy",pid=240435,fd=9))
[ec2-user@ip-172-31-25-58 ~]$