资讯专栏INFORMATION COLUMN

Nginx连接数、请求数限制应用详解

liuchengxu / 924人阅读

摘要:指令说明当超过限制后,返回的响应状态码,默认是,现在你就知道上面为什么会返回服务暂时不可用例子同时限制和虚拟主机最大并发连接根据请求参数来限制请求设置默认值模块的使用和模块差不多,这里暂时不在讲述,可查看官方文档参考文档

需求

秒杀、抢购并发限制、队列缓冲

下载带宽限制

防止攻击

nginx连接数限制模块
说明:nginx有很多模块、模块下面又分很多指令,下面就说说limit_conn_zone和limit_conn两指令
1、limit_conn_zone

语法:

Syntax:     limit_conn_zone key zone=name:size;
Default:     —
Context:     http

nginx配置分为三个段:http、server、location,大概格式如下:

http {

    server {
        listen       80;
        server_name  www.tomener.com tomener.com;
        location / {
            root   /var/www/tomener;
            index  index.php index.html index.htm;
            set    $limit_key $binary_remote_addr;
            set    $limit_number 10;
        }
    }

}

nginx配置中可以设置变量,例如上面的$limit_key和$limit_number连个变量,后面是变量的值,好了这些都是对不太了解nginx配置的朋友的一些说明、具体可以搜索一下。

看上面的语法,limit_conn_zone只能用在http段,例如:

http {
    limit_conn_zone $binary_remote_addr zone=addr:10m;
    server {
        listen       80;
        server_name  www.tomener.com tomener.com;
        location / {
            root   /var/www/tomener;
            index  index.php index.html index.htm;
            limit_conn addr 5; #是限制每个IP只能发起5个连接
            limit_rate 100k; #限速为 100KB/秒
        }
    }
}

分析:
Syntax: limit_conn_zone key zone=name:size;

对于关系:
key => $binary_remote_addr #二进制的IP地址
name => addr #随便取的一个名字,比如,你可以取成abc
size => 10m #空间大小,这里是10兆
一个二进制的ip地址在32位机器上占用32个字节,在64位机器上占用63个字节,那么10M可以存放多少呢,计算一下,10x1024x1024/32 = 327680,意思就是可以存放326780个ip地址(32位),64位可以存放163840个ip

1、key:键,可以说是一个规则,就是对客服端连接的一个标识,比如上面用的是IP地址,比如我们可以用$query_string,例如:/index.php?mp=138944093953,那我们就可以根据mp的值来限制连接数,更多的nginx内置变量请查看http://nginx.org/en/docs/varindex.html

2、zone:共享内存空间,作用:保存每个key对应的连接数

3、size:共享内存空间大小,如1M、10M、100K

当共享内存空间被耗尽,服务器将会对后续所有的请求返回 503 (Service Temporarily Unavailable) 错误

limit_conn指令
Syntax:     limit_conn zone number;
Default:     —
Context:     http, server, location

限制每个name对应客服端的连接数,比如上面的limit_conn addr 5;意思就是现在addr这个name对应的客服端的连接数,比如name对应的是45.168.68.202这个ip地址,那么这个ip最多有5个并发连接,那什么并发呢?像这样的连接,请求到达并已经读取了请求头信息到响应头信息发送完毕,在这个过程中的连接,当一个客服端的并发连接达到我们设置的5个以上时,会返回503 (Service Temporarily Unavailable) 错误

这里,小伙伴对这个zone估计还是有一些疑问,有疑问可以在下面评论,大家一起讨论,比如,有人可能会问,一个客服端占用5个,那么327680只能容纳65536个客服端,那么第65537个客服端就会返回503错误

limit_conn_log_level指令
Syntax:     limit_conn_log_level info | notice | warn | error;
Default:     limit_conn_log_level error;
Context:     http, server, location

说明:当达到最大限制连接数后,记录日志的等级。

limit_conn_status指令
Syntax:     limit_conn_status code;
Default:     limit_conn_status 503;
Context:     http, server, location

说明:当超过限制后,返回的响应状态码,默认是503,现在你就知道上面为什么会返回503(Service Temporarily Unavailable)服务暂时不可用

