我们通常在部署 web 服务的时候往往会选择 nginx 作为最前面的一个狠角色,它的性能和能力大家也是有目共睹的,反向代理负载均衡等等。而作为后起之秀 caddy 却不被人所熟知,不过渐渐的也开始展露头角。
今天我就来介绍这个 caddy ,为什么我会称它有可能成为下一个 nginx。

我先列举几个痛点你看下:

  1. nginx 的配置文件你是否感觉有时候有点臃肿
  2. https 需要购买或者申请证书,然后配置是否觉得麻烦?
  3. linux 下安装 nginx 需要部分依赖

而 caddy 确实给我了一种眼前一亮的感觉。

使用

官网:https://caddyserver.com/

安装

https://caddyserver.com/docs/download
安装很简单,直接下载对应的二进制文件即可,或者按照对应到操作系统去安装也可以。没有其他依赖。

使用

https://caddyserver.com/docs/getting-started
一个命令就可以启动,caddy,默认会去当前目录下寻找 Caddyfile 配置文件,也可以通过 –config 去指定文件位置

1
2
3
caddy start
caddy stop
caddy reload

反向代理

https://caddyserver.com/docs/caddyfile/directives/reverse_proxy

1
2
3
4
5
https://www.xxxx.com {
reverse_proxy /api/user* {
to 192.168.1.101:9000
}
}

静态文件

1
2
3
4
https://www.xxxx.com {
root * /home/linkinstar/www
file_server
}

外网服务使用 https

https://caddyserver.com/docs/quick-starts/https

https://caddyserver.com/docs/automatic-https

caddy 最让我惊讶的是自动的 https 功能,只要你有一个可以正常访问的域名,将域名指向你外网服务器对应的 ip,然后向上面一样配置好 Caddyfile,只要域名一致,https 就完成了,不需要你额外申请证书,不需要做其他任何的操作,真的很棒👍,可谓是懒人必备

原理是,它会去 https://letsencrypt.org/ 调用对应的接口去申请证书,这是一个免费证书的申请网站,

本地使用 https 证书

当我们的一些内网服务器需要使用 https 证书的时候,怎么办呢?因为内网的服务器没有公网 IP,caddy 去 letsencrypt 申请证书的时候无法验证,所以需要曲线救国。前提你需要一个域名。https://zhuanlan.zhihu.com/p/63412372

申请证书

wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto

certbot-auto –manual –preferred-challenges dns certonly

接下来根据提示依次输入域名,和一些提示,一般输入y表示同意即可,知道让你去添加一条 txt 解析记录并验证的时候

将证书输出验证内容进行 dns 解析配置

image-20210510233258107

配置完成之后会在 /etc/letsencrypt/live/xxx.com 目录下生成对应的公钥私钥

配置Caddyfile

1
2
3
xxx.com:443 {
tls /etc/letsencrypt/live/xxx.com/cert.pem /etc/letsencrypt/live/xxx.com/privkey.pem
}

性能比较

https://caddy.community/t/siege-benchmarks-nginx-vs-caddy-identical-systems/2962

从性能上来说,确实 nginx 要更胜一筹,而且官方也承认(毕竟 nginx 的设计就是干这个的)

不过从比较的数据上来说,能让普通用户使用很满意了,并没有一定需要追求极致的性能体验,毕竟免费的 https 已经有点香了

总结

优点

  1. caddy 发挥了 go 传统的优势安装没有依赖,使用方便
  2. 自动化的 https 证书的申请,很让人舒服
  3. 配置项更加清晰和简单,一目了然

缺点

  1. 性能比 nginx 略逊一筹
  2. 重启的时候 https 会重新申请,会有短暂的停顿
  3. 使用案例少了一些

总的来说,如果你正需要一个免费方便的 https 的网关,那就试试 caddy 吧,一定不会让你失望的,而 caddy 也慢慢在发展,虽然从设计角度讲模型可能不如 nginx,但是从使用角度讲,可能我后续更偏爱 caddy 一些

参考博客

https://segmentfault.com/a/1190000022733237