zoukankan      html  css  js  c++  java
  • 使用nginx限制用户的访问

    使用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 main
    import (
    	"fmt"
    	"net/http"
    	"time"
    )
    func curl(){
    	r,err := http.Get("https://www.fengcc.club/")
    	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;
            } 
        }
    
    }
    

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

  • 相关阅读:
    更改修改VS Visual Studio debug默认调试浏览器
    网页特效:随浏览器滚动条移动的DIV层
    IIS7,WINDOWS2008运行.net2.0等版本程序出现这个错误。
    项目所需的应用程序未安装,确保已安装项目类型(.csproj)的应用程序的解决办法[转]
    C#WINFORM控件之ComboBox
    页面编码和js文件不同导致的IE6下脚本错误
    程序越写越难控制。
    .net页面事件顺序
    未能加载文件或程序集
    # ACwing 902最短编辑距离 (线性dp)
  • 原文地址:https://www.cnblogs.com/feng0919/p/13377933.html
Copyright © 2011-2022 走看看