Ngxin的限流方式

一、简介

Nginx的限流的实现,可以保证高并发场景下的服务的可用性,控制网络以及CPU/内存负载,极端场景下还可以减小暴力破解对系统的危害性。Nginx本身自带了几个限流模块 :

  • 对客户端的限流模块:

  • 对服务端的限流模块:

    • ngx_http_upstream_module:用于定义可以由proxy_passfastcgi_passuwsgi_passscgi_passmemcached_passgrpc_pass指令引用的服务器组;

二、限流模块

2.1、ngx_http_limit_conn_module

用于设置单IP最大允许的连接数,当超过该连接数,服务器将返回错误信息(默认错误码为503)。

http {
limit_conn_zone $binary_remote_addr zone=one:10m;
...
server {
...
location /download/ {
limit_conn one 10;
}
...
}
...
}
  • limit_conn_zone

    • 语法:limit_conn_zone key zone=name:size;
    • 示例解释:设置共享内存的大小,用于存储各Client的状态,其中zone配置对应的值可以自定义;
    • 配置位置:可配置于http中;
  • limit_conn

    • 语法:limit_conn zone number;
    • 示例解释:访问/download/地址的IP可以允许同时存在10个连接,其中one可以为其他值,需要保持与limit_conn_zone配置中的zone后的信息对应;
    • 配置位置:可配置于httpserverlocation中;
  • 更多参数请参考ngx_http_limit_conn_module模块的官方文档

2.2、ngx_http_limit_req_module

使用令牌桶的方式限制每个Client的请求处理速率,如果请求的速率超过限制则会被延迟处理,当数量超过突发值时会返回错误信息(默认错误码为503)。

http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
...
server {
...
location /search/ {
limit_req zone=one burst=5;
}
...
}
...
}
  • limit_req_zone

    • 语法:limit_req_zone key zone=name:size rate=rate[sync];
    • 示例解释:分配10m大小的共享内存存储客户端的状态,每个地址每秒只能请求1次;
    • 配置位置:可配置于http中;
  • limit_req

    • 语法:limit_req zone=name [burst=number] [nodelay | delay=number]
    • 示例解释:令牌桶一共有5块令牌,并且每秒钟只新增1块令牌,5块令牌发完后,多出来的请求就会返回503
    • 配置位置:可配置于httpserverlocation中;
  • 更多参数请参考ngx_http_limit_req_module模块的官方文档

2.3、ngx_http_upstream_module

upstream backend {
server backend1.example1.com:8083 max_conns=10;
server backend2.example2.com:8084 max_conns=10;
}

server {
location / {
proxy_pass http://backend;
}
}
  • max_conns:从1.5.9版本后开支持该参数(商业版本中),从1.11.5版本之后非商业版本也可以使用;

    • 语法:max_conns=number
    • 示例解释:限制连接后端服务器的最大连接数为10
    • 配置位置:可配置于upstream中;
  • 更多参数请参考ngx_http_upstream_module模块的官方文档

Author: bugwz
Link: https://bugwz.com/2019/10/30/nginx-current-limiting/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.