本文说一下Nginx的资源限制相关
Nginx限流限速:限制某个用户在一定时间内产生的http请求
应用场景:
- 下载限速:限制用户下载资源的速度
- 请求限制:限制用户单位时间内所产生的http请求数
- 连接限制:限制同一时间的连接数并发数
限制
ngx_http_limit_req_module:请求限制
该模块用于限制每个定义密钥的请求处理速率,特别是来自单个IP地址的请求的处理速率。限制是使用“泄漏桶”方法完成的。
- 语法格式:
limit_req_zone key zone=name:size rate=rate; limit_req zone=name [burst=number] [nodelay | delay=number];
- 官方配置示例:(可以配置在http层)
http { limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; ... server { ... location /search/ { limit_req zone=one burst=5 nodelay; limit_req_status 503; }
以上示例含义为:
设置区域部分:
- $binary_remote_addr:以来源IP,每个IP占4字节
- zone=one:10m:设置一个名称为one的区域,大小为10M
- rate=1r/s:每秒的请求数为1个
调用部分:
- zone=one:调用的zone为上面定义的one
- burst=5:并发为5个的缓冲区
- nodelay:当缓冲区与访问限制都超过了则返回503;不设置的话默认排队
- limit_req_status:超出限制的访问反回状态码503,可以修改
你每秒可以访问到的页面是:burst+rate的数量
ngx_http_limit_conn_module:连接限制
该模块用于限制每个已定义密钥的连接数,特别是来自单个 IP 地址的连接数。
- 官方示例:
http { limit_conn_zone $binary_remote_addr zone=addr:10m; ... server { ... location /download/ { limit_conn addr 1; }
该示例含义为:设置一个共享区域,名称为addr,大小为10m;根据这个区域设置每个ip的最大连接数为1 。
此模块的指令:
- limit_conn zone number(可以作用于http、server、location):设置每个来源ip的最大连接数,超过限制则返回错误
limit_rate:限制传输速度
除此之外还可以定义下载速度,这个功能是使用的是ngx_http_core_module
模块的limit_rate_after
和limit_rate
功能
- 官方示例:
location /flv/ { flv; limit_rate_after 500k; limit_rate 50k; }
此示例说明:你可以正常使用500k,当达到500k之后开始限速,速度为50k。
综合示例:
- 限制web服务器单IP处理请求数为1秒一个,触发值为3,同时只能下载一个文件
- 当下载超过50M后速度限制为100k
- 如果同时下载超过1个文件,则提示开通VIP
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; limit_conn_zone $binary_remote_addr zone=conn_one:10m; server { listen 80; server_name test.yyang.com; charset utf8,gbk; limit_req zone=one burst=3 nodelay; limit_conn conn_one 1; limit_rate_after 50m; limit_rate 100k; limit_req_status 432; error_page 500 502 503 @error_temp; location @error_temp { return 302 https://vip.yyang.com; } location / { root /data; index index.html; } }