Caddy | 学习笔记
Contents
安装
Linux
Note: You must specify a personal or commercial license; see getcaddy.com for instructions. (安装时要求必须给出一种许可证,所以下面命令添加了选项:
-s personal
)
|
|
Windows
platform 选择需要安装的平台
plugins 选择需要的插件(可以不选)
下载完成后解压即可得到 caddy.exe
Source code
从 源码 安装
|
|
Note: 从源码安装参考
运行
以 Linux 平台作测试
|
|
Note: caddy 从当前目录的
Caddyfile(默认)
文件中读取配置; 也可以通过-conf
指定配置文件路径
应用(配置Caddy)
官方文档
:Caddyfile Primer(入门书)、Caddyfile Directive(指令介绍)
Caddyfile格式: Caddyfile 总是以站点的 Addr
开始, #
表示注释;且之后的每一行都是官方提供的指令
静态文件 Server
文件目录结构
1 2 3 4 5 6 7 8 |
[root@qxs /home/caddy/test]$ tree . ├── caddy ├── Caddyfile ├── test │ └── test.txt ├── test01.txt └── test02.txt |
Caddyfile 内容:
|
|
Note: 对于静态文件Server,caddy支持在website的root路径下首先查找是否有如下四个文件:
|
|
如果查到有其中一个,则优先返回这个文件内容,这就是静态站点的首页。
如果要支持目录文件列表浏览,则需要为 website 配置 browse middleware,这样对于无 index file 的目录,我们可以看到目录文件列表。
单一站点
|
|
多站点部署
Note: 多站点部署即是:
80
端口多路复用
如果需要配置独立的虚拟主机,需要将配置信息移动到站点名之后的大括号内:
|
|
Note:
- 左括号必须与站点名位于同一行,而右括号则是必须单起一行
- 站点地址配置多个的话,需要用
,
空格
隔开, 且最后的地址和大括号之间也要有空格
|
|
当 Caddy 检测到站点名符合下列条件时会自动使用 Let’s Encrypt 脚本来为站点添加 HTTPS 支持,并且自动监听 80 与 443 端口:
主机名不可为空并且没有 localhost 与 IP 地址
端口号未明确指定为 80
Scheme 未明确指定为 http
TLS 未被关闭
未指明证书
反向代理
proxy
指令提供了基本的反向代理功能, 其支持 Health Checks 和 Failovers, 并且支持对 Websocket 的反向代理。
其基本语法为:
proxy from to
- from: 即是请求匹配的基本路径
- to: 则是请求转发的端点地址。
将所有发往 /v0 的API接口请求转发到 localhost:7005 的后端服务程序
|
|
- 使用随机策略将所有请求负载均衡到三个后端服务器
|
|
- 使用循环机制
|
|
- 添加健康检查,并且透明转发主机名、地址与上游:
|
|
- 转发 websocket 请求
|
|
- 避免对静态请求转发
|
|
Example:
|
|
- 当访问 localhost:2015/foo 时,实际上访问的是 9001 端口的服务程序;
- 当访问 localhost:2015/bar 时,实际上访问的是 9002 端口的服务程序。
使用
transparent
指令增加 X-* 的头1 2 3 4
header_upstream Host {host} header_upstream X-Real-IP {remote} header_upstream X-Forwarded-For {remote} header_upstream X-Forwarded-Proto {scheme}
服务器IP 反向代理
用服务器的 IP 来反向代理一个 http 协议的网站 http://www.baidu.com
|
|
Note: 服务器IP 也可以反向代理 HTTPS 协议的网站,但是需要自签SSL证书,现在的浏览器一般都不会认 自签的SSL证书,所以不建议这么做
域名 反向代理 HTTP
用域名来反向代理一个 http 协议的网站 http://www.baidu.com
|
|
域名 反向代理 HTTPS
- 如果有SSL证书和密匙的话, 参考 HTTPS-自签发证书
|
|
- 如果没有 SSL证书和密匙, 参考HTTPS-自助申请letsencrypt证书
HTTP 重定向为 HTTPS
当我们手动指定 SSL 证书和密匙来配置的话,Caddy 只会监听 443 端口(https),并不会自动设置 80 端口(http)的重定向(如果是Caddy自动申请的SSL证书,那么就自动做好了),如果要做重定向的话,可以这样做:
- 下面的示例代码中,是把 http://toyoo.ml、http://233.toyoo.ml、https://666.toyoo.ml 三个域名都重定向到了 https://toyoo.ml
|
|
负载均衡
Caddy支持负载均衡配置,并支持三种负载均衡算法:random(随机)、least_conn(最少连接)以及 round_robin (轮询调度); 负载均衡同样是通过 proxy middleware 实现的.
Example:
|
|
Websocket
Caddy 内建支持 websocket 连接, 其允许客户端发起 WebSocket 连接的时候服务端执行某个简单的指令,其基本语法如下:
1
|
websocket [path] command |
Caddyfile 配置如下:
|
|
HTTPS
我们只需要提供一个邮箱账号, Caddy 即可使用 tls
指令可为网站开启 https 功能, 并自动申请、配置和续约SSL证书, 其命令格式如下:
1
|
tls your@emial.com |
或者指定已有证书和私钥的路径, 这样的话 caddy 就不会去自动申请证书,而是使用路径给出的证书了。
1
|
tls /path/to/cert.pem /path/to/key.pem |
Note:
- cert: 指定CA的根证书
- key: 指定CA的私有密钥
- 需要在浏览器导入CA跟证书
自助申请letsencrypt证书
|
|
Note: 申请 SSL证书前,请务必提前解析好域名记录(解析后最好等一会,以全球生效),否则 Caddy会申请并配置失败! - Caddy自动申请SSL证书位置:/.caddy/acme/acme-v01.api.letsencrypt.org/sites/xxx.xxx(域名)/
自签发证书
在本地开发时,自然没法用 Let’s Encrypt 来签证书,这时候可以用 tls 指令自签发证书; 但是,客户端是不认自签发的证书的,需要手动信任。
|
|
Note: 启动 Caddy 时,Caddy 会自动在内存里创建证书。由于证书是存在内存里的,所以下次启动的时候证书又会重新生成,需要再次手动信任。
权限认证
Basic Auth
JWT
用 CORS 解决跨域
使用 cors 指令可为服务器添加跨域请求的能力:
|
|
Note: 在 allowed_headers & exposed_headers 等中,各个key之间只能用
,
隔开,且不能有其他的字符(例如:空格)等。
地址过滤
我们可以使用 ipfilter
指令来基于用户的 IP 来允许或者限制用户访问,其基本语法为:
|
|
- 仅允许某个IP访问
|
|
请求限流
我们可以使用 ratelimit
这个扩展指令来为资源添加请求限流的功能,对于单资源可以使用如下指令:
|
|
- 对多个资源的请求限流控制
|
|
重定向
Note: redir 默认使用指令
redir
可以完成请求跳转,语法格式为:
1
|
redir from to [code] |
from: 请求地址(必须完全匹配,例如:
/
将匹配所有)to: 重定向的目的地址 ( 这个也可以使用 占位符 )
code: is the HTTP status code to respond with; must be in the range [300-308] excluding 306. May also be meta to issue meta tag redirect for browsers. The default status code is 301 Moved Permanently.
Example:
|
|
生产环境使用
生产环境使用Caddy配置文件一般放置在:/etc/caddy
目录下, 且不要使用 root 账号去运行 caddy
Instructions
- run caddy as user
www-data
and groupwww-data
, with UID and GID 33
Caddy 配置
修改 caddy 可执行文件使用权限
|
|
Give the caddy binary the ability to bind to privileged ports (e.g. 80, 443) as a non-root user:
|
|
创建用户组(www-data)及用户(www-data)
|
|
Note: 可能出现错误:useradd: UID 33 is not unique,这里换成 333 重新执行即可(问题原因还未查明验证)
创建存放 caddy 配置文件的目录
|
|
创建 SSL 证书存放目录
|
|
Note: 因为 ssl 文件夹里存放私钥,所以权限设置成 0770 禁止其他用户访问
创建 Caddyfile
|
|
Note: 这里 Caddyfile 权限在 root(我当前登录用户) 时是
read-only
, 所以需要注意修改该文件时要赋予它可写的权限
最后,创建一个网址放置目录, 并且将需要部署的网站 (例如:qs.com ) 拷贝到 www 目录下
|
|
|
|
Noet: 部署站点时需要在Caddyfile中用指令: root /var/www/qs.com 指定网站根目录, example:
|
|
系统服务(Linux)
创建 systemd service
|
|
caddy.service 内容如下:
|
|
启动服务
|
|
See Also
Thanks to the authors 🙂
- Caddy 部署实践
- Caddy HTTPS server
- Caddy,一个用Go实现的Web Server
- 清新脱俗的 Web 服务器 Caddy
- 利用 Caddy 非常简单的部署 反向代理/镜像(支持自签SSL证书)
- Caddy的内容集合
- https://www.sooele.com/index.php/2018/01/31/caddy%E6%9C%80%E5%AE%B9%E6%98%93%E4%B8%8A%E6%89%8B%E7%9A%84web-server-%E8%87%AA%E5%8A%A8%E5%8C%96https%E4%B8%80%E5%88%86%E9%92%9F%E9%83%A8%E7%BD%B2%E7%BD%91%E7%AB%99%E7%BD%91%E7%9B%98-2/