一个比 Nginx 功能更强大的 Web 服务器

Caddy 简介Caddy 是一个 Go 编写的 Web 服务器,类似于 Nginx,Caddy 提供了更加强大的功能,随着 v2 版本发布 Caddy 已经可以作为中小型站点 Web 服务器的另一个选择;相较于 Nginx 来说使用 Caddy 的优势如下:

  • 自动的 HTTPS 证书申请(ACME HTTP/DNS 挑战)
  • 自动证书续期以及 OCSP stapling 等
  • 更高的安全性包括但不限于 TLS 配置以及内存安全等
  • 友好且强大的配置文件支持
  • 支持 API 动态调整配置(有木有人可以搞个 Dashboard)
  • 支持 HTTP3(QUIC)
  • 支持动态后端,例如连接 Consul、作为 k8s ingress 等
  • 后端多种负载策略以及健康检测等
  • 本身 Go 编写,高度模块化的系统方便扩展(CoreDNS 基于 Caddy1 开发)
  • ……
就目前来说,Caddy 对于我个人印象唯一的缺点就是性能没有 Nginx 高,但是这是个仁者见仁智者见智的问题;相较于提供的这些便利性,在性能可接受的情况下完全有理由切换到 Caddy 。
编译 Caddy2注意: 在 Caddy1 时代,Caddy 官方发布的预编译二进制文件是不允许进行商业使用的,Caddy2 以后已经全部切换到 Apache 2.0 License 。
在默认情况下 Caddy2 官方提供了预编译的二进制文件,以及自定义 build 下载页面,不过对于需要集成一些第三方插件时,我们仍需采用官方提供的 xcaddy 来进行自行编译;以下为具体的编译过程:
Golang 环境安装本部分编译环境默认为 Ubuntu 20.04 系统,同时使用 root 用户,其他环境请自行调整相关目录以及配置;编译时自行处理好科学上网相关配置,也可以直接用国外 VPS 服务器编译 。
首先下载 go 语言的 SDK 压缩包,其他平台可以从 https://golang.org/dl/ 下载对应的压缩包:
wget https://golang.org/dl/go1.15.6.linux-amd64.tar.gz下载完成后解压并配置相关变量:
# 解压tar -zxvf go1.15.6.linux-amd64.tar.gz# 移动到任意目录mkdir -p /opt/devtoolsmv go /opt/devtools/go# 创建 go 相关目录mkdir -p ${HOME}/gopath/{src,bin,pkg}# 调整变量配置,将以下变量加入到 shell 初始化配置中# bash 用户请编辑 ~/.bashrc# zsh 用户请编辑 ~/.zshrcexport GOROOT='/opt/devtools/go'export GOPATH="${HOME}/gopath"export GOPROXY='https://goproxy.cn' # 如果已经解决了科学上网问题,GOPROXY 变量可以删除,否则可能会起反作用export PATH="${GOROOT}/bin:${GOPATH}/bin:${PATH}"# 让配置生效# bash 用户替换成 ~/.basrc# 重新退出登录也可以source ~/.zshrc配置完成后,应该在命令行执行 go version 并有以下成功返回:
bleem ? ~ go versiongo version go1.15.6 linux/amd64安装 xcaddy按照官方文档直接命令行执行 go get -u github.com/caddyserver/xcaddy/cmd/xcaddy 安装即可:
bleem ? ~ go get -u github.com/caddyserver/xcaddy/cmd/xcaddygo: downloading github.com/caddyserver/xcaddy v0.1.7go: found github.com/caddyserver/xcaddy/cmd/xcaddy in github.com/caddyserver/xcaddy v0.1.7go: downloading github.com/Masterminds/semver/v3 v3.1.0go: github.com/Masterminds/semver/v3 upgrade => v3.1.1go: downloading github.com/Masterminds/semver/v3 v3.1.1.....安装完成后应当在命令行可以直接执行 xcaddy 命令:
# xcaddy 并没有提供完善的命令行支持,所以 `--help` 报错很正常bleem ?  ~ xcaddy --helpgo: cannot match "all": working directory is not part of a module2021/01/07 12:15:56 [ERROR] exec [go list -m -f={{if .Replace}}{{.Path}} => {{.Replace}}{{end}} all]: exit status 1:编译 Caddy2编译之前系统需要安装 jq、curl、git 命令,没有的请使用
apt install -y curl git jq 命令安装;
自行编译的目的是增加第三方插件方便使用,其中官方列出的插件可以从 Download 页面获取到:
一个比 Nginx 功能更强大的 Web 服务器

文章插图
 
其他插件可以从 GitHub 上寻找或者自行编写,整理好这些插件列表以后只需要使用 xcaddy 编译即可:
# 获取最新版本号,其实直接去 GitHub realse 页复制一下就行# 这里转化为脚本是为了方便自动化export version=$(curl -s "https://api.github.com/repos/caddyserver/caddy/releases/latest" | jq -r .tag_name)# 使用 xcaddy 编译xcaddy build ${version} --output ./caddy_${version}         --with github.com/abIOSoft/caddy-exec         --with github.com/caddy-dns/cloudflare         --with github.com/caddy-dns/dnspod         --with github.com/caddy-dns/duckdns         --with github.com/caddy-dns/gandi         --with github.com/caddy-dns/route53         --with github.com/greenpau/caddy-auth-jwt         --with github.com/greenpau/caddy-auth-portal         --with github.com/greenpau/caddy-trace         --with github.com/hairyhenderson/caddy-teapot-module         --with github.com/kirsch33/realip         --with github.com/porech/caddy-maxmind-geolocation         --with github.com/caddyserver/format-encoder         --with github.com/mholt/caddy-webdav


推荐阅读