# 写在 http 块 limit_conn_zone $binary_remote_addr zone=perip:10m; # 写在 server 块 limit_conn perip 10;
想限制单个 IP 并发 10,用 ab 压到 40 个并发也全部放行了,nginx -T 里配置确实加载成功,看不出哪里写错,只能怀疑是计算方式的问题。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:limit_conn 依赖共享内存区统计,zone 没声明或者给得太小时每个 worker 各记一份,四个 worker 叠加就是四倍,看起来像没生效,实际并发放大了好几倍。
「limit_conn 并发限制」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。同一份配置存在多处的,先确认改的是被加载的那一份。
新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
处理上按这个顺序:在 http 配置块里用 limit_conn_zone 声明一个共享内存区并起好名字;limit_conn 里引用的 zone 名字,必须和声明那一处保持完全一致;热点 IP 比较多的时候,把共享区大小适当加大一点。
确认没问题再收工,并发超过 10 时开始出现 503,错误日志里能看到 limiting connections 这类记录,说明限流生效了。
