Caddy
Caddy 是一款功能强大,扩展性高的 Web 服务器。它有以下几个特点:
- 配置简单,使用 Caddyfile 文件来定义站点和服务。
- 支持自动化 HTTPS 配置,能自动申请和续期证书,并默认启用 HTTP/2 协议。
- 支持在线配置 API ,可以动态修改配置而无需重启。
- 支持插件架构,可以通过安装不同的模块来扩展功能。
- 采用 Go 语言编写,内存安全更有保证。
caddy 安装
配置域名SSL证书的方式
- 自动申请和配置 Let’s Encrypt 的免费证书。 这是 Caddy 的默认行为,只需要在 Caddyfile 中指定域名,Caddy 就会自动申请和配置 SSL 证书,并且自动续期。caddy
example.com { # 其他指令 }
- 手动从证书发行方申请证书,然后在 Caddy 配置中指定证书和秘钥文件路径。 这种方式适用于已经拥有了自己的 SSL 证书,或者想要使用其他的证书发行方。caddy
example.com { tls /path/example.com.crt /path/example.com.key # 其他指令 }
- 主机自动申请方式。 如果目标域名(例如: example.com)已经解析到了本机,那么 Caddy 启动后会尝试自动通过 ACME HTTP 申请证书。这种方式不需要在 Caddyfile 中写任何 tls 指令,但是需要保证域名解析正确,并且端口 80 和 443 没有被占用。caddy
example.com { # 其他指令 }
注意第一种和第三种的区别:
- 第一种是在 Caddyfile 中指定了域名,而第三种是没有指定域名,而是使用主机名作为域名。这意味着,如果主机有多个域名解析到它,那么第三种方式会为每个域名申请证书,而不是只为想要的那个域名申请证书。所以,如果想要控制哪些域名使用 SSL 证书,最好还是在 Caddyfile 中明确指定。
HTTP 重定向 HTTPS
- 如果是使用 Caddy 自动申请的 SSL 证书,那么 Caddy 会默认监听 80 端口和 443 端口,并且自动将 HTTP 请求重定向到 HTTPS。不需要做任何额外的配置。
- 如果是手动指定 SSL 证书和密钥来配置的话,Caddy 只会监听 443 端口,并不会自动设置 80 端口的重定向。如果要做重定向的话,可以在 Caddyfile 中添加一个 redir 指令,指定重定向的目标和状态码。例如:caddy
http://example.com { redir https://example.com{uri} 301 } https://example.com { tls /path/example.com.crt /path/example.com.key # 其他指令 }
示例-使用caddy配置web服务器托管静态页面
假设域名是 example.com
- 将静态文件放在 /var/www/html 目录
- 配置Caddyfilecaddy
example.com { root * /var/www/html file_server }
- 访问
example.com
,Caddy 就会提供静态页面,并且自动申请和配置 HTTPS 证书
示例-使用caddy配置api网关反向代理多个后端并使用path路由区分不同的后端服务
- 使用 handle_path 指令,可以将请求的路径前缀去掉,然后将请求转发给指定的后端服务。例如:
caddy
example.com {
handle_path /api/* {
reverse_proxy 127.0.0.1:9000
}
handle_path /web/* {
reverse_proxy 127.0.0.1:9001
}
}
- 使用 uri 指令,可以修改请求的路径,然后使用 reverse_proxy 指令转发给指定的后端服务。例如:
caddy
example.com {
uri /api/* strip_prefix /api
reverse_proxy /api/* 127.0.0.1:9000
uri /web/* strip_prefix /web
reverse_proxy /web/* 127.0.0.1:9001
}
示例-caddy配置cors
- 使用 cors 指令,可以简单地添加 CORS 授权到响应头中。例如:
caddy
example.com {
cors
# 其他指令
}
- 使用 header 指令,可以手动地添加 CORS 相关的响应头。例如:
caddy
example.com {
header Access-Control-Allow-Origin *
header Access-Control-Allow-Methods "GET, POST, OPTIONS"
header Access-Control-Allow-Headers "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range"
# 其他指令
}