最开始建站的时候,不太会使用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文件的情况下直接展示目录的文件信息,默认是命令执行的文件目录
在有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是一个非常不错的选择。
评论前必须登录!
注册