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 地址和本地/内部主机名。

    • 例子:localhost127.0.0.1
  • Caddy使用来自公开的ACME CA的证书,通过HTTPS提供公共DNS名称,例如Let's Encrypt或者ZeroSSL.

    • 例子:example.comsub.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 提供了多种方法来实现伪静态,包括 rewritetry_fileshandlerouteuri 指令。你可以根据实际需求选择合适的方法来配置伪静态。通过这些方法,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

标签: Caddy

添加新评论