更好用的 Web 服务器：Caddy

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169726/e0a01e1f-ef64-68e6-912c-35e062ed741e.png)

双 11 买了一台阿里云vps ，新vps当然要用新工具武装下。

## What is Caddy 

[Caddy](https://caddyserver.com/) 首先是一个用Go实现的Web Server。

在追求性能的道路上，nginx已经一骑绝尘。这种情况下诞生的 Caddy有什么特性呢？

Caddy的作者Matt Holt有这样的理念： 其他Web Server为Web而设计，Caddy为human设计。一句话就是 Caddy主打易用性，使用配置简单。

Caddy有下面这些开箱即用的特性:

- 全自动支持HTTP/2协议，无需任何配置。
- Caddy 使用 Let’s Encrypt 让你的站点全自动变成HTTPS，无需任何配置。
- 合理使用多核多核 得益于go的特性
- 完全支持IPv6环境
- Caddy 对WebSockets有很好的支持
- 自动把Markdown转成 HTML
- Caddy 对log格式的定义很容易
- 易于部署 得益于go的特性，caddy只是一个小小的二进制文件，没有依赖，很好部署
- 得益于Go的跨平台特性，Caddy很容易的支持了三大主流系统：Windows、 Linux、Mac

> “几乎所有的功能在Caddy里的都是插件，HTTP服务器是插件，高级的TLS特性也是插件，每一行命令实现的功能都是一个插件” 


## 一键安装 Caddy

```shell
CADDY_TELEMETRY=on curl https://getcaddy.com | bash -s personal
```

显示如下内容 caddy已经安装成功

```console
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  7380  100  7380    0     0   6897      0  0:00:01  0:00:01 --:--:--  6897

Downloading Caddy for linux/amd64 (personal license)...

Download verification OK
Extracting...
Putting caddy in /usr/local/bin (may require password)
Caddy v1.0.3 (h1:i9gRhBgvc5ifchwWtSe7pDpsdS9+Q0Rw9oYQmYUTw1w=)
Successfully installed
```

## 配置 Caddy

```shell
sudo mkdir -p /etc/caddy # 配置文件夹
sudo touch /etc/caddy/Caddyfile
```

`Caddyfile`写入以下内容，格式还是比较简单的

```conf:Caddyfile
example.com:80
gzip
log /var/log/caddy/access.log
root /var/www
tls tls@outlook.com
```

**首先第一行必须是网站的地址**

第2行的 `gzip` 是一个指令，表示打开 gzip 压缩功能，这样网站在传输网页时降低流量

第3行的 `log` 指令会为网站开启 log 功能，log 后的参数是log 文件的存放位置

第4行的 `root` 是指定网站的根目录

第5行的 `tls` 指令告诉 caddy 为网站开启 https 并自动申请证书，后面的 email 参数是告知 CA 申请人的邮箱。caddy 会默认使用 let's encrypt 申请证书并续约。
tls 也可以使用路径给出的证书 `tls /etc/ssl/cert.pem /etc/ssl/key.pem` 

如何设置多站点访问呢？

```conf:Caddyfile
example.com:80 {
  gzip
  log /var/log/caddy/access.log
  root /var/www
  tls /etc/ssl/cert.pem /etc/ssl/key.pem
}
example2.com:3000{
  gzip
  log /var/log/caddy/example2/access.log
  root /var/www/example2
  tls /etc/ssl/example2/cert.pem /etc/ssl/example2/key.pem
}
```

基本的 caddy 配置就这些，详细的内容可以去官网上[看文档](https://caddyserver.com/docs)学习 

## 反向代理

```conf:Caddyfile
http://www.example.com {
  ## HTTP 代理配置
  ### 此时访问 example.com，实际访问的是 127.0.0.1:8080/app/ 的内容
  proxy / 127.0.0.1:8080/app/

  ## WebSocket 代理配置
  ### 客户端请求的 wss://example.com/app/websocket, 实际为 wss://127.0.0.1:8080/app/websocket
  proxy /app/websocket 127.0.0.1:8080 {
    websocket
  }
}
```

##  负载均衡简单配置

```conf:Caddyfile
proxy / web1.local:80 web2.local:90 web3.local:100 { 
  policy round_robin 
}
```

用反向代理命令` proxy` 将请求循环转发到 80、90、100 三个后端服务，通过 policy 命令控制策略为 `round_robin`，以循环方式选择后端服务。

## 已守护进程的方式启动 daemon
有3种

- `nohup caddy &`

- 下载 [hook.service](https://caddyserver.com/v1/docs/hook.service) 插件

- systemd

使用的是官方提供的脚本 [caddy.service](https://github.com/mholt/caddy/blob/master/dist/init/linux-systemd/caddy.service)，其他系统也可以在[这里](https://github.com/mholt/caddy/tree/master/dist/init)找到相应的脚本。

把这个文件下载到 `/etc/systemd/system/` 

```shell
sudo curl -s  https://raw.githubusercontent.com/caddyserver/caddy/v1.0.3/dist/init/linux-systemd/caddy.service -o /etc/systemd/system/caddy.service
```

需要重新加载 systemd daemon，让配置生效 ， `sudo systemctl daemon-reload`。

设置 Caddy 开机启动
`sudo systemctl enable caddy.service` 

## 开启 http2

https://sqh.me/tech/quick-start-http2-proxy/
https://makazeu.win/post/caddy/

要申请ssl证书  先挖坑

---

参考：

https://tonybai.com/2015/06/04/caddy-a-web-server-in-go/
https://github.com/golang/go/wiki/Ubuntu
https://zhuanlan.zhihu.com/p/25815245
https://www.zybuluo.com/zwh8800/note/844776
https://zixizixi.cn/caddyserver-r-proxy-https
https://www.giuem.com/caddy-tutorial-for-debian/
https://github.com/hacdias/caddy-service