听说他能干掉nginx?!!!
参考链接
1、介绍
Caddy是一个功能强大、可扩展的平台,可以为您的网站、服务和应用程序提供服务,使用Go编写
大多数人将Caddy用作web服务器或代理,大多数人最喜欢的配置Caddy的方式是使用Caddyfile,但是Caddy的原生配置语言是JSON
Caddy具有如下主要特性:
l 对比Nginx复杂的配置,其独创的Caddyfile配置非常简单;
l 可以通过其提供的Admin API实现动态修改配置;
l 默认支持自动化HTTPS配置,能自动申请HTTPS证书并进行配置;
l 能够扩展到数以万计的站点;
l 可以在任意地方执行,没有额外的依赖;
l 采用Go语言编写,内存安全更有保证
2、安装
Debian, Ubuntu, Raspbian下安装
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo tee /etc/apt/trusted.gpg.d/caddy-stable.asc
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
Fedora, RedHat, CentOS下安装
Fedora orRHEL/CentOS 8使用如下语句安装
dnf install 'dnf-command(copr)'
dnf copr enable @caddy/caddy
dnf install caddy
RHEL/CentOS7使用如下语句安装
yum install yum-plugin-copr
yum copr enable @caddy/caddy
yum install caddy
也可以使用docker安装
docker pull caddy
此次安装以centos7为例进行
3、helloworld
安装完成后caddy会被注册成系统服务,systemctl status caddy查看服务状态
我们使用caddy start命令可以让Caddy服务在后台运行
或者用systemctl start caddy的方式启动caddy作为后台运行
cassy stop停止服务
caddy run会命令行启动,退出即停止
尝试caddy run后,会永久阻塞下去,官网说这时候什么也不做,caddy默认的配置文件是空的,我们可以在另一个终端中使用admin API来验证这一点,
curl localhost:2019/config/
caddy会使用json作为配置文件,从hello world开始,创建一个caddy.json文件,文件内容如下
{
"apps": {
"http": {
"servers": {
"example": {
"listen": [":2015"],
"routes": [
{
"handle": [{
"handler": "static_response",
"body": "Hello, world!"
}]
}
]
}
}
}
}
}
上传配置文件,需要事先关闭防火墙和setLinux,否则可能会报错如下
{"error":"loading config: loading new config: http app module: start: tcp: listening on :2015: listen tcp :2015: bind: permission denied"}
关闭防火墙 systemctl stop firewalld
关闭 setLinux
修改/etc/selinux/config文件中的SELINUX=""为disabled ,然后重启。
如果不想重启系统,使用命令setenforce 0
上传命令
curl localhost:2019/load \
-X POST \
-H "Content-Type: application/json" \
-d @caddy.json
通过如下命令查看配置
curl localhost:2019/config/
然后测试访问
curllocalhost:2015
但是json格式比较麻烦,caddy还提供了一种Caddyfile用于简化配置
:2015
respond "Hello, world!"
先创建一个名称为Caddyfile的文件,然后运行caddy adapt配置就生效了,也可以指定Caddyfile的路径
caddy adapt--config /path/to/Caddyfile
如果修改Caddyfile,然后运行caddyreload让配置生效
我们还可以在CaddyFile文件中绑定多个端口
:2015 {
respond "Hello,world! 12345"
}
:2016 {
respond "Goodbye, world!"
}
4、静态文件代理
此处以实际项目的前端打包文件部署为例
将前端文件导报好的文件解压到/usr/local/env/caddy/dist文件夹下,创建Caddyfile文件,内容如下
http://192.168.127.128:2017 {
root * /usr/local/env/caddy/dist
file_server {
precompressed zstd br gzip
browse
}
}
如果你的Caddyfile文件格式不太合格的话,会出现如下警告,直接使用 caddy fmt--overwrite 命令格式化并重写配置即可解决;
[WARNING][caddyfile] Caddyfile:4: input is not formatted with 'caddy fmt'
配置完成后caddy reload Caddyfile
更多的file_server可以参考以下配置
file_server
[<matcher>] [browse] {
//静态文件的路径
root <path>
//hide is a list of files or folders to hide(指定要隐藏的文件或文件夹)
hide <files...>
//默认会读取index.html index.txt
index <filenames...>
browse [<template_file>]
precompressed <formats...>
status <status>
disable_canonical_uris
pass_thru
}
也可以使用candy搭建文件服务器,示例如下
http://192.168.127.128:2017 {
file_server {
root /usr/local
browse
}
}
显示效果如下
5、动态代理
动态代理就是把代理服务器的请求转发到另一个服务上去,我们把后端服务配置上去
配置如下
http://192.168.127.128:2017 {
root * /usr/local/env/caddy/list
file_server
encode gzip
log {
output file /usr/local/env/caddy/access.log
}
handle_path /community-api/* {
reverse_proxy 192.168.103.190:9909
}
}
下图中验证码展示出来了,说明后台服务已经访问成功
但是重新刷新页面会报错404,我们需要修改下配置,找不到的文件就跳转到index.html,同时使用handle,配置拦截多个请求
handle是互斥的,类似于nginx中的location,handle_path和handle类似,但是运行的时候会去除前缀,最后附上修改完成后的配置文件,然后执行caddy reload
http://192.168.127.128:2017 {
root * /usr/local/env/caddy/dist
encode gzip
log {
output file /usr/local/env/caddy/access.log {
roll_size 10MiB
roll_keep 5
roll_keep_for 72h
}
}
handle_path /community-api/* {
reverse_proxy 192.168.103.190:9909
}
handle {
try_files {path} {path} /index.html
file_server {
precompressed zstd br gzip
browse
}
}
}
再次刷新,不会报错404
如果多个服务要配置负载均衡,示例如下
reverse_proxy node1:80 node2:80 node3:80{
lb_policy random
}
lb_policy默认是随机的,支持多种负载均衡算法
l random - randomly choosean upstream
l random_choose <n> -selects two or more upstreams randomly, then chooses one with least load(n is usually 2)
l first - choose firstavailable upstream, from the order they are defined in the config
l round_robin - iterate eachupstream in turn
l least_conn - chooseupstream with fewest number of current requests
l ip_hash - map client IP tosticky upstream
l uri_hash - map URI tosticky upstream
l header [field] - maprequest header to sticky upstream
l cookie [<name>[<secret>]] - based on the given cookie (default nameis lb if not specified), which value is hashed; optionally with asecret for HMAC-SHA256
6、https
Caddy是第一个也是唯一一个自动默认使用HTTPS的web服务器
首先我们需要修改域名的DNS解析,直接在购买域名的网站上设置即可
保证服务器的80和443端口需要在外网能正常访问
使用如下命令验证DNS解析记录是否正确
curl "https://cloudflare-dns.com/dns-query?name=example.com&type=A" \
-H "accept: application/dns-json"
修改Caddyfile配置文件,去掉域名前面的http即可
#注意要去掉域名前面的http
example.com {
root * /tmp
file_server browse
}
https://www.toolnb.com/tools/rewriteTools.html