使用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;
        } 
    }

}

注:如果不生效,可以嘗試重啟軟件。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM