高并发系统有三把利器用来保护系统:缓存、降级和限流html
今天咱们这里说说限流。通常会在应用层配合redis作限流策略,这里咱们聊聊nginx层限流。node
限流的目的是经过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统,一旦达到限制速率则能够拒绝服务,以防止非预期的请求对系统压力过大而引发的系统瘫痪(友好点好比直接返回相应的json或则页面提示用户访问高峰,稍后再试)nginx
限流通常有三种: 计数器 、漏桶算法、令牌桶算redis
关于限流算法不是本文讨论范围,定义网上有大把介绍算法
1.先说下nginx里面配置直接返回json如何操做。json
location /json/ { default_type application/json; add_header Content-Type 'text/html; charset=utf-8'; return 200 '{"code":"6666,"msg":"访问高峰期..."}'; }
Nginx限流配置缓存
#限流 limit_req_zone $binary_remote_addr zone=myRateLimit:10m rate=2r/s; location / { #限流 limit_req zone=myRateLimit burst=2 nodelay; root html; index index.html index.htm; }
名词解释:并发
第1个参数:limit_req_zone定义在http块中,$binary_remote_addr表示保存客户端IP地址的二进制形式。
第2个参数:Zone定义IP状态及URL访问频率的共享内存区域。zone=keyword标识区域的名字,以及冒号后面跟区域大小。16000个IP地址的状态信息约1MB,因此示例中区域能够存储160000个IP地址。
第3个参数:Rate定义最大请求速率。示例中速率不能超过每秒2个请求。app
超过限流,默认返回503状态高并发
而后咱们在503错误页面配置返回相应json或者html页面便可。这里咱们返回json
error_page 503 /503; location = /503 { default_type application/json; add_header Content-Type 'text/html; charset=utf-8'; return 200 '{"code":"6666,"msg":"访问高峰期..."}'; }
展现结果以下
正常返回结果
限流后返回结果
至此nginx限流搞定