例子:

1、同时限制ip和虚拟主机最大并发连接

http {
    limit_conn_zone $binary_remote_addr zone=perip:10m;
    limit_conn_zone $server_name zone=perserver:10m;
    server {
        location / {
            limit_conn perip 10;
            limit_conn perserver 1000;
        }
    }
}

2、根据请求参数来限制

#请求:http://www.tomener.com/item.html?mp=1967464354&id=43566929485
limit_conn_zone $mp_limit_key zone=mp:10m;

server {

    set $mp_limit_key $binary_remote_addr; #key设置默认值
    if ( $query_string ~ .*mp=(d+).* ) {
        set $mp_limit_key $1;
    }
    location / {
        limit_conn mp 10;
    }
}
ngx_http_limit_req_module limit_req_zone
Syntax:     limit_req_zone key zone=name:size rate=rate;
Default:     —
Context:     http

ngx_http_limit_req_module模块的使用和ngx_http_limit_conn_module模块差不多,这里暂时不在讲述,可查看官方文档:
http://nginx.org/en/docs/http/ngx_http_limit_req_module.html

参考文档:

https://www.ttlsa.com/nginx/nginx-limited-connection-number-ngx_http_limit_conn_module-module/

https://www.ttlsa.com/nginx/nginx-limiting-the-number-of-requests-ngx_http_limit_req_module-module/

http://blog.csdn.net/shootyou/article/details/46813967

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/39259.html

相关文章

  • nginx 配置文件详解

    摘要:定义运行的用户和用户组进程数,建议设置为等于总核心数。开启限制连接数的时候需要使用的负载均衡,是权重,可以根据机器配置定义权重。本地动静分离反向代理配置所有的页面均交由或处理所有静态文件由直接读取不经过或 定义Nginx运行的用户和用户组 user www www; nginx进程数,建议设置为等于CPU总核心数。 worker_processes 8; 全局错误日志定义类型,[ de...

    import. 评论0 收藏0
  • nginx 配置文件详解

    摘要:定义运行的用户和用户组进程数,建议设置为等于总核心数。开启限制连接数的时候需要使用的负载均衡,是权重,可以根据机器配置定义权重。本地动静分离反向代理配置所有的页面均交由或处理所有静态文件由直接读取不经过或 定义Nginx运行的用户和用户组 user www www; nginx进程数,建议设置为等于CPU总核心数。 worker_processes 8; 全局错误日志定义类型,[ de...

    Youngs 评论0 收藏0
  • Nginx 配置文件 nginx.conf 详解

    摘要:定义运行的用户和用户组如果所有用户和用户组不相符可以使用命令进程数,建议设置为等于总核心数。注意如果图片显示不正常把这个改成。本地动静分离反向代理配置所有的页面均交由或处理所有静态文件由直接读取不经过或 定义Nginx运行的用户和用户组 user www www; //如果所有用户和用户组不相符 可以使用chown命令 nginx进程数,建议设置为等于CPU总核心数。 worker_p...

    stormjun 评论0 收藏0
  • nginx配置文件详解(转载)

    摘要:转载自北京流浪儿自己加了隐藏入口文件的配置定义运行的用户和用户组进程数,建议设置为等于总核心数。开启目录列表访问,合适下载服务器,默认关闭。本地动静分离反向代理配置所有的页面均交由或处理所有静态文件由直接读取不经过或 转载自北京流浪儿自己加了隐藏入口文件的配置 #定义Nginx运行的用户和用户组 user www www; #nginx进程数,建议设置为等于CPU总核心数。 wor...

    songze 评论0 收藏0
  • Nginx 配置文件详解

    摘要:每个打开文件描述符的最大数量限制。多长时间检查一次缓存的有效信息指令中的参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的。如果没有匹配的,则默认使用配置文件中第一个。 顶级配置 #定义 Nginx 运行的用户和用户组 user nginx; #进程文件 pid /var/run/nginx.pid; #错误日志位置和级别,debug、info、not...

    fjcgreat 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<