一个比 Nginx 功能更强大的 Web 服务器( 三 )

自动证书申请在启动 Caddy2 之前,如果目标域名(例如: www.example.com)已经解析到了本机,那么 Caddy2 启动后会尝试自动通过 ACME HTTP 挑战申请证书;如果期望使用 DNS 的方式申请证书则需要其他 DNS 插件支持,比如上面编译的 --with github.com/caddy-dns/gandi 为 gandi 服务商的 DNS 插件;关于使用 DNS 挑战的配置编写方式需要具体去看其插件文档,目前 gandi 的配置如下:
tls { dns gandi {env.GANDI_API_TOKEN}}配置完成后 Caddy2 会通过 ACME DNS 挑战申请证书,值得注意的是即使通过 DNS 申请证书默认也不会申请泛域名证书,如果想要调整这种细节配置请使用 json 配置或管理 API 。
完整模块化配置样例了解了以上基础配置信息,我们就可以实际编写一个站点配置了;以下为本站的 Caddy 配置样例:
目录结构:
caddy├── Caddyfile├── mritd.com.caddy└── mritd.me.caddyCaddyfile
Caddyfile 主要包含一些通用的配置,并将其抽到配置片段中,类似于 nginx 的 nginx.conf 主配置;在最后部分通过 import 关键字引入其他具体站点配置,类似 nginx 的 vhost 配置 。
(LOG) {    log {        # 日志格式参考 https://github.com/caddyserver/format-encoder 插件文档        format formatted "[{ts}] {request>remote_addr} {request>proto} {request>method} <- {status} -> {request>host} {request>uri} {request>headers>User-Agent>[0]}"  {            time_format "iso8601"        }        output file "{args.0}" {            roll_size 100mb            roll_keep 3            roll_keep_for 7d        }    }}(TLS) {    # TLS 配置采用 https://mozilla.github.io/server-side-tls/ssl-config-generator/ 生成,SSL Labs 评分 A+    protocols tls1.2 tls1.3    ciphers TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256}(HSTS) {    # HSTS (63072000 seconds)    header / Strict-Transport-Security "max-age=63072000"}(ACME_GANDI) {    # 从环境变量获取 GANDI_API_TOKEN    dns gandi {$GANDI_API_TOKEN}}# 聚合上面的配置片段为新的片段(COMMON_CONFIG) {    # 压缩支持    encode zstd gzip    # TLS 配置    tls {        import TLS        import ACME_GANDI    }    # HSTS    import HSTS}# 开启 HTTP3 实验性支持{    servers :443 {        protocol {            experimental_http3        }    }}# 引入其他具体的站点配置import /etc/caddy/*.caddymritd.com.caddy
mritd.com.caddy 为主站点配置,主站点配置内主要编写一些路由规则,TLS 等都从配置片段引入,这样可以保持统一 。
【一个比 Nginx 功能更强大的 Web 服务器】www.mritd.com {    # 重定向到 mritd.com(默认 302)    redir https://mritd.com{uri}    # 日志    import LOG "/data/logs/mritd.com.log"    # TLS、HSTS、ACME 等通用配置    import COMMON_CONFIG}mritd.com {    # 路由    route /* {        reverse_proxy mritd_com:80    }    # 日志    import LOG "/data/logs/mritd.com.log"    # TLS、HSTS、ACME 等通用配置    import COMMON_CONFIG}


推荐阅读