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是一个非常不错的选择。