什么是Caddy
Caddy是一个现代HTTP/2网络服务器与软件包管理器。它是开源的,易于使用,快速和安全。Caddy支持自动HTTPS,HTTP/2,优雅重载和中间件。作为软件包管理器,Caddy可以轻松安装和移除软件包。Caddy支持跨平台,可以在Windows,Mac和Linux上运行。Caddy有一个活跃的开源社区。
与其他Web服务器比较
与Apache和Nginx相比,Caddy的优点在于:
- 自动HTTPS - Caddy可以自动为您的网站获取和续订免费SSL证书。Apache和Nginx需要手动配置。
- HTTP/2支持 - Caddy默认支持HTTP/2,可大大提高网站性能。Apache和Nginx需要手动启用HTTP/2。
- 简单配置 - Caddy使用简单的Caddyfile进行配置,而Apache和Nginx的配置比较复杂。
- 中间件支持 - Caddy有丰富的中间件支持。Apache和Nginx的模块相对较少。
但是,Caddy的社区和文档资源相对较少,不如Apache和Nginx丰富。Caddy的性能也略低于Nginx。所以按需选择。
安装Caddy
你可以在caddyserver.com下载Caddy的可执行文件。将其放在PATH下或直接运行。也可以使用包管理器安装:
# macOS
brew install caddy
# Ubuntu
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
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
# Windows
choco install caddy
安装完成执行:
caddy version
正常输出版本信息,表示安装已经成功。
web服务
配置web服务需要找到Caddyfile文件,查看文件内容:
vi /etc/caddy/Caddyfile
默认文件已经帮你配置了web服务,表示监听本地的 80 端口,将请求的文件从 /usr/share/caddy 目录中获取,使用 file_server 插件提供服务。浏览器直接输入ip就已经可以访问了。
如果要绑定域名,可以把:80替换成你的域名,首先得确保你的域名已经正确的解析到服务器,假设我的域名是web.local,改成如下:
配置完成,重新加载配置。
caddy reload
然后就可以直接使用域名访问了,而且默认已经帮你配置了SSL证书,打开http会重定向到https访问,是不是极其的方便简单?当然需要提前将你的域名 DNS 服务器转移到指定服务商,Caddy 支持以下 DNS 服务商。
cloudflare、cloudxns、dnspod、gandi/gandiv5、godaddy、namecheap、vultr、googlecloud、auroradns、azure、digitalocean、dnsimple、dnsmadeeasy、dyn、lightsail、linode、ns1、namedotcom、ovh、otc、pdns、rackspace、rfc2136、route53
反向代理
如果你的后端程序启动了某个端口的api服务,如nodejs中express启动的3000端口,这个时候就需要配置反向代理。如我的域名web2.local代理到3000端口,配置如下:
web2.local {
reverse_proxy 127.0.0.1:3000
}
也可以对某个路径进行代理,如:
web2.local {
# 匹配到路径带/api的都会代理到 http://127.0.0.1:3000/api/*
handle /api/* {
reverse_proxy 127.0.0.1:3000
}
# handle_path不会保留原有路径,下面代理会去除/user,这一点跟handle不同
handle_path /user/* {
reverse_proxy 127.0.0.1:3000
}
}
通过反向代理,我们可以处理前端的跨域问题,假设前端开发打包文件放在/usr/share/caddy/dist目录下,而后端启动的接口服务是3000端口,可以配置到同一个域名下解决跨域问题。如
web2.local {
root * /usr/share/caddy/dist
file_server
handle /api/* {
reverse_proxy 127.0.0.1:3000
}
}
实际上,这种解决跨域问题方法跟webpack、vite等前端工具处理跨域的原理是一样的。
常用命令
| 命令 | 描述 |
|---|---|
| caddy run | 启动Caddy服务器 |
| caddy reload | 重载Caddy服务器 |
| caddy stop | 优雅地停止Caddy服务器 |
| caddy install | 安装软件包 |
| caddy uninstall | 卸载软件包 |
| caddy update | 更新所有软件包 |