Caddy一个简单高效的web服务器

3,680 阅读3分钟

什么是Caddy

Caddy是一个现代HTTP/2网络服务器与软件包管理器。它是开源的,易于使用,快速和安全。Caddy支持自动HTTPS,HTTP/2,优雅重载和中间件。作为软件包管理器,Caddy可以轻松安装和移除软件包。Caddy支持跨平台,可以在Windows,Mac和Linux上运行。Caddy有一个活跃的开源社区。

与其他Web服务器比较

与Apache和Nginx相比,Caddy的优点在于:

  1. 自动HTTPS - Caddy可以自动为您的网站获取和续订免费SSL证书。Apache和Nginx需要手动配置。
  2. HTTP/2支持 - Caddy默认支持HTTP/2,可大大提高网站性能。Apache和Nginx需要手动启用HTTP/2。
  3. 简单配置 - Caddy使用简单的Caddyfile进行配置,而Apache和Nginx的配置比较复杂。
  4. 中间件支持 - 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

image.png 正常输出版本信息,表示安装已经成功。

web服务

配置web服务需要找到Caddyfile文件,查看文件内容:

vi /etc/caddy/Caddyfile

image.png

默认文件已经帮你配置了web服务,表示监听本地的 80 端口,将请求的文件从 /usr/share/caddy 目录中获取,使用 file_server 插件提供服务。浏览器直接输入ip就已经可以访问了。

image.png

如果要绑定域名,可以把:80替换成你的域名,首先得确保你的域名已经正确的解析到服务器,假设我的域名是web.local,改成如下:

image.png

配置完成,重新加载配置。

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更新所有软件包