Caddy服务器
前言
最近在使用Caddy,发现配置十分友好,这里记录下使用过程。
Caddy有个突出优点,可以通过Let’s Encrypt自动获取和续订SSL证书。
Caddy配置
Caddy有两种工作方式,使用API或Caddyfile,API使用json作为配置,Caddyfile结合CLI使用。
Caddyfile
结构
块 Blocks
块由{}
包起来。
全局可选的块 Global options
使用没有键的块就是全局选项
{
}
全局选项必须是第一个块
站点块
只有一个站点Caddyfile,{}
可以省略。
指令 Directives
指令是自定义服务方式的关键字,必须出现在站点块内,并且是站点块中一行的第一个单词
指令的参数使用空格分割,如果参数中有空格需要使用”“括起来
如果参数中带”号可以使用\“转移
不想使用转移可以使用``把参数括起来
handle指令和route指令的区别
handle和route指令互相排斥,流程上会先匹配handle指令,如果有满足就不会再匹配route指令。
实践中遇到的问题
受使用Nginx的习惯影响,开始在匹配器里写了正则,结果发现工作不正常,查了文档发现Caddyfile不支持正则。
handle / {}
只匹配根路径,如果要匹配所有路径需要 handle {}
。
Caddyfile示例
示例1:后端负载均衡
localhost {
localhost:9000 localhost:9001 {
lb_policy first
}
}
lb_policy是reverse_proxy的子指令,用于负载均衡。
示例2:前端使用Vue.js的Route History模式加后端的配置
# 全局配置
{
log {
level INFO
output stdout
}
}
# 站点配置
localhost {
# 后端API
handle /api* {
# 代理到后端
reverse_proxy localhost:3000
}
# 前端Vue.js
handle {
encode {
gzip 9
minimum_length 1024
match {
header Content-Type text/plain
header Content-Type application/javascript
header Content-Type application/x-javascript
header Content-Type text/css
header Content-Type application/xml
header Content-Type text/javascript
header Content-Type application/x-httpd-php
header Content-Type image/jpeg
header Content-Type image/gif
header Content-Type image/png
}
}
root * /var/www/html
file_server
try_files {path} {path}/ /index.html
}
}
使用API
其他用途
作为静态文件服务器使用
# 当前目录
caddy file-server --listen :3015 --browse
# 指定目录
caddy file-server --listen :3015 --browse --root ~/mysite