Caddy使用浅析

Caddy使用浅析

说起 Web 服务器,大家第一反应可能还是 Nginx。Nginx 确实稳,但配置起来也是真的麻烦,尤其是配 HTTPS 证书的时候,又是找证书又是改配置。

今天聊聊 Caddy。这玩意儿在技术圈火了好几年了,虽然在超大规模并发下可能不如 Nginx 那么“硬”,但在中小型项目、个人博客或者内网开发环境里,它简直是“神仙工具”。


Caddy 是个啥?

简单来说,Caddy 是一个用 Go 语言写的开源 Web 服务器。

它最大的卖点就是 “省心”。它在设计之初就把“安全”和“自动化”刻在了骨子里。相比 Nginx 那种繁琐的配置文件,Caddy 的配置文件(Caddyfile)写起来就像是在写大白话。

核心功能点

  • 默认开启 HTTPS:这是它最出名的功能。只要你给它一个域名,它能自动帮你从 Let's Encrypt 申请证书、配置 HTTPS、甚至连证书续期都帮你干了,全程零人工干预。

  • 强大的反向代理:一行代码就能实现反代,支持负载均衡、健康检查、WebSocket 等。

  • 高性能静态文件服务:自带高性能的 file_server

  • HTTP/3 原生支持:默认开启 HTTP/3(QUIC),不需要像 Nginx 那样还得折腾编译。

  • 单二进制文件:没有任何复杂的依赖,丢进去就能跑。


搞起:Docker Compose 环境搭建

在 Docker 环境下玩 Caddy 是最爽的,持久化证书目录后,即便容器重启,证书也不会丢失。

1. 准备 docker-compose.yml

YAML

services:
  caddy:
    image: caddy:latest
    container_name: caddy
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
      - "443:443/udp" # 为了支持 HTTP/3
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - ./data:/data              # 存放自动申请的证书
      - ./config:/config          # 存放配置文件
      - ./html:/srv               # 映射本地静态文件

2. 准备 Caddyfile

在同级目录下新建一个 Caddyfile 文件。


需求实战:一个配置搞定所有

假设你现在有这么几个需求:

  1. 域名 example.com 自动申请 HTTPS。

  2. 访问 /api 转发到另一个名为 api-server 的 Docker 容器(端口 8080)。

  3. 访问 /admin 需要输入账号密码(BaseAuth)。

  4. 所有的 http://old.com 都要重定向到 https://example.com

  5. 访问 /files 的时候,映射到你本地的 /srv/static 文件夹。

在 Caddy 里,你的配置文件长这样:

代码段

# 1. 自动申请证书 + 反代 + 认证
example.com {
    # 开启 Gzip/Zstd 压缩,提高加载速度
    encode zstd gzip

    # 3. BaseAuth 认证(注意:密码必须是 Bcrypt 格式)
    # 可以用命令生成:docker run --rm caddy caddy hash-password --plaintext 你的密码
    basic_auth /admin/* {
        admin JDJhJDE0JHFIemNsUjlwMUlZdGJ4di5hTkxSUDZHd2JTekRVdUgvR0dKdkN0RGdDSXFqUmhlIA==
    }

    # 2. 反代到其他 Docker 接口
    # 假设 api-server 是你同一个网络下的容器名
    reverse_proxy /api/* api-server:8080

    # 5. 特殊链接映射本地文件
    handle_path /files/* {
        root * /srv/static
        file_server browse
    }

    # 默认首页处理
    handle {
        root * /srv
        file_server
    }
}

# 4. 重定向处理
old.com {
    redir https://example.com{uri}
}

重点解析:

  • Automatic HTTPS:只要你在开头写了域名,且服务器 80/443 端口是通的,Caddy 启动时就会自动去申请证书。

  • basic_auth:一定要记住,Caddy 不允许在配置文件里存明文密码。你得先用 caddy hash-password 生成哈希值填进去。

  • handle_path:这个指令很关键。它会自动剥离匹配到的前缀。比如你访问 example.com/files/1.jpg,它会去 /srv/static/ 下找 1.jpg,而不是找 static/files/1.jpg

  • reverse_proxy:由于是在 Docker Compose 里,容器之间可以通过容器名通信,非常方便。

路由器选购深水区:聊聊什么是“小螃蟹”方案 2026-01-15
frp内网穿透 2026-01-15

评论区