【转载请注明出处】:http://www.javashuo.com/article/p-pureehwv-n.htmlhtml
ngx_http_limit_conn_module是Nginx提供的链接数限流模块,是对某个KEY对应的总的网络链接数进行限流。能够按照IP来限制IP维度的总链接数,或者按照服务域名来限制某个域名的总链接数。但不是每个请求链接都会被计数器统计,只有那些被Nginx处理的且已经读取了整个请求头的请求链接才会被计数器统计。前端
http { limit_conn_zone $binary_remote_addr zone=addr:10m; limit_conn_log_level error; limit_conn_status 503; ... server { ... location /limit { limit_conn addr 1; }
$binary_remote_addr
,其表示IP地址,也可使用如$server_name
做为KEY来限制域名级别的最大链接数;语法是limit_conn_zone $variable zone=name:size;
$variable
定义键,zone=name定义区域名称,size定义各个键共享内存空间大小。$remote_addr
变量的长度为7字节到15字节,而存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。$binary_remote_addr
变量的长度是固定的4字节,存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。
1M共享空间能够保存3.2万个32位的状态,1.6万个64位的状态。
若是共享内存空间被耗尽,服务器将会对后续全部的请求返回 503 (Service Temporarily Unavailable) 错误。nginx
具体能够参考官方文档说明ngx_http_limit_conn_modulesegmentfault
limt_conn能够限流某个KEY的总并发/请求数,KEY能够根据须要变化。后端
nginx配置服务器
limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_log_level info; limit_conn_status 503; server { listen 8000; server_name localhost; location /limit { limit_conn perip 2; # add_header Content-Type "text/plain;charset=utf-8"; # return 200 "Your IP:$remote_addr"; proxy_pass http://127.0.0.1:8081; } }
容许每一个IP最大并发链接数为2。
使用AB测试工具进行测试,并发数为5个,总的请求数为30个:网络
ab -n 30 -c 5 http://127.0.0.1:8000/limit/test
查看nginx access.log:并发
nginx配置函数
limit_conn_zone $server_name zone=perserver:10m; limit_conn_log_level info; limit_conn_status 503; server { listen 8000; server_name localhost; location /limit { limit_conn perserver 3; proxy_pass http://127.0.0.1:8081; } }
access.log:工具
当多个 limit_conn 指令被配置时,全部的链接数限制都会生效。好比,下面配置不只会限制单一IP来源的链接数,同时也会限制单一服务器的总链接数:
limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=perserver:10m; limit_conn_log_level info; limit_conn_status 503; server { listen 8000; server_name localhost; location /limit { limit_conn perip 2; limit_conn perserver 3; proxy_pass http://127.0.0.1:8081; } }ss
ngx_http_limit_conn_module 模块虽然说能够解决当前面临的并发问题,可是会引入另一些问题的。前端若是有作LVS或反代,然后端启用了该模块功能,那就会有不少的503错误,这样的话,能够在前端启用该模块,要么就是设置白名单。
【转载请注明出处】:http://www.javashuo.com/article/p-pureehwv-n.html