Nginx连接速率限制需用limit_conn_zone定义共享内存区(如$binary_remote_addr zone=addr:10m),再在location中用limit_conn addr 10生效,超限返回503;可搭配limit_req实现并发与请求频次双重控制。

在 macOS 下用 Nginx 做连接速率限制,核心是 limit_conn_zone 指令配合 limit_conn 使用,重点在于“按什么维度限”和“限多少”,而不是简单套配置。
明确 limit_conn_zone 的作用对象
limit_conn_zone 定义的是内存共享区,它本身不生效,只是为后续 limit_conn 提供计数依据。关键点:
- 参数必须是变量(如
$binary_remote_addr、$server_name、自定义map变量),不能是字面值或常量 -
$binary_remote_addr是最常用的选择——它把 IPv4 地址压缩成 4 字节,IPv6 压缩成 16 字节,比$remote_addr更省内存 - zone 名称(如
addr)要唯一,且需在http块中定义,不能放在server或location里
正确配置 limit_conn_zone 和 limit_conn
以限制单个客户端 IP 最多 10 个并发连接为例:
http {
# 定义共享内存区:按客户端二进制地址分组,大小设为 10m(通常 1m 可存约 32000 个地址)
limit_conn_zone $binary_remote_addr zone=addr:10m;
<pre class='brush:php;toolbar:false;'>server {
listen 8080;
location /api/ {
# 应用限制:每个 IP 最多 10 个并发连接
limit_conn addr 10;
proxy_pass https://www.php.cn/link/65b5b8d1f89bf53a5713bc3afdd83e9e;
}
}}
注意:limit_conn 必须写在具体处理请求的上下文中(如 location),否则不生效;它的数值是硬上限,超限请求会直接返回 503 Service Temporarily Unavailable。
结合 limit_req 实现更精细的控制
limit_conn 管“同时有多少个连接”,limit_req 管“单位时间能发多少个请求”。两者常搭配使用:
- 先用
limit_conn防连接洪泛(比如防止慢速攻击占满 worker 连接) - 再用
limit_req控制请求频率(比如每秒最多 5 个请求,允许突发 10 个) - 二者独立计数,互不影响。例如一个 IP 可以有 10 个并发连接,每个连接内每秒最多发 5 个请求
示例:
limit_req_zone $binary_remote_addr zone=req:10m rate=5r/s;
<p>location /api/ {
limit_conn addr 10;
limit_req zone=req burst=10 nodelay;
proxy_pass <a href="https://www.php.cn/link/65b5b8d1f89bf53a5713bc3afdd83e9e">https://www.php.cn/link/65b5b8d1f89bf53a5713bc3afdd83e9e</a>;
}macOS 下调试与验证要点
macOS 自带的 Nginx 版本较旧(如 Catalina 默认是 1.15.x),建议用 Homebrew 安装最新稳定版:
brew install nginx brew services start nginx
验证是否生效:
- 检查配置语法:
nginx -t - 查看共享区状态:访问
http://localhost:8080/nginx_status(需启用ngx_http_stub_status_module) - 用
ab或hey工具压测,观察响应码和连接行为。例如:hey -c 20 -n 100 http://localhost:8080/api/test - 留意日志:
error_log /usr/local/var/log/nginx/error.log notice;中会记录被限流的连接(级别为notice)

















