尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Directus 怎么配置限流器:memory 与 Redis 两种存储如何选择?

Directus 怎么配置限流器:memory 与 Redis 两种存储如何选择? Directus 怎么配置限流器memory 与 Redis 两种存储如何选择【免费下载链接】directusThe flexible backend for all your projects Turn your DB into a headless CMS, admin panels, or apps with a custom UI, instant APIs, auth more.项目地址: https://gitcode.com/GitHub_Trending/di/directus在部署 Directus 时API 层的速率限制rate limiting默认是关闭的配置完全通过环境变量完成不需要修改代码。这篇文章解决一个具体问题如何在上线时启用 Directus 的限流器并在memory和redis两种计数存储之间做出选择。相关事实均来自本仓库源码与配置文件限流器工厂 api/src/rate-limiter.ts、环境变量默认值 packages/env/src/constants/defaults.ts、环境模板 api/src/cli/utils/create-env/env-stub.liquid、中间件 api/src/middleware/rate-limiter-ip.ts 与 api/src/middleware/rate-limiter-global.ts。启用限流器要改哪些环境变量Directus 的环境模板文件里有一个专门的 Rate Limiting 区块见 env-stub.liquid四个变量及模板中的注释如下变量模板预填值内置默认值未设置时生效说明RATE_LIMITER_ENABLEDfalsefalse是否对 API 启用限流RATE_LIMITER_STOREmemorymemory计数存储位置可选memory、redisRATE_LIMITER_POINTS2550每个时间窗口内允许的请求数RATE_LIMITER_DURATION11时间窗口单位秒注意模板预填值25与内置默认值50不一致这是模板文件的示例值只有当某个变量没有显式设置时才会落到 defaults.ts 中的默认值上。启用 IP 限流的最小配置就是RATE_LIMITER_ENABLEDtrue RATE_LIMITER_STOREmemory RATE_LIMITER_POINTS50 RATE_LIMITER_DURATION1当RATE_LIMITER_ENABLEDtrue时rate-limiter-ip.ts 会校验RATE_LIMITER_STORE、RATE_LIMITER_DURATION、RATE_LIMITER_POINTS三项都已设置validateEnv按请求 IP 逐个消耗配额。memory 与 Redis 两种存储如何选api/src/rate-limiter.ts 根据RATE_LIMITER_STORE的值创建不同的限流器实例memory也是未识别值时的兜底分支使用rate-limiter-flexible的RateLimiterMemory计数状态保存在当前 API 进程内redis使用RateLimiterRedis计数状态保存在一个 Redis 实例中。选择依据就是计数状态存放在哪里单实例部署选memory计数就在本进程里不需要任何额外组件模板默认值也是它多实例部署选redis计数存放在外部 Redis 中各 API 进程通过同一个 Redis 共享计数。如果你把多个 Directus 实例放在负载均衡后面memory存储下每个实例各自独立计数只有redis存储能让配额跨实例合计。配置 Redis 存储时的连接变量启用redis存储时rate-limiter.ts 会用ioredis创建一个storeClient连接配置读取顺序是优先取单个REDIS变量否则取所有REDIS_前缀变量。仓库中登记过的相关变量见 directus-variables.ts包括RATE_LIMITER_ENABLEDtrue RATE_LIMITER_STOREredis # 二选一 # 方式一单个连接串 REDISredis://localhost:6379 # 方式二分项变量 REDIS_HOSTlocalhost REDIS_PORT6379 # REDIS_USERNAME... # REDIS_PASSWORD... # REDIS_DB0以上分项变量按你的 Redis 实际连接信息填写或取消注释用户名、密码、库号是否需要取决于你的 Redis 是否启用鉴权与分库。可选全局限流器及其两条硬性约束除按 IP 限流外Directus 还有一个全局限流器rate-limiter-global.ts用固定键global-rate-limit对整个 API 做总配额对应变量为RATE_LIMITER_GLOBAL_ENABLED、RATE_LIMITER_GLOBAL_POINTS默认1000、RATE_LIMITER_GLOBAL_DURATION默认1。启用前注意源码中两条会直接导致进程退出的校验validateConfiguration必须先启用按 IP 的限流器否则日志报错The IP based rate limiter needs to be enabled when using the global rate limiter.并退出全局每秒配额GLOBAL_POINTS / GLOBAL_DURATION必须大于按 IP 限流器每秒配额POINTS / DURATION否则日志报错The global rate limiter needs to allow more requests per second than the IP based rate limiter.并退出。如果你的部署用不到整体总配额保持RATE_LIMITER_GLOBAL_ENABLEDfalse即可不必引入。此外注册接口的限流器RATE_LIMITER_REGISTRATION_*默认是启用的true5次 /60秒见 defaults.ts与上面RATE_LIMITER_*的主限流器相互独立。如何验证限流已生效限流触发时的行为在源码中是明确的consume失败后中间件会先设置响应头Retry-After单位秒取自msBeforeNext换算再抛出HitRateLimitError其中携带limit即当前RATE_LIMITER_POINTS配置值和reset恢复时间戳见 rate-limiter-ip.ts。因此验证方式是在限流器启用后用同一 IP 在时间窗口内连续发起请求直到请求数超过RATE_LIMITER_POINTS被拒绝的请求会带Retry-After响应头错误体中的limit/reset字段与你的配置和窗口长度对应说明限流链路已经生效。若完全没有触发先确认RATE_LIMITER_ENABLEDtrue且三个必填变量STORE、DURATION、POINTS都已设置。两点边界说明以上配额计数只覆盖本部署内的 Directus 进程若前面还有反向代理或 WAF 自带限流两者是叠加关系另外 packages/pressure 提供的是另一个基于事件循环压力的限流机制PressureMonitor/handlePressure与本文的RATE_LIMITER_*环境变量体系无关不属于本配置路径。【免费下载链接】directusThe flexible backend for all your projects Turn your DB into a headless CMS, admin panels, or apps with a custom UI, instant APIs, auth more.项目地址: https://gitcode.com/GitHub_Trending/di/directus创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表