# Caddy Rate_limit 配置


## 为什么要做频率限制

公共网络服务迟早会碰到流量滥用：

- 爬虫爬取全站内容
- 暴力破解登录接口
- CC 攻击占用带宽
- 脚本小子刷 API

频率限制是最基础的防御手段。Caddy 的 `rate_limit` 插件实现的是**令牌桶算法**，在请求到达反向代理之前进行限流判断，避免压力传递到后端服务。

## 定义限流区域

```caddyfile
example.com {
	rate_limit {
		zone dynamic_zone {
			key {client_ip}
			events 50
			window 10s
		}
		log_key
	}
}
```

### zone 参数详解

- **`key {client_ip}`**：按客户端 IP 区分。Caddy 如果配置了 `trusted_proxies`，这里的 IP 是从 `X-Forwarded-For` 提取的真实客户端 IP，而不是代理的 IP。
- **`events 50`**：在时间窗口内允许的最大请求数。
- **`window 10s`**：时间窗口，这里是 1 秒。

合起来就是：**每个客户端 IP 每 10 秒最多 50 个请求**，超过的请求返回 429 Too Many Requests。

### log_key 调试

```caddyfile
log_key
```

开启后，Caddy 会在访问日志中输出被限流的客户端 key（IP 地址）。格式类似：

```
rate_limit exceeded for key: 192.168.1.100
```

上线新服务时建议先开启 `log_key`，观察正常用户的请求频率，再确定合适的阈值。

## 参考链接

- [caddy-ratelimit](https://github.com/mholt/caddy-ratelimit)
- [Caddy 日志配置](https://caddyserver.com/docs/caddyfile/directives/log)
- [xcaddy 构建自定义 Caddy](/posts/custom-caddy-build/)
- [Caddy Cloudflare DNS-01 质询](/posts/caddy-cloudflare-dns-challenge/)


---

> 作者: Nite  
> URL: https://www.nite07.com/zh-cn/posts/caddy-rate-limit/  

