用 $binary_remote_addr 可将单 key 内存从 36 字节压至 14 字节,节省超 60%,哈希冲突降 3 倍以上;按并发活跃 IP 数(非日活)配 zone 大小,如 1700 IP × 44 字节 ≈ 75 KB,配 2m 已冗余;burst=15 nodelay+status 429 确保首波合法并发不卡顿、超限即返 429;多 zone 拆分(ip_basic/ua_spider/host_ip)互不干扰、总内存可控。

用 limit_req_zone 结合 $binary_remote_addr 在反向代理场景下做极小内存流控,核心不是堆内存,而是精准压缩单条记录开销、按真实活跃数配额、分层兜底不浪费。
必须用 $binary_remote_addr,不用 $remote_addr
IPv4 字符串如 192.168.1.1 长度不固定(7–15 字节),带解析开销;而 $binary_remote_addr 将 IPv4 固定为 4 字节、IPv6 固定为 16 字节二进制值,Nginx 直接 memcpy,无字符串哈希、无动态分配。实测单 key 内存从平均 36 字节压到约 14 字节,节省超 60%,哈希冲突率下降 3 倍以上——这对反代节点(尤其是边缘网关、树莓派、OpenWrt)是硬性前提。
按并发活跃 IP 数反推 zone 大小,不看日活总量
反代流量中真正“同时触发限速判定”的 IP 才占内存。例如:
- 登录接口峰值 QPS 300,用户平均 2 秒内发 3 次 → 同时活跃 IP ≈ 200
- 爬虫探测接口,5 分钟去重 IP 4200 个,乘系数 0.4 → 预估活跃 IP ≈ 1700
按每 IP 占 44 字节(12 字节 key + 32 字节计数器/时间戳/指针)计算:1700 × 44 ≈ 75 KB。配zone=api_limit:2m已留足冗余,防哈希桶扩容和突发增长。
反代专用配置要点:burst + nodelay + status 统一返回
在 location 块中启用时,要兼顾后端保护与用户体验:
-
burst=15 nodelay:允许首波合法并发(如 HTML + JS + CSS + 图片),超限立即返回 429,不排队不卡顿 -
limit_req_status 429:统一返回标准限流状态码,便于前端重试或 WAF 聚合拦截 - 配合
proxy_pass使用,确保限流发生在请求进入反代链路的最早环节
多策略共存但不增内存:拆 zone 不扩 size
反代常需区分普通访问、爬虫、内部调用等,可用组合 key 拆 zone:
-
limit_req_zone $binary_remote_addr zone=ip_basic:2m rate=5r/s;(兜底) -
limit_req_zone "$http_user_agent$binary_remote_addr" zone=ua_spider:1m rate=1r/s;(UA+IP 双因子识别已知爬虫) -
limit_req_zone "$server_name$binary_remote_addr" zone=host_ip:2m rate=10r/s;(防跨域名共享状态)
每个 zone 独立计数、独立内存,总用量可控,策略互不干扰。
不复杂但容易忽略。

















