- config: 反向代理、缓存、负载均衡、安全、SSL 等配置模板 - lua: API 网关、认证、动态路由、限流、WebSocket 等脚本示例 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
49 lines
1.3 KiB
Markdown
49 lines
1.3 KiB
Markdown
# Rate Limiting with Lua
|
|
|
|
基于 `ngx.shared.DICT` 的自定义速率限制示例,弥补 NGINX 原生 `limit_req` 模块在动态策略上的不足。
|
|
|
|
## 功能
|
|
|
|
- 基于客户端 IP 的请求速率限制
|
|
- 基于 API Key 的请求速率限制
|
|
- 自定义限流阈值与时间窗口
|
|
- 返回标准的 `429 Too Many Requests` 响应
|
|
|
|
## 文件说明
|
|
|
|
| 文件 | 用途 |
|
|
|------|------|
|
|
| `nginx.conf` | NGINX 配置示例,定义共享内存区域和 Lua 挂载点 |
|
|
| `access.lua` | Lua 速率限制实现脚本 |
|
|
|
|
## 快速开始
|
|
|
|
1. 在 `nginx.conf` 中配置 `lua_shared_dict` 共享内存区域
|
|
2. 在对应的 `location` 块中使用 `access_by_lua_file` 引入脚本
|
|
3. 通过请求头 `X-API-Key` 或客户端 IP 进行限流
|
|
|
|
## 配置示例
|
|
|
|
```nginx
|
|
http {
|
|
# 定义共享内存:名称 大小
|
|
lua_shared_dict rate_limit 10m;
|
|
|
|
server {
|
|
location /api/ {
|
|
access_by_lua_file /path/to/access.lua;
|
|
proxy_pass http://backend;
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
## 限流策略
|
|
|
|
| 标识方式 | 优先级 | 默认阈值 | 时间窗口 |
|
|
|----------|--------|----------|----------|
|
|
| API Key (`X-API-Key`) | 高 | 100 req | 60 秒 |
|
|
| 客户端 IP | 低 | 20 req | 60 秒 |
|
|
|
|
当同时存在 API Key 和 IP 时,优先使用 API Key 进行限流。
|