Caddy服务器 		最开始建站的时候,不太会使用Nginx的部分配置,但是全站的所有子站点全部需要使用https协议,经过几番百度,最终发现了这个简单,轻量级的https服务器工具。最主要的就是它支持自动获取安全证书和自动更新证书。可用于静态资源托管和反向代理,虽然目前使用的是Nginx的443端口的转发配置。觉得是一个不错的小工具,还是可以小小的记录一下。
Caddy简介 官网地址 官网地址:https://caddyserver.com/ 
GitHub地址:https://github.com/caddyserver/caddy 
简介 官方的介绍说Caddy是一个功能强大、可扩展的平台,用Go编写,为您的网站、服务和应用程序提供服务。如果你是Caddy的新手,你为网络服务的方式即将改变。能够为你的任何网站自动获取和更新证书。是世界上最高级(最先进)的https服务器(他官网说的🤨)。
特点 对比Nginx复杂的配置,其独创的Caddyfile配置非常简单; 可以通过其提供的Admin API实现动态修改配置; 默认支持自动化HTTPS配置,能自动申请HTTPS证书并进行配置; 能够扩展到数以万计的站点; 可以在任意地方执行,没有额外的依赖; 采用Go语言编写,内存安全更有保证。
原文链接:https://blog.csdn.net/jks212454/article/details/129823335 
Caddy安装 		caddy的官方网站提供了很多平台的多种安装方式。其中包括Linux操作系统的多种版本:Debian、Ubuntu、 Raspbian、Fedora、RedHat、CentOS。还有window平台的Chocolatey和Scoop安装,还支持Ansible、docker安装等。同样支持源码安装。以下列举几个安装方式。
Linux centos yum Window Chocolatey 安装 docker安装 源码安装 
1 2 3 yum install -y yum-plugin-copr yum copr enable @caddy/caddy yum install -y caddy 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 # docker 或者是自行通过Dockerfile来构建一个caddy镜像 docker pull caddy docker run -d -p 8266:80  -v /data/caddy/data:/data  caddy # Docker Compose安装 version: '3.7' services:   caddy:     image: caddy     ports:       - "80:80"       - "443:443"     volumes:       - ./Caddyfile:/etc/caddy/Caddyfile       - caddy_data:/data       - caddy_config:/config     restart: unless-stopped volumes:   caddy_data:   caddy_config: 
通过源码安装的前置条件安装go1.20 or newer。
1 2 3 4 5 6 7 git clone "https://github.com/caddyserver/caddy.git" cd caddy/cmd/caddy/ go build # 可以根据需要运行的平台在做参数指定 GOOS=windows go build GOOS=linux GOARCH=arm GOARM=6 go build 
 
或者是根据官方提供的xcaddy方法去编译。或者是docker的images
 
Caddy使用 常用命令 通过使用caddy命令来查看caddy的二级命令,当然可以直接用 caddy 二级命令 –help 来查看耳机命令的使用方法和参数。
1 2 3 4 5 6 7 8 9 10 11 12 caddy run   #在前台启动caddy服务器 caddy start  #在后台去启动caddy服务器 caddy stop #去停止caddy服务进程 caddy upgrade #caddy版本更新 caddy version #查看caddy的版本 caddy validate #检查caddy的配置文件是否有效 caddy reload #重新加载配置文件(服务不需要停掉) caddy respond #一个简单的相应。在测试和开发环境用硬编码返回 例如:caddy respond  -b "hello" -l ':3000' 在访问3000端口时,服务器会直接返回“hello” caddy fmt #格式化caddyFile配置文件 caddy adapt caddy file-server #挂载静态目录 caddy reverse-proxy 
 
通过运行以下命令可以启动一个没有配置信息的caddy后台守护程序。
1 2 caddy run #该命令是在前台去启动caddy curl localhost:2019/config/  
 
2019端口不是您的网站,localhost:2019的管理端点用于控制Caddy。
 
Caddy.json配置 通过json格式的配置文件去配置caddy服务器。caddy.json内容如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 { 	"apps" :  {  		"http" :  {  			"servers" :  {  				"example" :  {  					"listen" :  [ ":2015" ] ,  					"routes" :  [  						{  							"handle" :  [ {  								"handler" :  "static_response" ,  								"body" :  "Hello, world!"  							} ]  						}  					]  				}  			}  		}  	}  } 
 
