在微服务架构中,我们经常要在网关中对服务进行限速,以保护后端服务的稳定性,防止被大流量冲垮,在Nginx中也可以对请求限速

Nginx中有两个指令:
  • 1.limit_conn 限制并发连接数
  • 2.limit_req 限制每秒连接数
1.limit_conn 限制并发连接数

ngx_http_limit_conn_module 默认编译进nginx,可通过–without-http_limit_conn_module禁用功能

http {
  #以IP为key进行限速,再定义一个共享内存size=10M,name=one,供下面的limit_conn指令使用,共享内存大小能对多少请求进行限速,可以根据业务调整
  limit_conn_zone $binary_remote_addr zone=one:10m;

  server {
    server_name zy.csxiuneng.com;
    root html/;
    
    location /{
      limit_conn_status 500;#默认503,自定义响应码
      limit_conn_log_level warn;#默认error,自定义为 warn
      #每秒只发送50字节给客户端,默认不设置,测试时可以设置	
      limit_rate 50; 
      #同时并发连接数为1,只要同时有2个客户端连接就会触发限速,对应上面limit_conn_zone的name=one
      limit_conn one 1; 
    }
  }
}
2.limit_req 限制每秒连接数

ngx_http_limit_req_module 默认编译进nginx,可通过–without_http_limit_req_module禁用功能

http {
  #以IP为key进行限速,再定义一个共享内存size=10M,name=one,每分钟可以处理10个请求
  limit_req_zone $binary_remote_addr zone=one:10m rate=10r/m;

  server {
    server_name zy.csxiuneng.com;
    root html/;
    
    location /{
      limit_req_status 500;#默认503,自定义响应码
      limit_req_log_level warn;#默认error,自定义为 warn
      limit_req zone=one burst=10; #对应上面limit_req_zone的name=one,同时,当请求达到最大上限10后,多余的请求放入burst,burst可以放入10个,如果超出burst个请求,只直接返回500给用户
    }
  }
}

如果同时配置limit_req、limit_conn,如果先触发limit_req则先生效,不会触发后面的limit_conn了

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