您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# nginx如何请求连接限制笔记
## 1. 连接限制的核心概念
### 1.1 为什么需要连接限制
在高并发Web服务场景中,连接限制是保护服务器资源的关键手段:
- 防止单个IP耗尽连接池
- 缓解DDoS攻击的影响
- 保证服务资源合理分配
- 避免慢连接占用资源
### 1.2 基础模块
```nginx
http {
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_req_zone $binary_remote_addr zone=perip_req:10m rate=10r/s;
}
http {
# 定义共享内存区(1MB可存储约1.6万个IP)
limit_conn_zone $binary_remote_addr zone=addr_zone:10m;
server {
location / {
# 每个IP同时允许5个连接
limit_conn addr_zone 5;
# 连接超时设置
limit_conn_status 429;
limit_conn_log_level warn;
}
}
}
# 按服务器级别限制
limit_conn_zone $server_name zone=servers:10m;
# 按用户组限制
map $remote_addr $user_group {
default "normal";
192.168.1.0/24 "vip";
}
limit_conn_zone $user_group zone=group_zone:10m;
http {
# 定义速率限制区(10r/s = 600r/m)
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=10r/s;
server {
location /api/ {
# 突发请求处理设置
limit_req zone=req_zone burst=20 nodelay;
# 自定义返回状态码
limit_req_status 429;
}
}
}
# 多级速率限制
limit_req_zone $binary_remote_addr zone=strict:10m rate=2r/s;
limit_req_zone $binary_remote_addr zone=normal:10m rate=10r/s;
location /payment/ {
limit_req zone=strict burst=5;
}
location /static/ {
limit_req zone=normal burst=30;
}
# 限制下载带宽+连接数
location /download/ {
limit_conn addr_zone 3;
limit_rate_after 10m;
limit_rate 100k;
# 防止爬虫高频访问目录
limit_req zone=req_zone burst=5;
}
map $http_appkey $api_limit {
default "10r/s";
"VIP_KEY" "100r/s";
}
limit_req_zone $binary_remote_addr zone=api_zone:10m rate=$api_limit;
location /v1/api {
limit_req zone=api_zone burst=20;
limit_req_status 429;
# 连接持续时间限制
proxy_read_timeout 30s;
}
计算公式:
存储IP数 = 内存大小(m) * 1024 * 1024 / (IP长度 + 64)
示例:
10MB存储区可保存约16万IPv4地址
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
# 错误日志分析建议
log_format limiter '$remote_addr - $status - $limit_req_status';
# 使用X-Forwarded-For最后一跳IP
map $http_x_forwarded_for $real_ip {
default $remote_addr;
~^([^,]+) $1;
}
limit_conn_zone $real_ip zone=nat_zone:10m;
geo $limit {
default 1;
192.168.0.0/16 0;
10.0.0.0/8 0;
}
map $limit $limit_key {
0 "";
1 $binary_remote_addr;
}
limit_req_zone $limit_key zone=dynamic:10m rate=5r/s;
# 基于URI的差异化限速
map $uri $rate_limit {
~^/api/v1/search 5r/s;
~^/api/v2/data 20r/s;
default 10r/s;
}
limit_req_zone $binary_remote_addr zone=dynamic_rate:10m rate=$rate_limit;
location / {
# 连接数限制
limit_conn perip 10;
limit_conn perserver 1000;
# 请求速率限制
limit_req zone=perip_req burst=30;
# 带宽限制
limit_rate_after 1m;
limit_rate 500k;
# 超时控制
proxy_connect_timeout 3s;
}
# 测试连接数限制
ab -n 1000 -c 50 http://example.com/
# 测试速率限制
siege -r 100 -c 50 http://example.com/api
# 查看被限制的请求
grep 'limiting requests' /var/log/nginx/error.log
# 统计触发限制的IP
awk '{print $1}' access.log | sort | uniq -c | sort -nr
指令 | 说明 | 示例值 |
---|---|---|
limit_conn_zone | 定义共享内存区 | zone=name:10m |
limit_conn | 设置连接数限制 | limit_conn zone 10 |
limit_req_zone | 定义请求限制区 | rate=10r/s |
limit_req | 启用请求限制 | burst=20 nodelay |
limit_rate | 带宽限制 | 100k |
limit_status | 自定义返回码 | 429 |
注:所有配置需要根据实际业务需求调整,建议在测试环境充分验证后再上线生产环境。 “`
(全文约1950字,包含配置示例、原理说明和实战建议)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。