通过admin API 来使caddy.json配置生效,或者是直接重新加载caddy.json配置文件。
1 2 curl localhost:2019/load -H "Content-Type: application/json" -d @caddy.json caddy reload --config caddy.json 
 
此时通过访问https://localhost:2015端口就可以看到  “Hello, world!”了,当然也可以在启动caddy的时候就加载caddy.json配置文件。如下即可,或者是直接重新加载caddy.json
1 caddy run --config caddy.json 
 
Caddyfile配置 Caddyfile配置文件的信息可以直接写进/root/.config/caddy/autosave.json配置文件中,在caddy启动的时候会默认读取autosave.json配置文件。内容信息如下
1 2 :2020  #caddy监听的端口号 respond "Hello, world!" #响应体 
 
配置文件编写完成后,通过以下命令使Caddyfile配置预生效。
1 2 caddy adapt   #Caddyfile配置文件与运行命令所在目录相同 caddy adapt --config /path/to/Caddyfile  #指定Caddyfile所在目录 
 
caddy  reload服务器,可以看到配置生效。当然也可以直接在启动caddy的时候去直接加载Caddyfile配置文件
1 caddy start --config ~/Caddyfile  #在启动时如果提示不能用Caddyfile启动,那就加上--adapt参数。 
 
虽然caddy可以同时加载多个配置文件,但是官方建议我们使用json+admin api的形式 或者是 caddyfile + cli命令行的形式。
 
多站点配置 caddy.json配置 Caddyfile配置 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 {         "apps" :  {              "http" :  {                  "servers" :  {                      "hello" :  {                          "listen" :  [ ":2015" ] ,                          "routes" :  [                              {                                  "handle" :  [ {                                      "handler" :  "static_response" ,                                      "body" :  "Hello, world!"                                  } ]                              }                          ]                      } ,                      "caddy" :  {                          "listen" :  [ ":2025" ] ,                          "routes" :  [                              {                                  "handle" :  [ {                                      "handler" :  "static_response" ,                                      "body" :  "Hello, world! 2025"                                  } ]                              }                          ]                      }                  }              }          }  } curl localhost: 2019 /load -H "Content-Type: application/json"  -d @caddy.json #使配置生效 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 localhost { 	respond "Hello, world!" } localhost:2016 { 	respond "Goodbye, world!" } curl localhost:2019/load -H "Content-Type: text/caddyfile" --data-binary @Caddyfile #使配置生效 #或者是 caddy reload #通过以下命令检验配置是否生效 curl https://localhost:2016 curl https://localhost 
 
静态文件配置 官方提供了两种挂载静态目录的方法,一种的使用命令行直接挂载,一种是使用Caddyfile文件挂载静态目录。
通过命令行挂载目录 在Caddyfile中配置 
通过caddy file-server –help 可以查看命令行的挂载目录的参数。
1 2 3 4 5 6 7 8 -a, --access-log      #启动访问日志 -b, --browse          #在找不到index文件的情况下直接展示目录的文件信息,默认是命令执行的文件目录 -v, --debug           #开启debug日志 -d, --domain string   #绑定域名信息 -h, --help            #帮助 -l, --listen string   #绑定监听的端口号 -r, --root string     #静态文件目录路径 -t, --templates       #启动模板渲染 
 
以上就是命令行的参数信息。在命令行中,就可以轻松去运行一个https的站点。
1 caddy file-server --browse -l ":3000" -r /root/caddy  
 
通过以上命令就可以将/root/caddy目录挂载到服务器上了.–browse在找不到index文件的情况下直接展示目录的文件信息,默认是命令执行的文件目录
在有index文件的情况下就直接渲染静态文件目录中的页面信息。和–root直接挂载静态文件目录是一个效果
1 2 caddy file-server -b -l ":3000" -r /root/public #或 caddy file-server -l ":3000" -r /root/public 
 
public 是我的一个静态页面站点
 
但是在命令行运行file-server是前台运行的,可以在测试中使用。
官方还提供了一种方式就是使用Caddyfile的方式去配置挂载静态目录。在你的站点文件根目录  下去创建一个Caddyfile 内容如下。
 
