Caddy-Go语言Web服务器
Caddy是一款基于Go语言编写的强大且可扩展的平台,可以给你的站点、服务和应用程序提供服务。
Caddy 可能在性能上不及 Nginx,但在易用性上远远超越Nginx;性能也强于 Apache 。
概括
官网
https://caddyserver.com/
https://github.com/caddyserver/caddy
Docs
https://caddyserver.com/docs/
Docs-CN
https://caddy2.dengxiaolong.com/docs/
Community
https://caddy.community/
相较于 Nginx 来说使用 Caddy 的优势如下:
- 自动的 HTTPS 证书申请(ACME HTTP/DNS 挑战)
- 自动证书续期以及 OCSP stapling 等
- 更高的安全性包括但不限于 TLS 配置以及内存安全等
- 友好且强大的配置文件支持
- 支持 API 动态调整配置
默认情况下,Caddy通过HTTPS为所有站点提供服务。
Caddy 使用本地自动信任的自签名证书(如果允许)通过 HTTPS 提供 IP 地址和本地/内部主机名。
- 例子:
localhost
、127.0.0.1
- 例子:
Caddy使用来自公开的ACME CA的证书,通过HTTPS提供公共DNS名称,例如Let's Encrypt或者ZeroSSL.
- 例子:
example.com
、sub.example.com
、*.example.com
- 例子:
对于本地 HTTPS:
- Caddy 可能会提示输入密码以将其唯一的根证书安装到你的信任库中。每个根只发生一次;你可以随时删除它。
- 任何在不信任Caddy根目录的情况下访问该站点的客户端都会显示安全错误。
对于公共域名:
这些是任何基本生产网站的常见要求,而不仅仅是Caddy。主要区别是在运行 Caddy之前正确设置 DNS 记录,以便它可以提供证书。
- 如果你的域的A/AAAA记录指向你的服务器,
- 端口80和443对外开放,
- Caddy 可以绑定到那些端口( _或者_ 这些端口被转发到 Caddy),
- 你的data目录是可写且持久的,
- 并且你的域名出现在配置中的相关位置,
然后网站将自动通过 HTTPS 提供服务。你无需为此做任何其他事情
Docker 部署
Docker Hub
https://hub.docker.com/_/caddy
Github
https://github.com/caddyserver/caddy-docker
services:
caddy:
image: caddy:2.9-alpine
container_name: caddy-ssl
restart: always
environment:
- TZ=Asia/Shanghai
ports:
- "80:80"
- "443:443"
volumes:
- ./CaddyFile:/etc/caddy/Caddyfile
- ./data:/data
- ./config:/config
CaddyFile
dr.szkyinfo.com {
tls [email protected]
reverse_proxy 172.17.0.1:5000
}
img.szkyinfo.com {
tls [email protected]
encode gzip
reverse_proxy 172.17.0.1:5001
}
ikon-la.com,
www.ikon-la.com,
{
tls [email protected]
encode gzip
reverse_proxy 172.17.0.1:5002
}
lercai.com,
www.lercai.com,
{
tls [email protected]
encode gzip
reverse_proxy 172.17.0.1:5003
}
功能
一些常用的功能配置汇总
仅使用HTTP
example.com {
root * /var/www/html
file_server
tls off
}
http://example.com {
root * /var/www/html
file_server
}
反向代理
example.com {
reverse_proxy localhost:8080
}
静态文件
example.com {
root * /var/www/html
file_server
}
日志
example.com {
log {
output file /var/log/caddy/access.log
format single_field common_log
}
}
重定向
example.com {
redir https://newexample.com{uri}
}
缓存
Caddy 支持缓存,你可以使用 cache
指令来配置缓存服务。
example.com {
cache {
max_size 100MB
}
}
身份验证
Caddy 支持基本身份验证和 JWT 身份验证。你可以使用 basicauth 和 jwt 指令来配置身份验证。
example.com {
basicauth /admin {
user1 "password1"
user2 "password2"
}
}
模板引擎
Caddy 支持模板引擎,你可以使用 Go 模板语言来动态生成响应。
example.com {
templates
root * /var/www/html
file_server
}
WebSocket
Caddy 支持 WebSocket,你可以使用 handle_websockets
指令来配置 WebSocket 服务。
example.com {
handle_websockets /ws {
reverse_proxy localhost:8081
}
}
API网关
Caddy 可以作为 API 网关,将请求路由到不同的后端服务。你可以使用 route
和 handle
指令来配置 API 网关。
example.com {
route /api/* {
handle {
reverse_proxy localhost:8080
}
}
}
文件上传
example.com {
handle_upload /upload {
to "/var/www/uploads"
}
}
插件
Caddy 是一个高度可扩展的 Web 服务器,支持通过插件来扩展其功能。以下是一些常见的 Caddy 插件及其用途:
1. caddy-docker-proxy
用途: 自动将 Docker 容器暴露为 Caddy 站点。
描述: 这个插件允许你通过 Docker 标签自动配置 Caddy 站点,非常适合在 Docker 环境中使用。
安装:
xcaddy build --with github.com/lucaslorentz/caddy-docker-proxy/plugin/v2
2. caddy-dns
用途: 支持通过 DNS 提供商进行动态 DNS 验证。
描述: 这个插件允许 Caddy 使用 DNS 记录来验证域名所有权,从而获取 Let's Encrypt 证书。
安装:
xcaddy build --with github.com/caddy-dns/cloudflare
3. caddy-git
用途: 自动从 Git 仓库拉取网站内容。
描述: 这个插件允许 Caddy 自动从 Git 仓库拉取网站内容,非常适合持续集成和部署。
安装:
xcaddy build --with github.com/caddyserver/git
4. caddy-minify
用途: 自动压缩 HTML、CSS 和 JavaScript 文件。
描述: 这个插件可以自动压缩网站的静态资源,提高网站加载速度。
安装:
xcaddy build --with github.com/caddyserver/minify
5. caddy-l4
用途: 支持 TCP/UDP 代理。
描述: 这个插件允许 Caddy 作为 TCP/UDP 代理,非常适合需要处理非 HTTP 流量的场景。
安装:
xcaddy build --with github.com/mholt/caddy-l4
6. caddy-security
用途: 提供增强的安全功能。
描述: 这个插件提供了多种安全功能,如 OAuth2、OpenID Connect、JWT 验证等。
安装:
xcaddy build --with github.com/greenpau/caddy-security
7. caddy-json-schema
用途: 提供 JSON Schema 验证。
描述: 这个插件允许你使用 JSON Schema 来验证请求和响应,非常适合 API 开发。
安装:
xcaddy build --with github.com/RussellLuo/caddy-ext/jsonschema
8. caddy-trace
用途: 提供请求跟踪和调试功能。
描述: 这个插件允许你跟踪和调试请求,非常适合开发和调试阶段。
安装:
xcaddy build --with github.com/caddyserver/caddy-trace
9. caddy-ratelimit
用途: 提供速率限制功能。
描述: 这个插件允许你限制请求速率,防止恶意请求和 DDoS 攻击。
安装:
xcaddy build --with github.com/mholt/caddy-ratelimit
10. caddy-webdav
用途: 提供 WebDAV 支持。
描述: 这个插件允许你通过 WebDAV 协议访问和管理文件,非常适合文件共享和协作。
安装:
xcaddy build --with github.com/hacdias/caddy-webdav
11. caddy-s3browser
用途: 提供 S3 文件浏览器。
描述: 这个插件允许你通过浏览器访问和管理 S3 存储桶中的文件。
安装:
xcaddy build --with github.com/techknowlogick/caddy-s3browser
12. caddy-hugo
用途: 自动生成和部署 Hugo 静态站点。
描述: 这个插件允许你自动生成和部署 Hugo 静态站点,非常适合博客和文档站点。
安装:
xcaddy build --with github.com/hacdias/caddy-hugo
总结
Caddy 的插件生态系统非常丰富,提供了多种功能和扩展。通过这些插件,你可以轻松扩展 Caddy 的功能,满足各种复杂的 Web 服务需求。你可以根据实际需求选择合适的插件,并通过 xcaddy
工具进行安装和配置。
PHP-FPM
example.com {
root * /var/www/html
php_fastcgi unix//run/php/php7.4-fpm.sock
file_server
}
example.com {
root * /var/www/html
php_fastcgi 127.0.0.1:9000
file_server
}
伪静态
伪静态是一种将动态生成的 URL 转换为看起来像静态文件的 URL 的技术。Caddy 提供了多种方法来实现伪静态,以下是几种常见的方法。
1. 使用 rewrite
指令
rewrite
指令可以用来重写请求的 URL,使其看起来像静态文件。以下是一个示例配置,将 /post/123
重写为 /post.php?id=123
。
example.com {
rewrite /post/(\d+) /post.php?id={1}
root * /var/www/html
file_server
}
在这个配置中:
rewrite /post/(\d+) /post.php?id={1}
将/post/123
重写为/post.php?id=123
。root * /var/www/html
指定了网站的根目录。file_server
启用静态文件服务。
2. 使用 try_files
指令
try_files
指令可以用来尝试多个文件路径,直到找到一个存在的文件。以下是一个示例配置,将 /post/123
重写为 /post.php?id=123
。
example.com {
root * /var/www/html
try_files {path} /post.php?id={path_escaped}
file_server
}
在这个配置中:
try_files {path} /post.php?id={path_escaped}
尝试访问{path}
,如果不存在,则重写为/post.php?id={path_escaped}
。root * /var/www/html
指定了网站的根目录。file_server
启用静态文件服务。
3. 使用 handle
指令
handle
指令可以用来处理特定的请求路径。以下是一个示例配置,将 /post/123
重写为 /post.php?id=123
。
example.com {
handle /post/* {
rewrite * /post.php?id={http.request.uri.path_segment.1}
file_server
}
root * /var/www/html
file_server
}
在这个配置中:
handle /post/*
处理/post/*
路径的请求。rewrite * /post.php?id={http.request.uri.path_segment.1}
将/post/123
重写为/post.php?id=123
。root * /var/www/html
指定了网站的根目录。file_server
启用静态文件服务。
4. 使用 route
指令
route
指令可以用来定义一组处理规则。以下是一个示例配置,将 /post/123
重写为 /post.php?id=123
。
example.com {
route /post/* {
rewrite * /post.php?id={http.request.uri.path_segment.1}
}
root * /var/www/html
file_server
}
在这个配置中:
route /post/*
定义了/post/*
路径的处理规则。rewrite * /post.php?id={http.request.uri.path_segment.1}
将/post/123
重写为/post.php?id=123
。root * /var/www/html
指定了网站的根目录。file_server
启用静态文件服务。
5. 使用 uri
指令
uri
指令可以用来修改请求的 URI。以下是一个示例配置,将 /post/123
重写为 /post.php?id=123
。
example.com {
uri strip_prefix /post
rewrite * /post.php?id={http.request.uri.path_segment.1}
root * /var/www/html
file_server
}
在这个配置中:
uri strip_prefix /post
去掉 URI 中的/post
前缀。rewrite * /post.php?id={http.request.uri.path_segment.1}
将/post/123
重写为/post.php?id=123
。root * /var/www/html
指定了网站的根目录。file_server
启用静态文件服务。
总结
Caddy 提供了多种方法来实现伪静态,包括 rewrite
、try_files
、handle
、route
和 uri
指令。你可以根据实际需求选择合适的方法来配置伪静态。通过这些方法,Caddy 可以轻松地将动态生成的 URL 转换为看起来像静态文件的 URL,从而提高网站的 SEO 和用户体验。
负载均衡
example.com {
reverse_proxy 192.168.1.1:8080 192.168.1.2:8080 192.168.1.3:8080 {
lb_policy round_robin
}
}
这个配置中:
reverse_proxy
指令指定了三个上游服务器。lb_policy round_robin
指定了负载均衡策略为轮询(round-robin)。
Caddy 提供了多种负载均衡策略,你可以根据实际需求选择合适的策略。通过 lb_policy
指令,你可以轻松配置负载均衡,确保流量在多个后端服务器之间均匀分布。
1. round_robin
轮询策略,依次将请求分发到每个后端服务器。这是默认的负载均衡策略。
example.com {
reverse_proxy 192.168.1.1:8080 192.168.1.2:8080 192.168.1.3:8080 {
lb_policy round_robin
}
}
2. random
随机策略,随机选择一个后端服务器。
example.com {
reverse_proxy 192.168.1.1:8080 192.168.1.2:8080 192.168.1.3:8080 {
lb_policy random
}
}
3. least_conn
最少连接策略,将请求分发到当前连接数最少的服务器。
example.com {
reverse_proxy 192.168.1.1:8080 192.168.1.2:8080 192.168.1.3:8080 {
lb_policy least_conn
}
}
4. ip_hash
基于客户端 IP 的哈希策略,确保同一客户端的请求总是发送到同一个后端服务器。
example.com {
reverse_proxy 192.168.1.1:8080 192.168.1.2:8080 192.168.1.3:8080 {
lb_policy ip_hash
}
}
5. uri_hash
基于请求 URI 的哈希策略,确保同一 URI 的请求总是发送到同一个后端服务器。
example.com {
reverse_proxy 192.168.1.1:8080 192.168.1.2:8080 192.168.1.3:8080 {
lb_policy uri_hash
}
}
6. header
基于请求头的哈希策略,确保具有相同请求头的请求总是发送到同一个后端服务器。
example.com {
reverse_proxy 192.168.1.1:8080 192.168.1.2:8080 192.168.1.3:8080 {
lb_policy header X-My-Header
}
}
7. cookie
基于 Cookie 的哈希策略,确保具有相同 Cookie 的请求总是发送到同一个后端服务器。
example.com {
reverse_proxy 192.168.1.1:8080 192.168.1.2:8080 192.168.1.3:8080 {
lb_policy cookie my_cookie
}
}
8. first_available
第一个可用策略,选择第一个可用的后端服务器。
example.com {
reverse_proxy 192.168.1.1:8080 192.168.1.2:8080 192.168.1.3:8080 {
lb_policy first_available
}
}
9. sticky_cookie
基于粘性 Cookie 的策略,确保同一客户端的请求总是发送到同一个后端服务器。与 ip_hash
类似,但使用 Cookie 而不是 IP。
example.com {
reverse_proxy 192.168.1.1:8080 192.168.1.2:8080 192.168.1.3:8080 {
lb_policy sticky_cookie my_cookie
}
}
10. least_time
最少响应时间策略,将请求分发到响应时间最短的服务器。
example.com {
reverse_proxy 192.168.1.1:8080 192.168.1.2:8080 192.168.1.3:8080 {
lb_policy least_time
}
}
资料
Awesome Docker Compose Examples
https://github.com/Haxxnet/Compose-Examples
Caddy2 简明教程_
https://mritd.com/2021/01/07/lets-start-using-caddy2/
比较最好的网络服务器——Caddy、Apache和Nginx
https://juejin.cn/post/7067818573883932685