Caddy2安装配置

前言

以下是在一台128MB单核的VPS 上部署一个应用,然后分别用Caddy、 SSLDocker、Nginx做前端,反向代理到该应用端口, 在另外一台VPS 做并发请求。开启ssl、gzip,使用 hey 做并发请求:

1
./hey -n=20000 -c=5 https://mydomain.com/

从 Requests per second (RPS)看:

Caddy 308 < SSLDocker 317 < Nginx 345

三者相差不大,Nginx 和SSLDocker 稍有优势。

性能上Nginx优于Caddy和SSLDocker,但是Caddy、 SSLDocker 都能自动配置并且更新HTTPS。

没有上 CDN, 用 Caddy 自动配置,续费证书很方便

但是有了 CDN,CDN上也需要一套证书, 这样一来,不管如何,证书都是要手动处理, 那这样一对比,Caddy 几乎没有什么压倒性的优势了,而且 Caddy 的生态不如 Nginx 成熟

个人站点建议用Caddy,企业站点用Nginx。

安装

官方网址

https://caddyserver.com/docs/install

本文使用的是Caddy2

Caddy配置升级指南

https://caddyserver.com/docs/v2-upgrade

Ubuntu

1
2
3
4
5
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo apt-key add -
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee -a /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy

CentOS

1
2
3
yum install yum-plugin-copr
yum copr enable @caddy/caddy
yum install caddy

查看是否安装成功

1
caddy version

启动

1
2
3
sudo systemctl daemon-reload
sudo systemctl enable caddy
sudo systemctl start caddy

验证是否启动

1
systemctl status caddy

配置文件路径

/etc/caddy/Caddyfile

修改配置后 重新加载配置

1
systemctl reload caddy

常见配置

引用配置文件

1
import /etc/caddy/vhosts/*

HTTPS

1
2
3
4
www.makeshuo.cn {
root * /data/myblog
file_server
}

注意

如果不写端口 默认会自动使用SSL证书,并且端口号为443

1
2
3
4
www.makeshuo.cn:8888 {
root * /data/test
file_server
}

注意

就算写了端口号,只要不是80,也会使用SSL证书。

注意一个域名下的子域名都是可以申请证书的,但是第一个申请的速度较快,后续的会稍慢点。因为这个原因我差点以为它一个域名只能申请一个。

HTTP

如果不想使用SSL证书,单纯的HTTP访问有以下两种方式

1
2
3
4
www.makeshuo.cn:80 {
root * /data/myblog
file_server
}

或者

1
2
3
4
http://www.makeshuo.cn {
root * /data/myblog
file_server
}

或者

1
2
3
4
http://www.makeshuo.cn:8888 {
root * /data/test
file_server
}

自定义SSL证书

1
2
3
4
5
www.psvmc.cn {
root * /data/myblog
tls /etc/caddy/cert/psvmc.pem /etc/caddy/cert/psvmc.key
file_server
}

同时映射多个地址

1
2
3
4
5
6
7
localhost:8888,
psvmc.cn,
www.psvmc.cn {
root * /data/myblog
tls /etc/caddy/cert/psvmc.pem /etc/caddy/cert/psvmc.key
file_server
}

反向代理

1
2
3
www.psvmc.cn {
reverse_proxy localhost:9000
}

负载均衡

1
2
3
4
5
www.psvmc.cn {
reverse_proxy localhost:9000 localhost:9001 {
lb_policy first
}
}

Websocket反向代理

1
2
3
4
5
6
7
8
9
ws.psvmc.cn {
## HTTP 代理配置
## 此时访问 ws.psvmc.cn,实际访问的是 127.0.0.1:8080/app/ 的内容
reverse_proxy / 127.0.0.1:8080/app/

## WebSocket 代理配置
## 客户端请求的 wss://ws.psvmc.cn/ws, 实际为 wss://127.0.0.1:8080/ws
reverse_proxy /ws 127.0.0.1:8080
}

注意

Websocket proxying “just works” in v2; there is no need to “enable” websockets like in v1.

跨域访问

1
2
3
4
5
6
7
8
9
(cors) {
@origin header Origin {args.0}
header @origin Access-Control-Allow-Origin "{args.0}"
header @origin Access-Control-Request-Method GET
}

www.psvmc.cn {
import cors www.baidu.com
}

可使用的地址格式

  • localhost
  • localhost:8080
  • 127.0.0.1
  • :443
  • [::1]:8080
  • http://example.com
  • example.com
  • example.com/foo/*
  • *.example.com
  • example.com:8888

注意1:

Automatic HTTPS is enabled if your site’s address contains a hostname or IP address. This behavior is purely implicit, however, so it never overrides any explicit configuration. For example, if the site’s address is http://example.com, auto-HTTPS will not activate because the scheme is explicitly http://.

Traefik-v2.x

TraefikNginx 一样,是一款优秀的反向代理工具,或者叫 Edge Router。至于使用它的原因则基于以下几点

  • 无须重启即可更新配置
  • 自动的服务发现与负载均衡
  • docker 的完美集成,基于 container label 的配置
  • 漂亮的 dashboard 界面
  • metrics 的支持,对 prometheusk8s 的集成

各大网关对比

支持公司 实现语言 亮点 不足
Nginx(2004) Nginx Inc C/Lua 高性能,成熟稳定 门槛高,偏运维,可编程弱
Zuul1(2012) Netflix/Pivotal Java 成熟 门槛较高
Spring Cloud Gateway(2016) Pivotal Java 异步,配置灵活 早期产品
Envoy(2016) Lyft C++ 高性能,可编程API/ServiceMesh集成 门槛较高
Kong(2014) Kong Inc OpenResty/Lua 高性能,可编程API 门槛较高
Traefik(2015) Containous Golang 云原生,可编程API/对接各种服务发现 生产案例不太多

Zuul和Spring Cloud Gateway结合Spring Cloud全家桶结合使用效果较好。

参见:

我为什么要选择Traefik2做网关?

Traefik-v2.x快速入门

免费申请SSL证书

Let’s Encrypt