Nginx의 연구 노트 (육) - 연결 제한, 액세스 제어

A, Nginx에 요청 제한

1.1 요청 제한

제한의 두 가지 종류가 있습니다 :

  • 연결 제한 : limit_conn_module
  • 요청 제한 : limit_req_module

연결 제한 limit_conn_module에 대한 모듈

키의 개수를 제한하기위한 수단은 각각 특히 정의 ngx_http_limit_conn_module 연결된 단일 IP 주소의 연결의 수.

모든 연결이 계산됩니다, 단지 서버의 경우 전체 계산 요청 헤더 커넥터, 요청이 읽은 처리합니다.

  • 연결 구성의 한계 주파수 :
Syntax: limit_conn_zone key zone=name:size;
Default: 
Context: http
	#可理解在内存中开辟一个区域对于指定的nginx变量(key,例如:binary_remote_addr)进行限制。name表示申请的空间的名字,size表示申请空间的大小。

Syntax: limit_conn zone number;
Default:  
Context: http, server, location
	#第二部分zone就是第一部分设置的名字name,number表示进行并发的限制。例如设置为1,表示一个时间段只能有一个。

  • 용법
http {
  # ...其它代码省略...
  # 开辟一个10m的连接空间,命名为addr
  limit_conn_zone $binary_remote_addr zone=addr:10m;
  server {
    ...
    location /download/ {
      # 服务器每次只允许一个IP地址连接
      limit_conn addr 1;
    }
  }
}

요청 모듈 제한 ngx_http_limit_req_module

단일 IP 주소 요청에서 특정의 처리 속도에서, 각각의 요청에 의해 정의 된 처리를 위해 제한적인 키 레이트. 완료 방법 "버킷 누출"의 사용을 제한

  • 요청 제한 구성 :
    Syntax: limit_req_zone key zone=name:size rate=rate;
    Default: 
    Context: http
 #第一部分配置和连接配置相似,rate表示速率,以秒s为单位(rate=1r/s)
   
    Syntax: limit_req zone=name [burst=number] [nodelay];
    Default: 
    Context: http, server, location
 #第二部分zone就是第一部分设置的名字name,[]内为可配置选项。   
  • 용법
http {
 
  # ...其它代码省略...
   
  limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
  	#开辟一个10m的请求空间,命名为one。同一个IP发送的请求,平均每秒只处理一次
  	#$binary_remote_addr :表示通过remote_addr这个标识来做限制,“binary_”的目的是缩写内存占用量,是限制同一客户端ip地址
	#zone=one:10m:表示生成一个大小为10M,名字为one的内存区域,用来存储访问的频次信息
	#rate=1r/s:表示允许相同标识的客户端的访问频次,这里限制的是每秒1次,即每秒只处理一个请求;比如30r/m的,即限制每2秒访问一次,即每2秒才处理一个请求。

  server {
      ...
 
    location /search/ {
    	# 1s同一个客户端只允许连接一次
      limit_req zone=one;
      	# 当客户端请求超过指定次数,最多宽限3次请求,并延迟处理,11个请求
      # limit_req zone=one burst=3;
      	# 当客户端请求超过指定次数,最多宽限3次请求,并立即处理。
      # limit_req zone=one burst=3 nodelay;
 
    }
  }
}

1.2 구성 연결 한계

1,정력 /usr/local/nginx/conf/nginx.conf
그림 삽입 설명 여기

2 추가

limit_conn_zone $binary_remote_addr zone=conn_zone:1m;
limit_req_zone $binary_remote_addr zone=req_zone:1m rate=1r/s;
	#  rate=1r/s每秒只能执行1次请求, 多的直接返回503错误。
			
    server {
        listen       80;
        server_name  localhost;
		#charset koi8-r;
		#access_log  logs/host.access.log  main;

        location / {
            root   html;
            #limit_conn conn_zone 1;
            #limit_req zone=req_zone burst=3 nodelay;
            #limit_req zone=req_zone burst=3;
            #limit_req zone=req_zone; 
            index  index.html index.htm;
        }

그림 삽입 설명 여기

우리는 상기에서 정의되는 영역의 두 번째 행, 요청 정의는 초 당 한계 원격 요청에 대한 요청을 나타내는 참조. binary_remote_addr 및 REMOTE_ADDR 대표하는 의미는 10 바이트 이상의 저장 REMOTE_ADDR 한 IP 저장 binary_remote_addr를 사용하여 동일한 (원격 호스트 IP)이다. 3 다음 지연 매개 변수는 즉시 nodelay 요청 반환 버스트

3, 신택스 체크 nginx를 -t새로 고침 의 nginx -s 다시로드

그림 삽입 설명 여기
4, 클라이언트 테스트 :40 내지 20 http://172.25.2.2/ -n AB40 페이지의 전체 동시 액세스의 수는 요구가 20 번이다.

그림 삽입 설명 여기이 시점에서, 우리는 (40) 액세스가 성공적으로 볼 수 있습니다.

1) 열기는 요청 제한 limit_req zone=req_zone, 고객과 1 초 만 연결할 수 있습니다

그림 삽입 설명 여기다시 클라이언트 테스트,40 내지 20 http://172.25.2.2/ -n AB우리는 성공적으로 완료 1.015s 압력 측정하면 볼 수 있습니다.

그림 삽입 설명 여기我们查看/usr/local/nginx/logs/access.log日志,看到只有一个请求成功,其他的都是直接返回503,即服务器拒绝了请求。

그림 삽입 설명 여기

2)打开请求限制limit_req zone=req_zone burst=3,

