必须用 $binary_remote_addr,因其将IPv4/IPV6地址转为固定4/16字节二进制,哈希更稳、内存降60%以上;配合小zone(如512k)、小burst(≤3)及精简模块,可使Nginx在树莓派等低功耗设备稳定限流。

在低功耗设备(如树莓派、边缘网关、IoT网关)上运行 Nginx 做反向代理时,内存和 CPU 资源极其有限。直接用 $remote_addr 做限流 key 会导致共享内存快速膨胀,甚至 OOM。关键解法是:用 $binary_remote_addr 替代字符串 IP,并配合合理 zone 容量与速率策略,把内存开销压到最低。
为什么必须用 $binary_remote_addr
普通 $remote_addr 是字符串形式(如 "203.124.56.17"),长度不固定(10–15 字节),哈希效率低、冲突高;而 $binary_remote_addr 是紧凑二进制表示:
- IPv4 固定占 4 字节
- IPv6 固定占 16 字节
- 无解析开销,哈希更稳定,内存占用直降 60% 以上
为低功耗设备精简 zone 内存分配
10MB zone 在 x86 服务器能存约 16 万个 IP,在 ARM 小内存设备上极易浪费。建议按实际并发 IP 数估算:
- 若只服务本地局域网(比如 200 台设备),
zone=perip:1m足够(1MB ≈ 3.2 万 IPv4 条目) - 若对接公网但仅防爬/防刷(非全量记 IP),可配合
map聚合子网,例如只记 /24 前缀:
map $remote_addr $ip_subnet {
~^(\d+\.\d+\.\d+)\. $1.0;
}
limit_req_zone $binary_remote_addr zone=perip:512k rate=3r/s; - 避免使用过大的
burst值(如 burst=100),它会额外占用队列内存,低功耗设备推荐 burst≤5
轻量级限流配置示例(树莓派实测可用)
以下配置在 Raspberry Pi 4(2GB RAM)上稳定运行,HTTP 反代 + 每秒 3 请求 + 突发容忍:
- http {
limit_req_zone $binary_remote_addr zone=api_limit:512k rate=3r/s;
server {
location /api/ {
limit_req zone=api_limit burst=3 nodelay;
proxy_pass http://backend;
}
}
} - 512KB zone 支持约 1.6 万个 IPv4 地址状态,远超典型边缘场景需求
- rate=3r/s + burst=3 组合,既能防突发刷量,又不会因排队延迟拖垮响应
额外省资源技巧
对资源极度敏感的设备,还可进一步收紧:
- 关闭未使用的模块(如
ngx_http_geo_module若不用地理限流) - 禁用 access_log 或改用 buffer+flush=1s 减少 I/O
- 用
limit_conn替代部分limit_req场景(连接数限制比请求率限制更轻量) - 若只针对特定 UA(如某类 IoT 设备),可结合
map $http_user_agent $limit_key降低 key 粒度











