前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Caddy的简单用法

Caddy的简单用法

作者头像
陳斯托洛夫斯記
发布2024-08-07 12:40:43
1170
发布2024-08-07 12:40:43
举报
文章被收录于专栏:XBD

Caddy 是一个强大的、企业级的、开源的 web 服务器,使用 go 语言编写,并且可以自动配置 管理HTTPS

安装

Ubuntu 安装

代码语言:javascript
复制
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo apt-key add -
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy

RHEL 安装

代码语言:javascript
复制
# RHEL 7 安装
yum install yum-plugin-copr
yum copr enable @caddy/caddy
yum install caddy

# RHEL 8 安装
dnf install 'dnf-command(copr)'
dnf copr enable @caddy/caddy
dnf install caddy

使用

托管网站

代码语言:javascript
复制
caddy file-server --root ~/mysite
# file-server:是 caddy 子命令,表示要启动一个文件服务的意思
# --root:表示以哪个目录作为文件服务的根目录,也就是网站根目录

# 现在可以通过 localhost 来访问网站
caddy file-server --root ~/mysite --domain localhost

# 现在可以通过域名 www.xx.com 来访问网站
caddy file-server --root ~/mysite --domain www.xx.com

命令行参数

语法

代码语言:javascript
复制
# Caddy 是一个标准的 unix-like 命令,基本用法为:
# command 是 caddy 的子命令,子命令是必须的,不能省略
# args 是子命令的参数,可以是0个,也可以是多个
caddy <command> [<args...>]

run 命令

run 命令会运行一个前台 caddy 进程,直到用 ctrl+c 或关闭终端退出

代码语言:javascript
复制
# caddy help run

usage:
  caddy run [--config <path> [--adapter <name>]] [--envfile <path>] [--environ] [--resume] [--watch] [--pidfile <fil>]


flags:
  -adapter string
        如果你使用的配置文件不是以Caddyfile开头的,那么要使用这个标记来指定,比如-adapter caddyfile。
  -config string
        启动Caddy使用的配置文件
  -envfile string
        从指定的文件加载环境变量,环境变量的格式为KEY=VALUE
  -environ
        打印环境变量
  -pidfile string
        这个大家都知道,用于存放PID的文件
  -pingback string
        启动成功的信息要回显到pingback指定的ip:port上,这里是通过tcp拨号发送回显信息的。
  -resume
        这个挺有意思,会使用最近一次自动保存的配置,这对于恢复一个caddy非常有用。这里需要注意的是,当使用这个标记的时候,通过config标记指定的配置就不再生效了。
  -watch
        这个其实就是在检测到你的配置文件发生变化的时候,自动重新加载配置,这个不要在生产环境使用,自己开发环境用用就得了。
        

# 示例1:加载当前目录下名称为Caddyfile的配置文件启动caddy,并且监控到配置文件改变的时候,自动重新加载配置。
caddy run -config Caddyfile -watch

# 示例2:和示例1相比,增加了一个pid文件
caddy run -config Caddyfile -watch -pidfile /var/run/flysnow.pid

start 命令

代码语言:javascript
复制
# start 命令的使用和 run 一样,不同的是 start 会启动一个在后台运行的 caddy,这意味着它不会阻塞终端的使用。

stop 命令

start 命令对应的是 stop 命令,需要使用 stop 命令通知后台正在运行的 caddy

代码语言:javascript
复制
# caddy help stop

usage:
  caddy stop 


flags:
  -address string
        The address to use to reach the admin API endpoint, if not the default
        
   
如果 start 是使用默认的 localhost:2022 管理地址启动的,那么直接使用 stop 命令就可以优雅的停止 caddy,如果不是默认的,那么需要使用 -address 来指定管理地址。
caddy stop -address localhost:2022

# 提示
caddy 在启动后,不仅可以通过终端命令来管理它,还可以通过 API,这组管理 API 默认的地址就是 localhost:2022,所以当 caddy 启动后,在浏览器中输入这个地址,就可以看到相应的配置了。

reload 命令

通过 start 启动的 caddy 是不能轻易停止的,因为这会导致网络服务不可用,但又想修改配置文件,就可以使用 reload 命令。

代码语言:javascript
复制
# caddy help reload

usage:
  caddy reload --config <path> [--adapter <name>] [--address <interface>]


flags:
  -adapter string
        Name of config adapter to apply
  -address string
        Address of the administration listener, if different from config
  -config string
        Configuration file (required)
  -force
        Force config reload, even if it is the same
        
# 它和 run 命令基本一致,参数也差不多,可以参考 run 命令的使用。注意,这里的 address 参数和 stop 命令中的 address 是一样的,都是管理 API 的地址。

file-server 命令

这个命令可以启动一个文件服务,比如托管一个静态网站、把你的文件夹共享在网站上。