配置完成后以后,在站点所在目录去重启caddy。curl localhost:2019/config/  可以看到多了一条配置如下。访问3000端口可以看到静态网站被启动起来。
1 2 2024/12/25 02:00:37.050	INFO	admin.api	received request	{"method": "GET", "host": "localhost:2019", "uri": "/config/", "remote_ip": "127.0.0.1", "remote_port": "54202", "headers": {"Accept":["*/*"],"User-Agent":["curl/7.29.0"]}} {"apps":{"http":{"servers":{"srv0":{"listen":[":3000"],"routes":[{"handle":[{"handler":"file_server","hide":["./Caddyfile"]}]}]}}}}} 
 
当然如果只需要展示文件目录信息的话可以添加browse参数,如下:
1 2 :3000 file_server browse 
 
也可以使用root参数去挂载一个静态站点的目录,如下:
1 2 3 :3000 root * /var/www/mysite file_server 
 
代理配置 代理在caddy中也是非常简单就可以去实现。官方同样是提供了命令行和Caddyfile两种方式。
通过命令行配置代理 Caddyfile配置代理 
通过 
1 2 3 4 5 6 7 8 9 10 11   --access-log            #启动访问日志 -c, --change-host-header    #主机标头重置为后端标头默认情况下,Caddy 会原封不动地传递所有 HTTP 标头,包括 Host ,并且 Caddy 从 Host 标头派生 TLS ServerName。将 --change-host-header 主机标头重置为后端标头,以便 TLS 握手可以成功完成。 -v, --debug                 #启动debug日志 -r, --disable-redirects     #禁用 HTTP->HTTPS 重定向 -f, --from string           #接收的主机或端口 -d, --header-down strings   #设置返回客户端的响应头 -H, --header-up strings     #设置要发送到上游的请求标头(格式:“Field:value”) -h, --help                  #帮助信息     --insecure              #禁用安全检验 -i, --internal-certs        #使用内部ca颁发安全证书 -t, --to strings            #转发的主机或端口 
 
简单的端口转发
1 caddy reverse-proxy --from :2080 --to :9000 
 
从域名到端口
1 caddy reverse-proxy --from example.com --to :3000 
 
在Caddyfile中详细去介绍具体的使用。
示例配置如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 example.com {     reverse_proxy 127.0.0.1:8080 #这里输入你想反代的服务器IP和端口     reverse_proxy backend1:3000 backend2:3000 #负载均衡     redir https://a.example.com{uri} #重定向     encode gzip     #自定义错误页面     handle_errors {         respond 404 "Sorry, the page was not found" 404     }     #速率限制     rate_limit {         zone rate_limit 10r/s     }     #访问日志     log {         output file /var/log/caddy/access.log         format json     }     #错误日志     log {         output file /var/log/caddy/error.log     } } 
 
通过指定多个后端服务器来实现负载均衡。Caddy 会自动在这些服务器之间分配流量。
1 2 3 4 5 example.com {     reverse_proxy backend1:3000 backend2:3000 {         lb_policy round_robin     } } 
 
配置不同的路由和重定向规则。
1 2 3 4 5 6 7 8 9 10 example.com {     reverse_proxy /api/* localhost:3001     reverse_proxy /app/* localhost:3002     redir /old-path /new-path 301 } #可以根据请求的路径将请求代理到不同的服务。 example.com {     reverse_proxy /service1/* localhost:3001     reverse_proxy /service2/* localhost:3002 } 
 
反向代理请求中添加或修改 HTTP 头。
1 2 3 4 5 6 example.com {     reverse_proxy localhost:3000 {         header_up X-Forwarded-For {remote}         header_up X-Real-IP {remote}     } } 
 
获取客户端的真实ip
header_up:用于将请求头信息添加到代理请求中。
X-Real-IP:直接传递客户端的 IP 地址。
X-Forwarded-For:包含客户端的 IP 地址链,允许后端识别原始客户端 IP。
X-Forwarded-Proto:指示原始请求的协议(HTTP 或 HTTPS)
1 2 3 4 5 6 7 example.com {     reverse_proxy localhost:3000 {         header_up X-Real-IP {remote}         header_up X-Forwarded-For {remote}         header_up X-Forwarded-Proto {scheme}     } } 
 
caddy服务器的配置比起Nginx来说还是简单不少。尽管在博客实际使用的过程中,我并没有用到caddy,但是对于想搭建一个服务器的但又苦恼于Nginx复杂配置来说。caddy是一个非常不错的选择。