龙空技术网

使用nginx限制用户的访问

老王的日志 248

前言:

现在我们对“nginx屏蔽pc端”都比较重视,你们都想要剖析一些“nginx屏蔽pc端”的相关内容。那么小编同时在网摘上搜集了一些有关“nginx屏蔽pc端””的相关文章,希望你们能喜欢,咱们快快来了解一下吧!

使用ngx_http_limit_req_module限制用户访问

该模块使用的是漏斗算法来进行限制。

官方的配置示例如下:

http {    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;    ...    server {        ...        location /search/ {            limit_req zone=one burst=5;        }

参数的简单解释:

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

$binary_remote_addr 用来获取客户端的IP(如果使用负载均衡或CDN时需要进行更改)zone=one:10m,设置一个10M的内存空间,用来存储访问的频次信息rate=1r/s, 设置访问的频率,现在是1s 一次访问

limit_req zone=one burst=5 nodelay;

burst, 设置缓存的大小,如果有大量的请求过来时,超过的部分可以先放入缓冲区nodelay 超过访问频次而且缓冲区也满了的时候就会直接返回503

测试部分:

我自己写了一个简单的Go脚本进行测试,代码如下

package mainimport (	"fmt"	"net/http"	"time")func curl(){	r,err := http.Get(";)	if err != nil{		fmt.Println(err.Error())	}	fmt.Println(time.Now(), r.Status)}func main(){	for i := 0; i < 100; i++{		go curl()	}	time.Sleep(time.Millisecond*4000)}

100次请求开始的时间为10:48:38.8205601,结束时间为10:48:40.9850476,共有8个请求成功,其他均为503.符合预期.

使用ngx_http_limit_conn_module限制用户请求数

官方示例如下:

http {    limit_conn_zone $binary_remote_addr zone=addr:10m;    ...    server {        ...        location /download/ {            limit_conn addr 1;        }

配置和功能和上面的模块类似,就不再介绍。

使用负载均衡和CDN时限制用户的访问

前言:当使用CDN或负载均衡技术时,我们获取的remote_IP,很可能不是客户端的IP,因此我们需要获取客户端的真实IP再去做限制,可以通过"X-Forwarded-For"来获取。

nginx配置如下:

http {    #获取客户端的真实IP    map $http_x_forwarded_for  $clientRealIp {        default $remote_addr;        ~^(?P<firstAddr>[0-9\.]+),?.*$	$firstAddr;    }    #设置IP白名单,    geo $whiteiplist {        default 1;	127.0.0.1 0;	134.175.207.203 0;	#221.218.233.79 0;    }	#对内部的IP不设限    map $whiteiplist $all_limit {	1 $clientRealIP;	0 "";    }	#对IP做的限制    limit_conn_zone $all_limit zone=two:10m;    limit_conn two 5;    limit_req_zone $all_limit zone=one:10m rate=2r/s;        server {	location / {	    limit_req zone=one burst=5 nodelay;        }     }}

注:如果不生效,可以尝试重启软件。

标签: #nginx屏蔽pc端