vlambda博客
学习文章列表

听说他能干掉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-httpscurl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo tee /etc/apt/trusted.gpg.d/caddy-stable.asccurl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.listsudo apt updatesudo apt install caddy

Fedora, RedHat, CentOS下安装

Fedora orRHEL/CentOS 8使用如下语句安装

dnf install 'dnf-command(copr)'dnf copr enable @caddy/caddydnf install caddy

RHEL/CentOS7使用如下语句安装

yum install yum-plugin-copryum copr enable @caddy/caddyyum install caddy

也可以使用docker安装

docker pull caddy

此次安装以centos7为例进行

3、helloworld

安装完成后caddy会被注册成系统服务,systemctl status caddy查看服务状态

听说他能干掉nginx?!!!

我们使用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

听说他能干掉nginx?!!!

但是json格式比较麻烦,caddy还提供了一种Caddyfile用于简化配置

:2015respond "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解析,直接在购买域名的网站上设置即可

保证服务器的80443端口需要在外网能正常访问

使用如下命令验证DNS解析记录是否正确

curl "https://cloudflare-dns.com/dns-query?name=example.com&type=A" \ -H "accept: application/dns-json"

修改Caddyfile配置文件,去掉域名前面的http即可

#注意要去掉域名前面的httpexample.com {        root * /tmp        file_server browse}

https://www.toolnb.com/tools/rewriteTools.html