0. 什么是 Caddy

Caddy 服务器是一个开源的,使用 Golang 编写,支持 HTTP/2 的 Web 服务端。它使用 Golang 标准库提供 HTTP 功能。 Caddy 一个显著的特性是默认启用HTTPS。它是第一个无需额外配置即可提供 HTTPS 特性的Web 服务器。

以下是基于 Ubuntu 18.04 的安装说明:

1. 安装

你可以直接从 Download Caddy 这里下载,选择好的你平台和插件就可以直接下载运行了。

当然,我比较推崇第二种方式,就是使用 https://getcaddy.com/ 的脚本安装。 官方不推进使用 root 权限来安装运行 caddy,所以我们直接使用普通用户权限执行以下命令即可。

$ curl https://getcaddy.com | bash -s personal

Caddy 有个人授权和商业授权,一般个人使用直接用个人授权版本就行。商业授权是需要收费的。如果你需要安装插件的话,语法如下:

$ bash -s [personal|commercial] [plugin1,plugin2,...] [accessCode1,accessCode2...]

像我需要用到 http.filemanager / http.authz / http.login / http.minify / tls.dns.dnspod,命令和执行结果如下:

$ curl https://getcaddy.com | bash -s personal http.filemanager,http.authz,http.login,http.minify,tls.dns.dnspod
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  7380  100  7380    0     0  12058      0 --:--:-- --:--:-- --:--:-- 12058
Downloading Caddy for linux/amd64 (personal license)...
Download verification OK
Extracting...
Backing up /usr/local/bin/caddy to /usr/local/bin/caddy_old
(Password may be required.)
Putting caddy in /usr/local/bin (may require password)
Caddy 0.11.0 (non-commercial use only)
Successfully installed

关于插件的说明请参考 Caddy User Guide

2. 运行

直接在终端脚本中执行 caddy 命令,默认会使用脚本当前目录作为 web root 的目录,并且会自动监听 2015 端口请求,如下:

$ cd ~/home
$ caddy

在浏览器中执行 http://localhost:2015/ ,就可以用户目录下面的文件了。

3. 配置

3.1 临时服务器

Caddy 的配置文件叫做Caddyfile,Caddy 不强制你把配置文件放到哪个特定文件夹,默认情况下,把 Caddyfile 放到当前目录就可以跑起来了,如下:

$ echo 'localhost:8888' >> Caddyfile
$ echo 'gzip' >> Caddyfile
$ echo 'browse' >> Caddyfile
$ caddy

3.2 生成环境配置

在生产环境使用的时候就不能这么草率的把配置文件放到当前目录了,一般情况下会放到 /etc/caddy 里。

$ sudo mkdir /etc/caddy
$ sudo touch /etc/caddy/Caddyfile
$ sudo chown -R root:www-data /etc/caddy

除了配置文件,caddy 会自动生成 ssl 证书,需要一个文件夹放置 ssl 证书。

$ sudo mkdir /etc/ssl/caddy
$ sudo chown -R www-data:root /etc/ssl/caddy
$ sudo chmod 0770 /etc/ssl/caddy

因为 ssl 文件夹里会放置私钥,所以权限设置成 770 禁止其他用户访问。 最后,创建一下放置网站文件的目录,如果已经有了,就不需要创建了。

$ sudo mkdir /var/www
$ sudo chown www-data:www-data /var/www

创建好这些文件和目录了之后,我们需要把 caddy 配置成一个服务,这样就可以开机自动运行,并且管理起来也方便。因为目前大多数发行版都使用 systemd 了,所以这里只讲一下如何配置 systemd,不过 caddy 也支持配置成原始的 sysvinit 服务,具体方法 看这里

$ sudo curl -s https://raw.githubusercontent.com/mholt/caddy/master/dist/init/linux-systemd/caddy.service -o /etc/systemd/system/caddy.service   # 从 github 下载 systemd 配置文件
$ sudo systemctl daemon-reload        # 重新加载 systemd 配置
$ sudo systemctl enable caddy.service # 设置 caddy 服务自启动
$ sudo systemctl status caddy.service # 查看 caddy 状态

4. Caddyfile

基本的安装配置搞定之后,最重要的就是如何写 Caddyfile了。可以直接 vim /etc/caddy/Caddyfile 来修改 Caddyfile,也可以再自己电脑上改好然后 rsync 到服务器上。如果修改了 Caddyfile 发现没有生效,是需要执行一下 sudo systemctl restart caddy.service 来重启 caddy 的。

4.1 Caddyfile 的格式

Caddfile的格式还是比较简单的,首先第一行必须是网站的地址,例如:

localhost:8080

