为了保护服务器不被刷流量,或者业务方面的一些限制,需要做一些限速措施。
一、http 请求并发连接数模块:ngx_http_limit_conn_module
这个模块可以设置每个定义的变量(比如客户端ip)的并发连接数,比如:某个客户端ip在同一时间内的连接数不能超过某个值。
语法:
- 定义限制链接区域:
Syntax: limit_conn_zone key zone=name:size;
Default: —
Context: http
- 设置连接数限制:
Syntax: limit_conn zone number;
Default: —
Context: http, server, location
示例:
# 根据客户端ip进行限制,区域名称为perip,总容量为10m
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server {
...
# 使用perip区域名称(zone name),同一时间并发数不得超过10
limit_conn perip 10;
limit_conn perserver 100;
}
二、tcp 请求并发连接数模块:ngx_stream_limit_conn_module(since 1.9.3)
这是自 nginx 1.9.3 提供的 TCP负载均衡的限制流连接数模块,用法等同于ngx_http_limit_conn_module
。
三、http 请求限制模块:ngx_http_limit_req_module
这个模块用来限制每个被定义的变量(比如客户端ip)的访问速率,比如:通俗点来讲,每个ip可以每秒请求几次。
语法:
- 定义限速区:
Syntax: limit_req_zone key zone=name:size rate=rate;
Default: —
Context: http
- 设置限速:
Syntax: limit_req zone=name [burst=number] [nodelay];
Default: —
Context: http, server, location
示例:
#limit_req_zone 为定义一个限速区域,binary_remote_addr代表一个客户端ip,zone perip为区域名称,10m为总容量,rate=1r/s代表每秒只接受1个请求
limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
limit_req_zone $server_name zone=perserver:10m rate=10r/s;
server {
...
# 代表使用zone为preip的配置,设置的速率1个每秒,缓冲区5个请求,如果超过速率和缓存区大小,直接返回503异常码
limit_req zone=perip burst=5 nodelay;
# 使用persever的配置,10个请求每秒,缓冲区为10个请求,没有nodelay参数,则会将请求延迟处理
limit_req zone=perserver burst=10;
}
四、nginx http 核心模块:ngx_http_core_module
使用到了其中的limit_rate命令,可以限制响应速率比如:
limit_rate 1024K;
代表单词请求响应量最多为1024K。