Nginx 유량 제어

5552 단어 Nginx
Nginx 는 ngx 라 는 이름 을 제공 합 니 다.http_limit_req_module 의 모듈 은 유량 제 어 를 하고 이 모듈 은 누 출 통 알고리즘 을 사용 하여 실현 한다
공식 문서 참조: Module ngxhttp_limit_req_module
키 의 상 태 를 저장 하기 위해 공유 메모리 공간 을 설정 합 니 다. 특히 현재 과 다 한 요청 개수 입 니 다.key 의 값 은 텍스트, 변수 또는 앞의 두 가지 유형 값 으로 구 성 된 비교 결과 일 수 있 습 니 다.요청 중 키 에 대응 하 는 값 이 비어 있 으 면 계산 하지 않 습 니 다.
문법: limitreq_zone key zone=name:size rate=rate;
기본 값: 없 음
문맥: http
예시:
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    limit_req_zone $binary_remote_addr zone=ten:10m rate=10r/m;
	
	server {
......

설명:
다른 클 라 이언 트 IP 주 소 를 저장 하기 위해 텐 이라는 공유 메모리 공간 (zone = ten) 을 설정 하 였 습 니 다.($biary remote addr 는 $remote addr 보다 메모리 공간 을 차지 하 는 것 이 장점 입 니 다. IPv 4 는 4 바이트, IPv 6 는 16 바이트 로 고정 되 어 있 습 니 다. 32 비트 시스템 에 서 는 각 IP 가 32 비트 시스템 에 서 는 64 바이트, 64 비트 시스템 에 서 는 128 바이트 로 상 태 를 저장 합 니 다. 1m 공간 은 32 비트 시스템 에 서 는 1w6 여 개의 IP 상 태 를 저장 할 수 있 고 64 비트 시스템 에 서 는 8k 여 개의 IP 상 태 를 저장 할 수 있 습 니 다)이 공간 은 10m 메모리 (10m) 를 차지 하고 평균 요청 처리 속 도 는 분당 10 개의 요청 (rate = 10r / m) 을 초과 할 수 없습니다.
key 의 수량 을 미리 예측 하여 합 리 적 인 메모리 공간 을 분배 하여 지정 한 메모리 공간 이 소모 되 지 않도록 합 니 다.
속 도 는 요청 수량 / 초 (r / s) 를 사용 하여 지정 합 니 다. 속도 가 초당 하나의 요청 보다 낮 으 면 요청 수량 / 분 (r / m) 을 사용 하여 지정 할 수 있 습 니 다.
문법: limit req zone = name [burst = number] [nodelay];
기본 값: 없 음
문맥: http, server, location
예시:
location /Service {
	proxy_pass http://127.0.0.1:8080/Service/1.jsp;
	limit_req zone=ten burst=1 nodelay;
	limit_req_status 503;
}

설명:
특정 URL 에 사용 할 공유 메모리 공간 (zone = ten) 과 캐 시 대기 열 길이 (burst = 1) 를 설정 합 니 다.
요청 속도 가 공유 메모리 공간 설정 의 요청 실행 속 도 를 초과 하면 과 다 한 요청 은 지연 처 리 됩 니 다. 과 다 한 요청 개수 가 캐 시 대기 열 길 이 를 초과 하면 일부 요청 을 초과 하면 error 로 돌아 갑 니 다.
과도 한 요청 처 리 를 지연 시 키 지 않 으 려 면 nodelay 인 자 를 설정 할 수 있 습 니 다. 이 경우 과도 한 요청 은 error 로 되 돌아 갑 니 다.
문법: limit req log level info | notice | warn | error;
기본 값: limit req log level error;
문맥: http, server, location
설명:
요청 이 과 다 할 때 지연 처리 요청 과 직접 거부 요청 이 error log 에 기 록 된 로그 단 계 를 설정 합 니 다.
주의해 야 할 것 은 지연 처리 요청 로그 단 계 는 직접 거부 한 요청 로그 단계 보다 한 단계 낮 습 니 다. 기본 값 limit req log level error 를 사용 하면 직접 거부 한 요청 은 error 로 그 를 기록 하고 지연 처리 요청 은 warn 로 그 를 기록 합 니 다.
2017/11/01 20:34:44 [warn] 22401#0: *1 limiting requests, excess: 5.352 by zone "ten", 
client: 192.168.239.1, server: localhost, request: "GET /Service HTTP/1.1", host: "192.168.239.129"

테스트 할 때 error. log 에 지연 처리 요청 정 보 를 기록 하지 않 습 니 다.
문법: limit req status code;
기본 값: limit req status 503;
문맥: http, server, location
설명:
요청 이 과 다 하 게 거부 되 었 을 때 돌아 오 는 HTTP 상태 코드 입 니 다. access. log 의 로그 기록 은 다음 과 같 습 니 다.
192.168.239.1 - - [01/Nov/2017:20:34:44 -0700] "GET /Service HTTP/1.1" 502 
575 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) 
Chrome/61.0.3163.100 Safari/537.36"

전체 Nginx 프로필 은 다음 과 같 습 니 다.
worker_processes  1;

error_log  logs/error.log  notice;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

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

    server {
        listen       80;
        server_name  localhost;

        location /Service {
                proxy_pass http://127.0.0.1:8080/Service/1.jsp;
				limit_req zone=ten burst=5 nodelay;
                limit_req_log_level warn;
                limit_req_status 502;
        }
    }
}

ab 설치 및 테스트 진행:
apt-get install apache2-utils

테스트 결 과 를 통 해 알 수 있 듯 이 1s 에서 7 개의 요청 을 보 내 면 모두 6 개의 성공 (1 개의 정상 처리, 5 개의 지연 처리), 1 개의 실패, access. log 를 조회 하면 앞의 6 개의 요청 이 200 으로 돌아 가 고 마지막 요청 은 502 로 돌아 가 는 것 을 볼 수 있 습 니 다.
root@ubuntu:/usr/bin# ab -c 1 -n 7 http://192.168.239.129/Service
This is ApacheBench, Version 2.3 
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.239.129 (be patient).....done


Server Software:        nginx/1.12.2
Server Hostname:        192.168.239.129
Server Port:            80

Document Path:          /Service
Document Length:        59 bytes

Concurrency Level:      1
Time taken for tests:   0.017 seconds
Complete requests:      7
Failed requests:        1
   (Connect: 0, Receive: 0, Length: 1, Exceptions: 0)
Non-2xx responses:      1
Total transferred:      2137 bytes
HTML transferred:       527 bytes
Requests per second:    418.19 [#/sec] (mean)
Time per request:       2.391 [ms] (mean)
Time per request:       2.391 [ms] (mean, across all concurrent requests)
Transfer rate:          124.67 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:     0    2   4.0      1      11
Waiting:        0    1   3.7      0      10
Total:          0    2   4.0      1      11

Percentage of the requests served within a certain time (ms)
  50%      1
  66%      1
  75%      1
  80%      1
  90%     11
  95%     11
  98%     11
  99%     11
 100%     11 (longest request)

Nginx 설정 을 수정 하여 burst = 5 를 제거 하고 ab 를 다시 사용 하여 테스트 를 진행 하 였 는데 1 개의 요청 만 성공 하 였 고 6 개의 요청 이 실 패 했 습 니 다. access. log 를 보면 첫 번 째 요청 만 200 으로 돌아 가 고 나머지 6 개의 요청 만 502 로 돌아 가 는 것 을 볼 수 있 습 니 다.

좋은 웹페이지 즐겨찾기