开发工具 更好用的 Web 服务器:Caddy

hammer · 2024年08月12日 · 最后由 maomao 回复于 2024年08月12日 · 555 次阅读

What is Caddy

Caddy 是一个用 Go 实现的 Web Server。

在追求性能的道路上,nginx 已经一骑绝尘。这种情况下诞生的 Caddy 有什么特性呢?

Caddy 的作者 Matt Holt 有这样的理念:其他 Web Server 为 Web 而设计,Caddy 为 human 设计。一句话就是 Caddy 主打易用性,使用配置简单。

Caddy 有下面这些开箱即用的特性:

  • 全自动支持 HTTP/2 协议,无需任何配置。
  • Caddy 使用 Let’s Encrypt 让你的站点全自动变成 HTTPS,无需任何配置。
  • 合理使用多核多核 得益于 go 的特性
  • 完全支持 IPv6 环境
  • Caddy 对 WebSockets 有很好的支持
  • 自动把 Markdown 转成 HTML
  • Caddy 对 log 格式的定义很容易
  • 易于部署 得益于 go 的特性,caddy 只是一个小小的二进制文件,没有依赖,很好部署
  • 得益于 Go 的跨平台特性,Caddy 很容易的支持了三大主流系统:Windows、Linux、Mac

“几乎所有的功能在 Caddy 里的都是插件,HTTP 服务器是插件,高级的 TLS 特性也是插件,每一行命令实现的功能都是一个插件”

一键安装 Caddy

CADDY_TELEMETRY=on curl https://getcaddy.com | bash -s personal

显示如下内容 caddy 已经安装成功

% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  7380  100  7380    0     0   6897      0  0:00:01  0:00:01 --:--:--  6897

Downloading Caddy for linux/amd64 (personal license)...

Download verification OK
Extracting...
Putting caddy in /usr/local/bin (may require password)
Caddy v1.0.3 (h1:i9gRhBgvc5ifchwWtSe7pDpsdS9+Q0Rw9oYQmYUTw1w=)
Successfully installed

配置 Caddy

sudo mkdir -p /etc/caddy # 配置文件夹
sudo touch /etc/caddy/Caddyfile

Caddyfile写入以下内容,格式还是比较简单的

example.com:80
gzip
log /var/log/caddy/access.log
root /var/www
tls [email protected]

首先第一行必须是网站的地址

第 2 行的 gzip 是一个指令,表示打开 gzip 压缩功能,这样网站在传输网页时降低流量

第 3 行的 log 指令会为网站开启 log 功能,log 后的参数是 log 文件的存放位置

第 4 行的 root 是指定网站的根目录

第 5 行的 tls 指令告诉 caddy 为网站开启 https 并自动申请证书,后面的 email 参数是告知 CA 申请人的邮箱。caddy 会默认使用 let's encrypt 申请证书并续约。 tls 也可以使用路径给出的证书 tls /etc/ssl/cert.pem /etc/ssl/key.pem

如何设置多站点访问呢?

example.com:80 {
  gzip
  log /var/log/caddy/access.log
  root /var/www
  tls /etc/ssl/cert.pem /etc/ssl/key.pem
}
example2.com:3000{
  gzip
  log /var/log/caddy/example2/access.log
  root /var/www/example2
  tls /etc/ssl/example2/cert.pem /etc/ssl/example2/key.pem
}

基本的 caddy 配置就这些,详细的内容可以去官网上看文档学习

反向代理

http://www.example.com {
  ## HTTP 代理配置
  ### 此时访问 example.com,实际访问的是 127.0.0.1:8080/app/ 的内容
  proxy / 127.0.0.1:8080/app/

  ## WebSocket 代理配置
  ### 客户端请求的 wss://example.com/app/websocket, 实际为 wss://127.0.0.1:8080/app/websocket
  proxy /app/websocket 127.0.0.1:8080 {
    websocket
  }
}

负载均衡简单配置

proxy / web1.local:80 web2.local:90 web3.local:100 {
  policy round_robin
}

用反向代理命令proxy 将请求循环转发到 80、90、100 三个后端服务,通过 policy 命令控制策略为 round_robin,以循环方式选择后端服务。

已守护进程的方式启动 daemon

有 3 种

使用的是官方提供的脚本 caddy.service,其他系统也可以在这里找到相应的脚本。

把这个文件下载到 /etc/systemd/system/ 

sudo curl -s  https://raw.githubusercontent.com/caddyserver/caddy/v1.0.3/dist/init/linux-systemd/caddy.service -o /etc/systemd/system/caddy.service

需要重新加载 systemd daemon,让配置生效, sudo systemctl daemon-reload

设置 Caddy 开机启动 sudo systemctl enable caddy.service

我说这篇文章为什么看上去如此奇怪,按照 Caddy v1 写的是吧

v1 是不是早就 EOL 了?

v1 和 v2 的配置文件差异巨大

已经在生产环境用上 Caddy 了

一个二进制就行?还是说还是会额外的安装其他软件?

需要 登录 后方可回复, 如果你还没有账号请 注册新账号