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

资讯详情

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

Outline 怎么通过环境变量配置 API 速率限制?

Outline 怎么通过环境变量配置 API 速率限制? Outline 怎么通过环境变量配置 API 速率限制【免费下载链接】outlineThe fastest knowledge base for growing teams. Beautiful, realtime collaborative, feature packed, and markdown compatible.项目地址: https://gitcode.com/GitHub_Trending/ou/outline如果你自托管 Outline 并需要控制 API 的访问频率——比如放宽内部脚本的调用额度、收紧公开端点的限制或者在压测时整体关闭限流——只需要修改几个RATE_LIMITER_开头的环境变量。本文基于仓库中的.env.sample、server/env.ts与server/middlewares/rateLimiter.ts说明这四个变量的默认值、控制范围和验证方式。前提是服务依赖的 Redis 已正常配置REDIS_URL是必填环境变量限流计数存储在 Redis 中键前缀rl见 server/env.ts 与 server/utils/RateLimiter.ts。四个可配置的环境变量仓库的 .env.sample 中有专门的 RATE LIMITER 配置段# Whether the rate limiter is enabled or not RATE_LIMITER_ENABLEDtrue # Individual endpoints have hardcoded rate limits that are enabled # with the above setting, however this is a global rate limiter # across all requests RATE_LIMITER_REQUESTS1000 RATE_LIMITER_DURATION_WINDOW60 # Multiplier applied to the hardcoded per-endpoint API rate limits. Use values # greater than 1 to make the limits more lenient (e.g. 2 doubles the allowed # requests), or less than 1 to make them stricter. Effective limits are rounded # to the nearest integer with a minimum of 1. Defaults to 1. RATE_LIMITER_MULTIPLIER1各变量的含义和默认值来自 server/env.ts变量默认值作用RATE_LIMITER_ENABLEDtrue总开关控制应用 Web 服务器的限流中间件RATE_LIMITER_REQUESTS1000全局默认限流器允许的请求数认证请求按用户、未认证按 IP 计数RATE_LIMITER_DURATION_WINDOW60秒全局默认限流器的时间窗口窗口结束后配额重置RATE_LIMITER_MULTIPLIER1乘数统一放大或缩小各端点硬编码的速率限制另外还有一个协作服务专用的变量RATE_LIMITER_COLLABORATION_REQUESTS默认50用于限制触发节流前的最大实时连接数。需要注意控制范围的区别RATE_LIMITER_REQUESTS和RATE_LIMITER_DURATION_WINDOW只作用于全局默认限流器各 API 端点还有在代码里硬编码的限制例如server/utils/RateLimiter.ts中的RateLimiterStrategy预设FivePerMinute到FivePerHour这些端点限制只能通过RATE_LIMITER_MULTIPLIER整体缩放例如设为2则允许请求数翻倍设为小于1的值则收紧。缩放后的有效限制会四舍五入到最近的整数最小为1。RATE_LIMITER_ENABLED、RATE_LIMITER_REQUESTS、RATE_LIMITER_DURATION_WINDOW、RATE_LIMITER_MULTIPLIER之间存在CannotUseWithout校验约束后三者依赖RATE_LIMITER_ENABLED设置。如果组合不合法服务启动时的环境校验会输出Environment configuration is invalid, please check the following:并以退出码 1 结束进程。按目标修改配置把变量写进 Outline 容器的环境变量或.env文件后重启服务即可生效无需改代码。按目标选择改动放宽或收紧全局限制改RATE_LIMITER_REQUESTS窗口内请求数和RATE_LIMITER_DURATION_WINDOW窗口秒数。统一放宽所有端点的硬编码限制只改RATE_LIMITER_MULTIPLIER例如RATE_LIMITER_MULTIPLIER2把所有端点限额翻倍。完全关闭限流设RATE_LIMITER_ENABLEDfalse。中间件会直接放行请求见 server/middlewares/rateLimiter.ts 中的if (!env.RATE_LIMITER_ENABLED) return next()此时不要再单独设置RATE_LIMITER_REQUESTS等依赖变量否则环境校验不通过。请求被限流后的现象限流判断的标识符不是简单的 IP未认证请求按 IP 计数带会话 token 的认证请求按用户 ID 计数因此同一 NAT 后的不同用户不共享配额API key 和 OAuth access token 同时按 IP 和凭据哈希计数见 server/middlewares/rateLimiter.ts 中的getRateLimiterIdentifiers。当任一标识符的配额耗尽时服务返回 429 响应错误信息为Rate limit exceeded for this operation错误 id 为rate_limit_exceeded见 server/errors.ts并在响应头中给出四个整数值单位为秒向上取整Retry-After客户端应等待的秒数RateLimit-Limit该限流器的窗口内总请求数RateLimit-Remaining当前剩余配额RateLimit-Reset配额重置还需的秒数。因此验证配置是否生效的方式是对目标实例发起超出限额的请求检查返回状态码是否为 429以及上述响应头是否与配置一致。限流未触发时响应头不会出现。边界与行为细节Redis 故障不会让接口不可用限流器以 Redis 为存储并带一个内存中的保险限流器扣减配额时如果存储不可达错误会被记录日志并跳过而不是阻断请求。限流键的归一化路径查找前会统一小写并去掉尾部斜杠/api/X/与/api/x命中同一个限流器。每进程独立计数保险限流器是进程内内存实现WEB_CONCURRENCY大于 1 时各 Web 进程的保险计数互不共享正常路径下计数在 Redis 中多进程共享。端点级预设如 collections 路由使用的TwentyFivePerMinute、FivePerHour见 server/routes/api/collections/collections.ts只随RATE_LIMITER_MULTIPLIER缩放其时间窗口60 秒或 3600 秒由预设本身固定不受RATE_LIMITER_DURATION_WINDOW影响。修改环境变量后服务重启完成、环境校验通过无Environment configuration is invalid报错即配置生效对限额发起超额请求出现 429 与对应响应头说明限流按预期工作。【免费下载链接】outlineThe fastest knowledge base for growing teams. Beautiful, realtime collaborative, feature packed, and markdown compatible.项目地址: https://gitcode.com/GitHub_Trending/ou/outline创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表