# 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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。