Nginx 的 server 块本身不直接支持限速,但可通过 limit_req_zone 和 limit_req 指令在特定子域名的 server 块中实现精准访问速度限制;需在 http 块中定义共享内存区域,用 $host 或 map 提取的变量区分子域名,再在对应 server 或 location 中配置 burst、nodelay 等参数启用限速,并支持多策略复用 zone 与日志调试。

Nginx 的 server 块本身不直接支持限速,但可以通过配合 limit_req_zone 和 limit_req 指令,在特定子域名的 server 块中实现精准的访问速度限制。
定义限速区域(在 http 块中)
限速需先在全局 http 上下文中定义共享内存区域,用于统计请求频率。关键在于用变量(如 $host 或自定义变量)区分不同子域名:
- 使用
$host可按完整主机名(如api.example.com)独立限速 - 若多个子域名共用同一策略,可用正则提取主域或前缀,例如
$subdomain(需用map指令预处理)
示例(在 http 块内):
map $host $subdomain_key {
~^(?<s>.+)\.example\.com$ $s;
default $host;
}
limit_req_zone $subdomain_key zone=subdomain_limit:10m rate=5r/s;</s>在目标 server 块中启用限速
只需在对应子域名的 server 块中添加 limit_req,即可激活该区域的限制逻辑:
-
burst=10允许短时突发,超出部分排队或拒绝(取决于nodelay) -
nodelay表示不延迟响应,超限立即返回 503;省略则排队等待 - 可作用于整个
server,也可嵌套在location中做路径级细化
示例(针对 api.example.com):
server {
server_name api.example.com;
location / {
limit_req zone=subdomain_limit burst=10 nodelay;
proxy_pass http://backend;
}
}区分不同子域名的不同限速策略
若 admin.example.com 需更宽松、login.example.com 需更严格,可定义多个 zone:
- 为每个子域名单独设
limit_req_zone(用不同$host或map键) - 或统一用
$host定义一个 zone,再在各server中用不同limit_req参数调用它
推荐方式(复用 zone,灵活配置):
limit_req_zone $host zone=per_host:10m rate=10r/s;
server {
server_name admin.example.com;
limit_req zone=per_host rate=20r/s burst=20;
}
server {
server_name login.example.com;
limit_req zone=per_host rate=3r/s burst=5;
}验证与调试要点
限速生效后,可通过日志和状态码确认效果:
- 开启
limit_req_log_level notice(默认 warn),在 error log 中查看“limiting requests”记录 - 超限时默认返回 503,可配
limit_req_status 429改为标准限流状态码 - 用
ab或wrk工具模拟并发请求,观察响应头X-RateLimit-Limit等(需配合 Lua 或 OpenResty 扩展)