代码语言:javascript
复制
# caddy help file-server

usage:
  caddy file-server [--domain <example.com>] [--root <path>] [--listen <addr>] [--browse] [--access-log]


flags:
  -access-log
        启用访问日志
  -browse
        启用目录浏览
  -domain string
        指定一个域名
  -listen string
        监听的地址,http默认是:80,https默认是:443
  -root string
        要托管的文件服务的根目录
  -templates
        启用模板渲染

reverse-proxy 命令

在 caddy 中,配置一个反向代理非常简单,使用 reverse-proxy 命令即可

代码语言:javascript
复制
# caddy help reverse-proxy

usage:
  caddy reverse-proxy [--from <addr>] [--to <addr>] [--change-host-header]


flags:
  -change-host-header
        变更主机头,从传入的值变为上游的值
  -from string
        用户访问的地址,默认是localhost
  -insecure
        禁用TLS
  -to string
        被代理的上游地址,用户看不到这个地址
代码语言:javascript
复制
# 比如有个后端服务 127.0.0.1:9000,要代理到 localhost,命令如下
caddy reverse-proxy --to 127.0.0.1:9000
现在访问 localhost,其实就是访问的 127.0.0.1:9000 这个后端服务

# 如果想换个端口访问,比如 localhost:2022,只需要运行如下命令
caddy reverse-proxy --from :2022 --to 127.0.0.1:9000

adapt 命令

caddy 是有自己的配置文件的,叫 Caddyfile,这是一种可读性、书写性非常强的配置文件,但它并不是 caddy 的原生配置文件,caddy 的原生配置文件是 json 的,但是非常复杂。 adapt 命令就是给我们提供了 Caddyfile 转 json 原生配置的能力,让我们可以看到真实的配置是什么

代码语言:javascript
复制
# caddy help adapt

usage:
  caddy adapt --config <path> [--adapter <name>] [--pretty] [--validate]

flags:
  -adapter string
        配置适配器的名字,默认是 caddyfile。其实就是告诉命令,要使用什么样的适配器,把相应的配置转为JSON原生配置
  -config string
        配置文件
  -pretty
        是否美化输出
  -validate
        可以帮助检验下输出,其实并没有真正的运行caddy
代码语言:javascript
复制
# 比如简单的 Caddyfile,只有一行 localhost,使用 adapt 命令转为 json 原生配置的结果如下:
caddy adapt --config ~/Desktop/Caddyfile --pretty
{
    "apps": {
        "http": {
            "servers": {
                "srv0": {
                    "listen": [
                        ":443"
                    ],
                    "routes": [
                        {
                            "match": [
                                {
                                    "host": [
                                        "localhost"
                                    ]
                                }
                            ],
                            "terminal": true
                        }
                    ]
                }
            }
        }
    }
}

fmt 命令

这是 caddy 提供的一个辅助工具,可以帮你格式化你的 Caddyfile 配置文件,让它更美观

代码语言:javascript
复制
# caddy help fmt

usage:
  caddy fmt [--overwrite] [<path>]


flags:
  -overwrite
        用格式化后的结果,覆盖你的配置文件
代码语言:javascript
复制
# 整个命令很简单,比如我想用这个命令把我的配置文件美化下,并且把美化的结果覆盖我的配置文件
caddy fmt --overwrite ~/Desktop/Caddyfile

environ 命令

打印 caddy 的环境变量,你可以看到很多关于 caddy 自身和你的系统环境的信息,这对于调试 caddy 非常有用,比如启动不了,路径错误等等。

代码语言:javascript
复制
caddy help environ

hash-password 命令

一个自带的密码 hash 工具,主要用来为配置文件的授权提供 hash 过的密码,因为不能配置明文密码

代码语言:javascript
复制
# caddy help hash-password

usage:
  caddy hash-password [--algorithm <name>] [--salt <string>] [--plaintext <password>]


flags:
  -algorithm string
        Hash算法,支持scrypt和bcrypt两种,默认是bcrypt
  -plaintext string
        要Hash的明文密码
  -salt string
        加点盐,仅当Hash算法是scrypt有效
代码语言:javascript
复制
# 该工具的运行效果
caddy hash-password  --plaintext 1
JDJhJDE0JGJLdzc0M0R1bDUzOTNTWGVJSTV4QU9kMGpQNC5WQTBnZ1E4N3FKOVpXUmQ1NEE2dmRzMWR1

list-modules 命令

caddy 是支持模块的,而且我们可以开发自己的模块,该命令可以列出 caddy 当前已经安装的模块

代码语言:javascript
复制
caddy list-modules --packages

build-info 命令

打印 caddy 的构建信息,主要是 Go Module 的依赖信息,包括包名、版本等

trust 命令