burst=3:burst爆发,这个配置是设置一个大小为3的缓冲区当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内等待,但是这个等待区里的位置只有3个,超过的请求会直接报503的错误然后返回。 在完成峰值请求之后,缓冲队列不能再放入请求。如果rate=1r/s,且这段时间内没有请求再到来,则每1s 缓冲队列就能恢复一个缓冲请求的能力,直到恢复到能缓冲3个请求位置。
그림 삽입 설명 여기

再次在客户端测试,ab -n 40 -c 20 http://172.25.2.2/,我们可以看到请求只成功了4次,且3.003s才完成压测。

그림 삽입 설명 여기我们查看/usr/local/nginx/logs/access.log日志,看到只有4个请求成功,其他的都是直接返回503,即服务器拒绝了请求。

  • 我们可观察到17分8秒时,即压测第1秒时,成功处理了1个请求,另外有36个请求瞬间返回了503,剩余的3个请求每隔1秒处理一次。这是因为设置了burst=3,在服务器接收到40个并发请求后,先处理1个请求,同时将3个请求放入burst缓冲队列中,等待处理。而超过burst等待区的数量的请求就被直接抛弃了,报错503然后直接返回。

그림 삽입 설명 여기
此时,查看 /var/log/nginx/error.log日志,可以看到36个limiting request

그림 삽입 설명 여기
3)打开请求限制limit_req zone=req_zone burst=3 nodelay,

nodelay: 如果设置,会在瞬时提供处理(burst + rate)个请求的能力,请求超过(burst + rate)的时候就会直接返回503,永远不存在请求需要等待的情况。(这里的rate的单位是:r/s);如果没有设置,则所有请求会依次等待排队。

加brust=3和nodelay的情况下, 有一个容量为3的缓冲区, rate=1r/s每秒能执行4次请求, 4=1+3,多的直接返回503错误。
그림 삽입 설명 여기

再次在客户端测试,ab -n 40 -c 20 http://172.25.2.2/,我们可以看到压测在0.031秒内就完成了。

그림 삽입 설명 여기
我们查看/usr/local/nginx/logs/access.log日志,看到只有4个请求成功,其他的都是直接返回503。

  • 可以发现在1s内,服务器端处理了4个请求(峰值速度:burst+原来的处理速度)。对于剩下的36个请求,直接返回503,在下一秒如果继续向服务端发送40个请求,服务端会直接拒绝这40个请求并返回503。因为设定了每1s处理1个请求,所以直到3s 之后,才可以再处理一个请求,即如果此时向服务端发送40个请求,会返回39个503,一个200

그림 삽입 설명 여기

二、Nginx的访问控制

nginx的访问控制主要分为两类:

  • 基于IP的访问控制 http_access_module
  • 基于用户的登录认证 http_auth_basic_module,此种方法我们不多解释。

对于http_access_module模块

  • 配置
Syntax:    allow address | CIDR | unix: | all;
Default:  
Context:  http, server, location, limit_except
 
Syntax:    deny address | CIDR | unix: | all;
	# address:IP地址,例如:192.168.1.1
	# CIDR:例如:192.168.1.0/24;
	# unix:Socket方式
	# all:所有
Default:  
Context:  http, server, location, limit_except
  • 用法
server {
  # ...其它代码省略...
  location ~ ^/index_1.html {
    root  /usr/share/nginx/html;
    deny 172.25.2.250; # 拒绝这个IP访问
    allow all; # 允许其他所有IP访问
  }
 
  location ~ ^/index_2.html {
    root  /usr/share/nginx/html;
    allow 172.25.3.0/24; # 允许IP172.25.3.*访问
    deny all; # 拒绝其他所有IP访问
  }
}

编辑配置文件/usr/local/nginx/conf/nginx.conf
allow和deny会按照顺序, 从上往下, 找到第一个匹配规则, 判断是否允许访问, 所以一般把all放最后。
그림 삽입 설명 여기此时,从物理机(172.25.2.250)访问,可以看到没有权限。
그림 삽입 설명 여기
从另一台虚拟机(172.25.2.4)访问,可以访问。
그림 삽입 설명 여기
http_access_module模块的局限性:
nginx를 액세스 제어 제한 IP 제한에 클라이언트이지만, 모든 상호 작용과 nginx를 클라이언트로하며, 진정한 클라이언트를 nginx를 결정하지 않습니다. 우리가 직접 액세스하지 않지만 서버에 액세스 (예컨대 Nginx에 상기 CDN 등), 액세스 제어, 그 때 실패 중간 에이전트에 의해 수행되는 경우 (REMOTE_ADDR 직접 통신을 IP nginx에).

  • 제한 솔루션 요약 :

방법 A : 같은 HTTP_X_FORWARD_FOR 등의 액세스를 제어에 HTTP 헤더 정보를 사용하여. 이 액세스가 필요할 때 HTTP_X_FORWARDED_FOR 헤더 액세스를 제어에 대한 정보는이 문제를 해결하기 위해 더 나은 것, 당신은 모든 사용되는 IP 주소 정보를 가져와야한다
HTTP_X_FORWARDED_FOR 기록 과정 :

http_x_forwarded_for = Client IP, Proxy(1)IP, Proxy(2)IP,...

그림 삽입 설명 여기

방법 2 : 지리적 바인딩 모듈
방법 세 : HTTP를 통해 사용자 정의 변수

게시 된 102 개 원래 기사 · 원의 찬양 (21) · 전망 5322

추천

출처blog.csdn.net/ranrancc_/article/details/102719417