使用 Caddy 替代 Nginx

前言

Caddy 2 is a powerful, enterprise-ready, open source web server with automatic HTTPS written in Go

Caddy 是一个 Go 编写的 Web 服务器,类似于 Nginx。相较于 Nginx 来说,Caddy 的配置简单了很多,而且默认启用了 https,更加的安全。

最开始的时候,我使用的还是 Nginx 进行部署,当时主要是也不太了解,磕磕碰碰查资料来部署静态网站,复制粘贴后也能把 server 写起来,但对于里面的字段配置也不怎么明确。最近想要弄反向代理的时候,感觉配置没问题,但就是代理不成功,可能就是菜吧 😣

在查找问题的过程中,发现了 Caddy,简单尝试之后发现相较于 Nginx 来说,Caddy 的配置简单了很多,没有 Nginx 那么多的配置项。

当然,如果你是用的是宝塔面板,可以忽略上面的所有问题。虽然当初主要是抱着学习的目的没有用宝塔,但确实越来越感觉宝塔是真的方便,可是这就是折腾吧。

安装 Caddy

官方提供了许多安装方式,你可以在安装页面找到它们。

我服务器的环境是 Ubuntu 20.04,可以直接使用下面的命令行方式安装,并且自动将 Caddy 作为 systemd 服务:

1
2
3
4
5
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

如果你熟悉 docker, 也可以直接使用

1
docker pull caddy

常用命令

1
2
3
caddy start     # 启动
caddy stop # 停止
caddy reload # 重载

Caddyfile 配置

Caddy 可以用命令行启动 HTTP 服务,也可以用配置文件(默认:Caddyfile,当然新版也实现了 json 方式控制),这里我的方案是通过配置文件 Caddyfile 来进行配置,毕竟命令行方式还是只适用临时使用。

默认会在 /etc/caddy/ 目录下生成一个 Caddyfile 文件,你可以在这里配置你的服务器,Caddyfile 的配置还是比较简单的,下面是官网的一个示例:

1
2
3
4
5
emoryhuang.cn {
root * path/to/blog
encode gzip
tls path/to/emoryhuang.cn.pem path/to/emoryhuang.cn.key
}

首先是网站地址,可以使用通配符,这些是有效地址的示例:

  • localhost
  • example.com
  • :443
  • http://example.com
  • localhost:8080
  • 127.0.0.1
  • [::1]:2015
  • example.com/foo/*
  • *.example.com
  • http://

同时映射多个地址

如果多个站点共享相同的定义,你可以将所有站点一起列出:

1
2
3
emoryhuang.cn, www.emoryhuang.cn {
...
}

Caddyfile 指令

指令 Directives 说明
root 设置站点根目录的路径
gzip 启用 gzip 压缩
tls 自定义 tls
reverse_proxy 反向代理
redir 重定向

你可以在官方文档中找到更多的指令。

自定义 SSL 证书

1
2
3
4
emoryhuang.cn {
root * path/to/blog
tls path/to/emoryhuang.cn.pem path/to/emoryhuang.cn.key
}

反向代理

caddy 中,配置一个反向代理非常简单,使用 reverse-proxy 命令即可。

1
2
3
cloud.emoryhuang.cn {
reverse_proxy localhost:5212
}

访问 https://cloud.emoryhuang.cn 实际上访问的是服务器的 5212 端口。

利用以下配置可将 https://cloud.emoryhuang.cn/proxy 反向代理到 localhost:5212

1
2
3
cloud.emoryhuang.cn {
reverse_proxy /proxy localhost:5212
}

重定向

访问 www.emoryhuang.cn 会 302 Redirect 重定向到 https://emoryhuang.cn

1
2
3
www.emoryhuang.cn {
redir https://emoryhuang.cn{uri}
}

多站点配置

如果要进行多个站点的配置,只需要在 Caddyfile 中简单罗列即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
emoryhuang.cn {
root * path/to/blog
encode gzip
tls path/to/emoryhuang.cn.pem path/to/emoryhuang.cn.key
}

home.emoryhuang.cn {
root * path/to/homepage
encode gzip
tls path/to/home.emoryhuang.cn.pem path/to/home.emoryhuang.cn.key
file_server
}

cloud.emoryhuang.cn {
reverse_proxy localhost:5212
tls path/to/cloud.emoryhuang.cn.pem path/to/cloud.emoryhuang.cn.key
}

自动 HTTPS

Caddy 是第一个也是唯一一个默认自动使用 HTTPS 的 Web 服务器。

默认情况下,Caddy 通过 HTTPS 为所有站点提供服务。

  • Caddy 使用本地自动信任的自签名证书(如果允许)通过 HTTPS 提供 IP 地址和本地/内部主机名。
  • Caddy 使用来自公开的 ACME CA 的证书,通过 HTTPS 提供公共 DNS 名称。

Caddy 会自动更新所有托管证书并将 HTTP(默认端口 80)重定向到 HTTPS(默认端口 443)。

总结

总的来说,相较于 Nginx 来说,Caddy 还是简单了很多,如果你熟悉 Nginx,可以比较一下同等情况下 Nginx 的配置,个人觉得还是比较省心的。

你可以在官方文档中到达更多内容。

参考资料