云计算百科
云计算领域专业知识百科平台

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

yum install -y yum-plugin-copr
yum copr enable @caddy/caddy
yum install -y caddy

Window操作系统Chocolatey 安装

choco install caddy

docker安装

#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。

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 来查看耳机命令的使用方法和参数。

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后台守护程序。

caddy run #该命令是在前台去启动caddy
curl localhost:2019/config/

2019端口不是您的网站,localhost:2019的管理端点用于控制Caddy。

Caddy.json配置

通过json格式的配置文件去配置caddy服务器。caddy.json内容如下

{
"apps": {
"http": {
"servers": {
"example": {
"listen": [":2015"],
"routes": [
{
"handle": [{
"handler": "static_response",
"body": "Hello, world!"
}]
}
]
}
}
}
}
}

通过admin API来使caddy.json配置生效,或者是直接重新加载caddy.json配置文件。

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

caddy run –config caddy.json

Caddyfile配置

Caddyfile配置文件的信息可以直接写进/root/.config/caddy/autosave.json配置文件中,在caddy启动的时候会默认读取autosave.json配置文件。内容信息如下

:2020 #caddy监听的端口号
respond "Hello, world!" #响应体

配置文件编写完成后,通过以下命令使Caddyfile配置预生效。

caddy adapt #Caddyfile配置文件与运行命令所在目录相同
caddy adapt –config /path/to/Caddyfile #指定Caddyfile所在目录

caddy reload服务器,可以看到配置生效。当然也可以直接在启动caddy的时候去直接加载Caddyfile配置文件

caddy start –config ~/Caddyfile #在启动时如果提示不能用Caddyfile启动,那就加上–adapt参数。

虽然caddy可以同时加载多个配置文件,但是官方建议我们使用json+admin api的形式 或者是 caddyfile + cli命令行的形式。

多站点配置

caddy多站点配置 caddy.json配置

{
"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 #使配置生效

Caddyfile配置

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文件挂载静态目录。

通过命令行挂载目录

通过caddy file-server –help 可以查看命令行的挂载目录的参数。

-a, –access-log #启动访问日志
-b, –browse #在找不到index文件的情况下直接展示目录的文件信息,默认是命令执行的文件目录
-v, –debug #开启debug日志
-d, –domain string #绑定域名信息
-h, –help #帮助
-l, –listen string #绑定监听的端口号
-r, –root string #静态文件目录路径
-t, –templates #启动模板渲染

以上就是命令行的参数信息。在命令行中,就可以轻松去运行一个https的站点。

caddy file-server –browse -l ":3000" -r /root/caddy

通过以上命令就可以将/root/caddy目录挂载到服务器上了.–browse在找不到index文件的情况下直接展示目录的文件信息,默认是命令执行的文件目录

image-20241225092220946

在有index文件的情况下就直接渲染静态文件目录中的页面信息。和–root直接挂载静态文件目录是一个效果

caddy file-server -b -l ":3000" -r /root/public #或
caddy file-server -l ":3000" -r /root/public

public 是我的一个静态页面站点

但是在命令行运行file-server是前台运行的,可以在测试中使用。

在Caddyfile中配置

官方还提供了一种方式就是使用Caddyfile的方式去配置挂载静态目录。在你的站点文件根目录下去创建一个Caddyfile 内容如下。

:3000
file_server

配置完成后以后,在站点所在目录去重启caddy。curl localhost:2019/config/ 可以看到多了一条配置如下。访问3000端口可以看到静态网站被启动起来。

2024/12/25 02:00:37.050INFOadmin.apireceived 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参数,如下:

:3000
file_server browse

也可以使用root参数去挂载一个静态站点的目录,如下:

:3000
root * /var/www/mysite
file_server

代理配置

代理在caddy中也是非常简单就可以去实现。官方同样是提供了命令行和Caddyfile两种方式。

通过命令行配置代理

–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 #转发的主机或端口

简单的端口转发

caddy reverse-proxy –from :2080 –to :9000

从域名到端口

caddy reverse-proxy –from example.com –to :3000

在Caddyfile中详细去介绍具体的使用。

Caddyfile配置代理

示例配置如下。

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 会自动在这些服务器之间分配流量。

example.com {
reverse_proxy backend1:3000 backend2:3000 {
lb_policy round_robin
}
}

配置不同的路由和重定向规则。

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 头。

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)

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

赞(0)
未经允许不得转载:网硕互联帮助中心 » Caddy服务器
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!