HTTP/1.1
6 条 TCP 连接每条连接各自握手
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 超过并发上限的请求要排队
- 连接内串行,一个慢请求堵住一条连接
用 Go 实现,官方提供 Docker 镜像,证书由公共 CA 签发,与更多项目协同工作。
配置现场
Caddyfile 只描述你要什么。证书、跳转、压缩、协议协商都不必写出来,因为它们本来就开着。
example.com {
root * /var/www/example
file_server
encode gzip
}Caddy 的原生配置是 JSON,Caddyfile 只是它的一种写法。
Caddy 自动完成
把一个目录以 HTTPS 提供出去,并顺带压缩与跳转。
example.com {
root * /var/www
file_server
encode gzip
}server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
http2 on;
server_name example.com;
root /var/www;
gzip on;
gzip_types text/plain text/css application/json;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_session_cache shared:SSL:10m;
location / {
try_files $uri $uri/ =404;
}
}两者的能力并不等价:nginx 侧还需要额外的工具去申请证书,并配置定时任务完成续期。Caddy 把这部分放进了服务器内部,作为默认行为的一部分。
协议
不需要开关,也不需要额外的模块。客户端支持哪个就用哪个,握手的时候谈好。
8 个资源 · 共享时间轴 · 时序为示意,非基准测试数据
每条连接各自握手
1 次 TLS 握手
0-RTT 恢复
公网域名向公共 ACME CA 申请证书,内网域名与 IP 由 Caddy 自己的本地 CA 签发。证书在到期前于后台续期,不影响在线请求。
编译到所有主流平台,运行时没有外部依赖。
$ file caddy
ELF 64-bit, statically linked
$ ldd caddy
not a dynamic executable
从 HTTP 处理器到存储介质都是模块,按需编译进二进制。
通过管理端点换配置,零停机;新配置有问题就回滚到上一份。
curl -X POST localhost:2019/load \
-H "Content-Type: application/json" \
-d @caddy.json原生配置是 JSON,配置适配器可以把别的格式转成它。
数万亿
已服务的 HTTPS 请求
数百万
纳管的 TLS 证书
数十万
单个实例可承载的站点
多个 Caddy 实例共用同一份存储时,会自动协同证书管理,组成集群。规模数据来自官方项目说明。
挑一个顺手的方式。官方包只含标准模块,需要插件时用 xcaddy 从源码构建。
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' \
| sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' \
| sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy官方包会自动以名为 caddy 的 systemd 服务启动运行。