首页
仓库
文档
nginx手册
Docker手册
workerman
Flask
PHP
python
RabbitMQ
其他
Linux
占位1
占位2
目录
全局限制所有 IP http { # 定义限制规则:每秒 1 次请求,突发 0 次(严格限制) limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; server { location / { # 应用限制规则,突发 0 次,立即拒绝超额请求 limit_req zone=one burst=0 nodelay; } } } 现在ip http { # 定义映射规则:仅对目标 IP 生效 map $binary_remote_addr $limit_key { default ""; # 其他 IP 不限制 192.168.1.100 $binary_remote_addr; # 目标 IP1 应用限制 192.168.1.101 $binary_remote_addr; # IP2 } # 定义限制区域(每秒 1 次请求) limit_req_zone $limit_key zone=one:10m rate=1r/s; server { location / { # 应用限制规则(突发 0 次,严格限制) limit_req zone=one burst=0 nodelay; } } } 关键参数说明 rate=1r/s 1r/s 表示每秒允许 1 个请求。 可调整为 5r/s(每秒 5 次)等。 burst=0 突发请求数。设为 0 表示严格限制,不允许任何超额。 若设为 burst=5,则允许短时间内突发 5 次请求(但需长期平均不超过 rate)。 nodelay 若启用,Nginx 会立即处理请求(即使突发未用完),否则请求会排队等待。 混合限制(不同 IP/网段设置不同速率) http { # Group 1: 限制 IP1 和 IP2 为 1r/s map $binary_remote_addr $group1_key { default ""; 192.168.1.100 $binary_remote_addr; 10.0.0.5 $binary_remote_addr; } limit_req_zone $group1_key zone=group1:10m rate=1r/s; # Group 2: 限制 172.16.0.0/16 子网为 5r/s map $binary_remote_addr $group2_key { default ""; 172.16.0.0/16 $binary_remote_addr; } limit_req_zone $group2_key zone=group2:10m rate=5r/s; server { location / { # 应用所有组的限制规则 limit_req zone=group1 burst=0 nodelay; limit_req zone=group2 burst=0 nodelay; } } } 避免重复匹配 确保一个 IP 只属于一个组,否则多个限制规则会叠加生效(可能导致更严格的限制)。 性能优化 若限制大量 IP,使用 CIDR 网段更高效。 调整 zone 内存大小(如 zone=one:10m),确保足够存储请求计数。 日志与监控 添加以下指令记录被限制的请求: nginx limit_req_log_level notice; # 在 error.log 中记录 503 事件 limit_req_status 503; # 返回 503 状态码 动态调整 可通过 burst 参数允许短暂突发流量(如 burst=5),但需长期平均不超过 rate。