Caddy是go语言编写的一款跨平台web服务器,支持window,linux,andorid等操作系统。
它配置简单易用,原生支持 HTTP/2,支持Markdown自动渲染,反向代理,FastCGI,自动创建 Let’s Encrypt 证书等特性,非常适合开发环境使用。更多特性可见官方介绍
本文会从以下几个方面简单介绍Caddy
-
安装与运行
-
常用配置
-
线上部署
安装与运行¶
从Caddy官方选择所需要的功能模块后,下载一个含二进制的压缩包。下载解压后,切入目录。执行./caddy然后浏览器访问localhost:2015,页面出现提示404 Not Found,说明运行ok。
安装和运行就是这么简单!
常用配置¶
Caddy默认从当前目录下面的Caddyfile文件中读取配置。当然你也可在启动Caddy时候使用-conf选项指明配置文件
Caddy配置都是由一系列指令构成,需要什么功能,就配置什么指令。下面列出几种常见情况的Caddyfile配置
单一站点¶
localhost:2017
gzip // 使用gzip压缩
browse // 支持目录浏览
ext .html // 文件拓展名html
log /var/log/access.log // 日志存放
proxy /api 127.0.0.1:4000 // 反向代理到服务
header /api Access-Control-Allow-Origin * // 自定义头,允许跨域
多个站点¶
movie.yskankan.com.com:80 {
gzip
log /var/log/movie.yskankan.com.access.log
}
blog.yskankan.com:80 {
gzip
log /var/blog.yskankan.com.access.log
}
Basic Auth¶
CORS¶
CORS(Cross-Origin Resource Sharing) 跨域资源共享是一种机制(或者说手段)让Web应用服务器能够支持跨站访问控制。从而使用安全地进行跨站数据传输成为可能,更多详细内容可见MDN HTTP访问控制
cors / {
origin http://yskankan.com // 允许向服务器提交请求的URI
methods GET,POST,PUT,HEAD // 允许请求的方式
allow_credentials false // 是否credentials校验
max_age 3600 // 预请求校验结果有效期为3600秒
allowed_headers X-Custom-Header //指明一次请求中可以自定义的请求头,多个逗号隔开
exposed_headers X-My-Custom-Header // 允许浏览器访问的头,多个逗号隔开
}
IP过滤¶
ipfilter / {
rule block
ip 192.168.0.0/16 2E80::20:F8FF:FE31:77CF/16 5.23.4.24
blockpage /local/data/default.html
}
反向代理¶
http://www.yskankan.com {
log /var/log/access.log
proxy /movie localhost:4001
proxy /blog localhost:4002
}
负载均衡¶
Caddy支持三种负载均衡算法:支持三种负载均衡算法:random(随机),least_conn(最少连接),round_robin(轮询调度)
localhost {
log /var/log/access.log
proxy / localhost:4001 localhost:4002 {
policy random
}
proxy /jobs localhost:4003 localhost:4004 {
policy least_conn
}
}
FastCGI¶
FastCGI是CGI的升级,在服务开始后预先多启动个进程。caddy服务器,将用户的请求转发给实现FastCGI的服务,然后将服务响应的内容返回给用户。下面是配置PHP-CGI:
上面的fastcig / 127.0.0.1:9000 php意思是将所要请求转发9000端口的服务。其中php是一个preset(预配置集合),相当于:
ext .php split .php index index.php
文件管理¶
caddy文件管理是caddy的一个拓展指令,需要在下载时候选择相应的模块
localhost {
basicauth / admin 123456
filemanager / {
show /user/share/nginx/html/documents
allow_new true
allow_edit true
allow_commands false
block dotfiles
}
}
git自动更新¶
localhost {
gzip
git {
repo https://github.com/cyub/blog // 代码仓库地址
path /path/wwwroot/app/ // 代码拉取下来后存放路径
interval 3600 // 每隔3600秒拉取一次
}
}
一个复杂的例子¶
http://www.yskankan.com {
gzip
log /var/log/access.log
proxy /blogs http://127.0.0.1:4001, http://127.0.0.1:4002 {
without /blogs
header_upstream Host {host}
header_upstream X-Real-IP {remote}
header_upstream X-Forwarded-For {remote}
header_upstream X-Forwarded-Proto {scheme}
}
errors { // 错误日志和自定义错误页面
log /var/www/log/error.log {
size 50 // 50M以后,自动分割
age 30 // 文件最多保留30天
keep 5 // 最多保留5个文件
}
404 /path/app/404.html
500 /path/app/500.html
}
}