Caddy server

Caddy 是一个使用 Go 编写的高性能 HTTP 服务器软件。与 Nginx 相似,它主要作为静态网站服务器或反向代理运行。

优点

  • 高性能
  • 简洁的配置文件
  • 全自动 HTTPS (Let's Encrypt)

安装

Caddy 官方为 Linux, Windows, FreeBSD 提供预编译二进制,为主流发行版提供软件包。(见官方安装文档

如果使用 Arch Linux,sudo pacman -S caddy 即可安装 Caddy,含 systemd 服务。

启动服务

启动 Caddy 服务:

sudo systemctl start caddy

(或者改用 enable --now 同时将服务设置为自动启动)

配置文件

Caddy 的配置可以通过几种方式进行:

  • 名为 Caddyfile 的文本配置文件
  • 在服务运行时,通过 HTTP 协议的 admin API 更改配置
  • 因为 config adapter 的存在,Caddy 支持更多奇怪的配置:
    • JSON、YAML、TOML 格式的配置文件
    • Nginx 的配置文件

本文使用 Caddyfile 作为配置方式。

Caddyfile 的路径在 /etc/caddy/Caddyfile(如果使用默认 systemd 服务配置),修改 Caddyfile 文件后,可以通过 systemctl 加载新的配置:

sudo systemctl reload caddy

常用配置

静态网站

网站 yuuza.net,提供 /srv/mysite 作为静态内容

Caddyfile:

yuuza.net {
    root * /srv/mysite
    file_server
}

Caddy 将会自动为 yuuza.net 申请 TLS 证书。申请成功的前提是,在公网上访问 yuuza.net 到达的服务器就是 Caddy 所在服务器(即域名解析正确,并且 IP 能从公网访问)。并且会自动将 80 端口上的 HTTP 请求跳转到 HTTPS。

“虚拟主机”

Caddy 支持服务多个域名

Caddyfile:

yuuza.net {
    root * /srv/mysite
    file_server
}

blog.yuuza.net {
    root * /srv/myblog
    file_server
}

反向代理

将请求反向代理到 127.0.0.1:5000

Caddyfile:

api.yuuza.net {
    reverse_proxy 127.0.0.1:5000
}

按路径分流

/api/* 反向代理到 127.0.0.1:5000,对其它路径上的请求提供 /srv/mysite 里的文件 Caddyfile:

yuuza.net {
    reverse_proxy /api/* 127.0.0.1:5000
    
    root * /srv/mysite
    file_server
}

路径修改

使用上面的配置文件时,https://yuuza.net/api/myip 将会被反代到 127.0.0.1:5000 端口上的 /api/myip。如果需要将它反代到 /myip,就要去除路径开头的 /api

Caddyfile:

yuuza.net {
    handle /api/* {
        uri strip_prefix /api
        reverse_proxy * 127.0.0.1:5000
    }
    
    root * /srv/mysite
    file_server
}

Caddyfile:

yuuza.net {
    @dev {
        header x-version dev
    }

    handle @dev {
        root * /srv/mysite-dev
        file_server
    }

    root * /srv/mysite
    file_server
}

客户端携带 x-version: dev HTTP 头时,访问到 /srv/mysite-dev(测试环境),否则访问到 /srv/mysite(正式环境)