安装一个根证书到本地信任存储中,可能会需要密码才能安装,主要用于开发环境,大部分情况下,该命令是用不到的,因为 caddy 启动的时候会自动安装证书

untrust 命令

从本地存储中卸载一个根证书,也用于开发环境,和上面的 trust 命令是对应的

代码语言:javascript
复制
# caddy help untrust
usage:
  caddy untrust [--ca <id> | --cert <path>]


flags:
  -ca string
        要卸载CA证书的ID,默认为local
  -cert string
        要卸载CA证书的路径

upgrade 命令

这个是升级 caddy 的命令,它会下载最新的二进制文件,然后把本地的给替换掉,这个过程并不会停止 caddy 服务,所以不用担心,它仅仅是替换你的 caddy 文件。 为了保险起见,原来的二进制文件要先备份下。

validate 命令

这是一个验证 Caddyfile 配置文件的命令,它会模拟启动 caddy,但是并不会真正的启动,验证的过程中,遇到问题,会在控制台输出,它的使用和 adapt 命令基本一致

代码语言:javascript
复制
# caddy help validate

usage:
  caddy validate --config <path> [--adapter <name>]

flags:
  -adapter string
        配置适配器的名字,默认是 caddyfile
  -config string
        配置文件的路径

version 命令

最简单的一个命令,打印出 caddy 的版本

代码语言:javascript
复制
# caddy version

Caddyfile 入门

Caddyfile 是 caddy 的配置文件,类似 Nginx 的 config,它是一个普通的文本文件,没有扩展名。

创建一个 Caddyfile 文件

代码语言:javascript
复制
vim Caddyfile
localhost

这是最简单的 Caddyfile 配置,现在使用 caddy start 命令启动即可,如果 Caddyfile 在当前目录下,则不用指定配置文件,否则需要使用 --config 参数指定配置文件
caddy start --config /data/caddy/Caddyfile

默认会启用 https,所有会监听443端口

Hello World

代码语言:javascript
复制
如果现在访问 localhost,只能看到一个空白页面,现在我们让它显示“Hello World”
vim Caddyfile
localhost
respond "Hello World"
现在运行 caddy start,通过浏览器访问 localhost,就能看到 “Hello World”

配置多个 web 服务

代码语言:javascript
复制
#既然 caddy 是一个 web 服务器,那么就不止可以托管一个 web 站点,如果要托管多个,需要怎么做呢?
vim Caddyfile
localhost {
    respond "Hello World"
}
localhost:1234 {
    respond "Hello World !!!"
}

如上示例,定义了两个站点,一个是 localhost,一个是 localhost:1234,执行 caddy start 启动,两个地址都可以访问。
从上面的配置可以看到,要配置多个站点,就需要使用 {} 把每个站点括起来,而只有一个站点的时候,就不需要了。

静态文件服务

代码语言:javascript
复制
vim Caddyfile
www.xx.com {
    root * /var/www/website
    file_server
}

示例

代码语言:javascript
复制
vim Caddyfile

www.example.com:80				# 第一行必须是网站的地址
gzip							# 表示开启 gzip 压缩功能
log /var/log/caddy/access.log	# 为网站开启 log 功能
rot /var/www/website			# 指定网站的根目录
tls xx@xx.com					# 为网站开启 https 并自动申请证书,后面的 E-Mail 参数是告知 CA 申请人的邮箱,caddy 会默认使用 Let's encrypt 申请证书并续约,tls 也可以使用路径给出的证书 tls /etc/ssl/cert.pem /etc/ssl/key.pem


# 多站点配置
vim Caddyfile
example.com:80 {
    gzip
    log /var/log/caddy/access.log
    root /var/www/website
    tls /etc/ssl/cert.pem /etc/ssl/key.pem
}
example1.com:8080 {
    gzip
    log /var/log/caddy/access1.log
    root /var/www/website1
    tls /etc/ssl/cert.pem /etc/ssl/key.pem
}

反向代理

代码语言:javascript
复制
http://www.example.com {
  ## HTTP 代理配置
  ### 此时访问 example.com,实际访问的是 127.0.0.1:8080/app/ 的内容
  proxy / 127.0.0.1:8080/app/

  ## WebSocket 代理配置
  ### 客户端请求的 wss://example.com/app/websocket, 实际为 wss://127.0.0.1:8080/app/websocket
  proxy /app/websocket 127.0.0.1:8080 {
    websocket
  }
}

负载均衡配置

代码语言:javascript
复制
proxy / web1.local:80 web2.local:90 web3.local:100 { 
  policy round_robin 
}

# 用反向代理命令proxy 将请求循环转发到 80、90、100 三个后端服务,通过 policy 命令控制策略为 round_robin,以循环方式选择后端服务
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-08-162,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装
  • 使用
  • 命令行参数
  • Caddyfile 入门
  • 示例
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档