Nginx如何实现并发连接与IP流量限速功能
一. 前言
本文针对 Nginx 的三个模块进行配置,并证实各自的功能特点:
(1)limit_conn_zone 模块 - 限制统一 IP 地址并发连接数;
(2)limit_request 模块 - 限制同一 IP 某段时间的访问量;
(3)core 模块提供 - limit_rate 限制同一 IP 流量。
在 Nginx 中 以 LIMIT 开头的 配置项,都是做 限制 功能,以上三个功能都是 Nginx 编译后就有的功能,属于内置模块。
location /vlovev/ {
if ( $http_x_forwarded_for = 117.139.252.46 ) {
return 200;
proxy_pass http://api.vlovev.cn;
proxy_set_header Accept-Encoding "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $http_x_forwarded_for;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
add_header From edu.vlovev.cn ;
proxy_cookie_path /edu/ /;
proxy_set_header Cookie $http_cookie;
proxy_connect_timeout 60000;
proxy_read_timeout 60000;
proxy_send_timeout 60000;
}
二. limit_conn_zone 模块
通过 limit_zone 模块来达到限制用户的连接数的目的,即限制同一用户 IP 地址的并发连接数。
2.1 配置示例
2.2 指令
指令名称:limit_conn_zone(nginx 1.18以后用 limit_conn_zone 取代了 limit_conn)
语法:limit_conn_zone key zone=name:size;
默认:no
区域:http
功能:该指令定义一个 zone,该 zone 存储会话的状态。
例如:上面的例子中,$binary_remote_addr 是 获取客户端ip地址的变量,长度为 4 字节,会话信息的长度为 32 字节。
指令名称:limit_conn
语法:limit_conn zone number;
默认:no
区域:http、server、location
功能:该指令用于为一个会话设定最大并发连接数。如果并发请求超过这个限制,那么将返回预定错误(limit_conn_status )
指令名称:limit_conn_status
语法:limit_conn_status code;
默认:limit_conn_status 503;
区域:http、server、location
功能:设置要返回的状态码以响应被拒绝的请求。
指令名称:limit_conn_log_level
语法:limit_conn_log_level info | notice | warn | error
默认值:error
区域:http、server、location
功能:该指令用于设置日志的错误级别,当达到连接限制时,将会产生错误日志。
上面的配置示例中,没有显式配置 limit_conn_status 、limit_conn_log_level ,如果没有配置,则启用它们的默认值。
2.3 测试
接下来,对 limit_conn_zone 模块的功能进行测试。
测试1:对页面访问的并发限制
首先,来尝试用户对页面访问的并发限制,配置如下:
通过配置,设定 location /download 这个区域,每个IP,同一时刻只存在一个连接。注意:并发的概念并不是说 每秒多少连接。
生成一个较大的 index.html 页面:
[root@vlovev /usr/local/nginx/conf]#cd ../html/
[root@vlovev /usr/local/nginx/html]#mkdir download/