Nginx如何实现并发连接与IP流量限速功能

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/