---
title: "快速上手更简单的 Web 服务器 —— Caddy"
date: 2017-09-19 16:23:00
tags: [caddy]
---

![Caddy](https://wx2.sinaimg.cn/mw1024/49fcaea6gy1fjp0hua3q1j20yp0l7dzc.jpg)

说到Web 服务器，我们大多想到的是 Apache 这个老前辈和如日中天的Nginx，但是这里今天我将要分享的是 Web 服务器和反向代理服务器的新秀 Caddy。在我们拥有了这么强大的 Nginx 以后我们为什么还需要 Caddy？  
我认为 Caddy 之所以可以占有一席之地是因为它的两大法宝：`配置简单` 和 `自动启用 HTTPS`。下面带下面快速上手这个软件。

## 安装

Caddy 提醒定制化的下载，可以自由选择各种插件和平台。请前往: <https://caddyserver.com/download> 下载。 也可以使用这个一键安装脚本：

```bash
curl https://getcaddy.com | bash
```

完成之后，我们可以尝试执行下`caddy -version`。 当你看到有有类似：`Caddy 0.10.9`，即表示安装成功。

## Hello World

在命令行里面直接输入`caddy`，然后打开浏览器输入： `http://ip:2015`。 看到什么了吗？ 你得到了一个404页面。Caddy 已经成功运行了。相比与其他浏览器需要各种配置文件才能运行相比，这就是 Caddy 的简单之处，不需要任何配置文件即可运行。当然当我们需要各种高级功能的时候，配置文件还是必不可少的。

默认情况下，Caddy 运行在`2015` 端口。我们可以可以 Caddy 强大的命令行工具来自定义运行端口。

```bash
caddy -p 80
```

在无配置文件的情况下，Caddy 默认是映射当前程序执行的目录所有文件。因此我们可以快速创建一个文件：

```bash
echo "Hello Caddy" >> index.html
```

再次刷新浏览器，刚才我们写的 `Hello Caddy` 已经出现在页面上了

## 强大的配置文件

Caddy 各种强大的功能还得需要 Caddyfile 体现。我们可以在任意目录放置我们的配置文件,通过命令行`caddy -conf` 即可指定

### Host 目录下的网页

```plaintext
0.0.0.0:8080 {
  root /usr/local/www/
}
```

这里简单解释下，`0.0.0.0` 表示我们将网站绑定至可以访问到本机的任意一个 IP；`8080`表示我们将网站暴露在8080端口； `root` 参数则表示网站的根节点。这就是最简单的一个Host 网站的配置。

当前我们可以对网站添加更多的配置。比如设置响应过期时间，启用 gzip, 指定各种日志的输出端。

```bash
0.0.0.0:8080 {
  root /usr/local/www/
  timeouts 30s
  gzip
  log /var/log/caddy/access.log
  errors /var/log/caddy/error.log
}
```

### 配置反向代理

什么时候你会需要反向代理呢？想象你有一个前后端分离的程序。前端是通过 JS 发送 Ajax 请求后端 API。默认情况下前端程序占用一个端口，后端占用一个另外端口。我们会遇到两个问题： CORS（跨域请求）和额外的 Options 请求。 这个时候我们就可以使用反向代理让前端和后端共享一个端口。

那怎么做呢，在 Caddy 里面也特别简单，假设我们的前端就是上面的那样，而我们的后面之前都运行在：`http://ip:4000` 下面。而且我们的 后端 API URL 里面都有 `/api`

```bash
0.0.0.0:8080/api {
    proxy / 127.0.0.0:4000/api {
        transparent
    }
}
```

这里的配置的意思是说，当浏览器收到所有包含`:8080/api` 的请求都会自动转发到`127.0.0.1:4000/api` 这个地址，而`:8080/api` 后面的地址会自动转发下去，而`transparent` 这个设置保证了我们的转发不会在浏览器生成任何额外的`301` 或者`302`请求。

## 自动 HTTPS

Caddy 另外一个亮点就是，可以为已经`绑定域名`的在`公网`运行的服务器自动从 Let’s Encrypt生成和下载 HTTPS 证书，让你的网站支持 HTTPS 协议访问，保证网站数据传输的安全。很简单，你所需的仅仅是将绑定的 IP 改成域名。

```bash
xxx.com {
  root /usr/local/www/
}
```

再次运行Caddy，按照提示输入你的 Email 之后。Caddy 会自动帮你获取并启用 HTTPS 证书。

```bash
root@ss2:~# caddy -conf Caddyfile
Activating privacy features...
Your sites will be served over HTTPS automatically using Let's Encrypt.
By continuing, you agree to the Let's Encrypt Subscriber Agreement at:
  https://acme-v01.api.letsencrypt.org/terms
Please enter your email address so you can recover your account if needed.
You can leave it blank, but you'll lose the ability to recover your account.
Email address: xxxx@gmail.com
 done.
https://xxx.com
http://xxx.com
```

## 总结

通过上面的例子，我们可以看出 Caddy的快速上手能力和超级实用的 HTTPS 功能。除此之前 Caddy 还提供一大堆的插件供我们使用。比如直接访问 Markdown 文件、Host Git 仓库的文件、将自身 Metric 数据传到 Prometheus 等等。快去试试吧！