example.com

地址可以带一个端口号,那么 caddy 只会在这个端口上开启 http 服务,而不会开启 https,如果不写端口号的话,caddy 会默认绑定 80 和 443 端口,同时启动 http 和 https 服务。 地址后面可以再跟一大堆指令(directive)。Caddyfile 的基本格式就是这样,由一个网站地址和指令组成。

4.2 指令

指令的作用是为网站开启某些功能。指令的格式有三种,先说一下最简单的不带参数的指令比如:

example.com
gzip

第二行的 gzip 就是一个指令,它表示打开 gzip 压缩功能,这样网站在传输网页是可以降低流量。

第二种指令的格式是带简单参数的指令:

example.com
gzip
log /var/log/caddy/example.com.access.log
tls admin@ example.com.com
root /var/www/

第三行,log 指令会为网站开启 log 功能,log 指令后的参数告诉 caddy log 文件存放的位置。第四行的 tls 指令告诉 caddy 为网站开启 https 并自动申请证书,后面的 email 参数是告知 CA 申请人的邮箱。(caddy 会默认使用 let’s encrypt 申请证书并续约)

另外,简单参数也可能不只一个,比如 redir 指令:

example.com
gzip
log /var/log/caddy/example.com.access.log
tls admin@ example.com.com
root /var/www/
redir / https://lengzzz.com/archive/{uri} 301

上面的 redir 指令带了三个参数,意思是把所有的请求使用 301 重定向到 https://example.com/archive/xxx,这个指令在给网站换域名的时候很有用。另外 tls 指令变了,不单单传 email一个参数, 而是分别传了证书和私钥的路径,这样的话 caddy 就不会去自动申请证书,而是使用路径给出的证书了。

在这个例子里还使用了{uri}这样的占位符(placeholder),详细的列表可以在这里查询到: https://caddyserver.com/docs/placeholders

最后一种指令是带复杂参数的,这种指令包含可能很多参数,所以需要用一对花括号包起来,比如 header 指令:

example.com
gzip
log /var/log/caddy/example.com.access.log
tls admin@ example.com.com
root /var/www/
header /api {
    Access-Control-Allow-Origin  *
    Access-Control-Allow-Methods "GET, POST, OPTIONS"
    -Server
}
fastcgi / 127.0.0.1:9000 php {
    index index.php
}
rewrite {
    to {path} {path}/ /index.php?{query}
}

6-10 行的 header 指令代表为所有的 /api/xxx 的请求加上 Access-Control-Allow-OriginAccess-Control-Allow-Methods 这两个 header,从而能支持 javascript 跨域访问 ,第 9 行代表删除 Server header,防止别人看到服务器类型。

11-13 行使用了 fastcgi 指令,代表把请求通过 fastcgi 传给 php,ruby 等后端程序。

14-15 行,使用了 rewrite 指令,这个指令的作用是服务器内部重定向在下面的参数 to 后面,又跟了三个参数,这个功能上有点类似 nginx 的try_files。告诉 caddy 需要先查看网址根目录 /var/www 里有没有 {path} 对应的文件,如果没有再查看有没有 {path} 对应的目录,如果都没有,则转发给 index.php 入口文件。这个功能一般会用在 PHP 的 MVC 框架上使用。

随着一步步完善这个 Caddyfile,目前这个版本的 Caddyfaile 已经可以直接在网站中使用了。

4.3 多 HOST 网站

刚才说的一直都是单个域名的网址,那么如果在同一个服务器上部署多个域名的网站呢?很简单,只需要在域名后面跟一个花括号扩起来就可以了,如下:

example.com {
    gzip
    log /var/log/caddy/railgun_moe.log
    tls admin@example.com
    root /var/www/
    header /api {
        Access-Control-Allow-Origin  *
        Access-Control-Allow-Methods "GET, POST, OPTIONS"
        -Server
    }
    fastcgi / 127.0.0.1:9000 php {
        index index.php
    }
    rewrite {
        to {path} {path}/ /index.php?{query}
    }
}
assets.example.com {
    tls lengz@example.com
    log /var/log/caddy/assets.example.com.log
    redir / https://example.com/{uri} 301
}

到这里,Caddy 服务已经能跑起来了,基本的 Caddy 配置就这些,更多内容需要到官网文档去自行学习了。

Caddy User Guide

版本更新

要升级 Caddy 的版本也很简单,就跟安装 Caddy 一样。

$ curl https://getcaddy.com | bash -s personal

这样就会自动更新到最新版本的 Caddy 了,更新完记得执行一下 sudo systemctl restart caddy.service 来重启 caddy。

—EOF—

引用与其他资料