Nginx 접근 속도 제한, 연결 수, 대역 폭 등 관련 상세 설명

Nginx 는 고성능 의 역방향 프 록 시 서버 로 백 엔 드 웹 서비스, 인터페이스 서비스 등의 입구 에 자주 사용 된다.nginx 자 체 는 관련 안전 제한 기능 을 제공 합 니 다. 여기 서 nginx 를 통 해 방문 속도, 연결 수 (병발 수), 대역 폭 속도 등 을 제한 하여 악성 DDOS, 악성 파충류 등 공격 으로 인해 서비스 가 무 너 지 는 것 을 방지 합 니 다.
 
원문 상세 한 내용 은 제 개인 블 로 그 를 보십시오.
오른쪽 단 추 를 누 르 면 새 탭 에서 링크 를 열 수 있 습 니 다.
'Nginx 접근 속도 제한, 연결 수, 대역 폭 등 관련 상세 설명'
구분자
 
머리말
Nginx 는 고성능 의 역방향 프 록 시 서버 로 백 엔 드 웹 서비스, 인터페이스 서비스 등의 입구 에 자주 사용 된다.nginx 자 체 는 관련 안전 제한 기능 을 제공 합 니 다. 여기 서 nginx 를 통 해 방문 속도, 연결 수 (병발 수), 대역 폭 속도 등 을 제한 하여 악성 DDOS, 악성 파충류 등 공격 으로 인 한 서비스 붕 괴 를 방지 하고 제3자 모듈 을 통 해 제한 을 초과 하여 IP 를 차단 할 수 있 습 니 다.
 
본문
 
1. 환경
centos 7, nginx - 1.12.2, yum 에 설 치 된 nginx.제한 을 실현 하려 면 nginx 의 ngx 를 사용 해 야 합 니 다.http_limit_conn_module,ngx_http_limit_req_모듈 모듈.
원본 코드 에 nginx 를 설치 하면 이 모델 들 은 nginx 가 설치 할 때 자동 으로 설치 되 며 추가 모듈 을 지정 하지 않 고 직접 컴 파일 하여 설치 하면 됩 니 다.
nginx 의 설 치 는 를 참조 하 십시오.
 
2. 접속 수 제한
 
매개 변수 설명
limit_conn_zone: http {} 층 에 키 를 정의 하고 공유 메모리 구역 의 인 자 를 설정 합 니 다. (작업 프로 세 스 는 이 구역 을 사용 하여 키 값 을 공유 하 는 계수 기 를 사용 합 니 다.)첫 번 째 매개 변수 로 키 로 계 산 된 표현 식 을 지정 합 니 다.두 번 째 매개 변수 zone 에서 지정 한 지역 의 이름과 크기 는 다음 과 같 습 니 다. my name 이라는 zone 을 예약 하고 크기 는 10m 입 니 다.
limit_conn_zone $binary_remote_addr zone=myname:10m;

그 중 $binaryremote_addr 는 키 로 사용 되 는 필드 입 니 다. $remote 입 니 다.addr 의 더 작은 바 이 너 리 형식.바로 클 라 이언 트 IP 의 바 이 너 리 입 니 다. 이 매개 변 수 는 매우 중요 합 니 다. 무엇 에 따라 연결 수 를 제한 하 는 지 결정 합 니 다. 가장 많이 사용 하 는 것 은 $biary 입 니 다.remote_addr, 이외에 $server 를 사용 할 수 있 습 니 다.name。
 
limit_conn: 공유 메모리 영역의 이름 을 첫 번 째 매개 변수 로 지정 하고 키 마다 허용 되 는 연결 수 를 두 번 째 매개 변수 로 지정 합 니 다. location {} server 로 정의 할 수 있 습 니 다. {} http {} 등 설정 중.
server  { 
    limit_conn myname 1;
}

예제 설정
http {
    ...  
    
    limit_conn_zone $binary_remote_addr zone=myname:10m;
    server {
        ...
        location / {
            limit_conn myname 1;
            ...
        }
    }
}

 
3. 연결 속도 제한
속도 제한 은 DDoS 공격 을 방지 하거나 백 엔 드 서버 가 동시에 너무 많은 요청 에 잠 겨 서비스 가 붕괴 되 고 반응 이 느 린 등 을 방지 하 는 데 사용 할 수 있 습 니 다. 이 방법 은 누 출 통 알고리즘 을 바탕 으로 흔히 볼 수 있 는 높 은 병발 제한 흐름 알고리즘 중 하나 입 니 다. 그 원리 에 대한 상세 한 내용 은 을 보십시오.
 
매개 변수 설명
limit_req_zone: 이 설정 은 http {} 층 에서 정 의 됩 니 다. 키 를 정의 하고 공유 메모리 구역 의 인 자 를 설정 합 니 다. 다음 세 개의 인 자 를 설정 합 니 다. 예 를 들 어 다음 과 같 습 니 다.
http  { 
    #... 
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; 
}

연결 수 제한 과 유사 합 니 다. 첫 번 째 매개 변 수 는 키 의 필드 이 고 zone 은 공유 메모리 영역 입 니 다. 이 구역 은 $binary_remote_addr 변 수 를 사용 하여 설정 한 클 라 이언 트 IP 주소 의 상 태 를 유지 합 니 다. $binary_remote_addr IPv 4 주소 의 값 크기 는 4 바이트 이 고 64 비트 플랫폼 의 저장 상 태 는 128 바이트 입 니 다.따라서 약 16, 000 개의 IP 주소 의 상태 정 보 는 이 지역 의 1 메가바이트 를 차지한다.
nginx 에서 새 항목 을 추가 해 야 할 때 저장 공간 이 다 소모 되면 가장 오래된 항목 이 삭 제 됩 니 다.새 기록 을 수용 할 공간 이 부족 하면 nginx 는 기본 503 상태 코드 를 되 돌려 주 고 상태 코드 를 사용자 정의 할 수 있 습 니 다.
rate: 초당 요청 수 r/s 또는 분당 요청 수 r/m, 지 정 된 요청 속도 제한, 즉 통 누수 속도.
 
limit_req: 유사 한 것 은 http {}, server {}, location {} 에서 사용 할 수 있 습 니 다.이 설정 은 세 개의 인자 가 있 습 니 다. 예 는 다음 과 같 습 니 다.
limit_req zone=one burst=5 nodelay;

#   
limit_req zone=one burst=5 delay=3;

 
zone 에서 공유 메모리 공간 이름 을 지정 하면 이 공간 에 설 치 된 rate 속 도 를 제한 하고 이 공간 을 사용 하 는 데 이 터 를 공유 할 수 있 습 니 다.
 
burst 는 돌발 요청 대기 열, 즉 통 이 새 는 통 입 니 다. 요청 속도 가 설 정 된 rate 를 초과 하면 돌발 요청 은 돌발 요청 대기 열 에 놓 여 처 리 를 기다 리 고 속 도 를 설정 하 는 rate 입 니 다.http 요청 에 있어 서 속도 가 고 르 지 않 습 니 다. 일련의 것 입 니 다. 한 페이지 를 클릭 하면 순간 에 여러 개의 요청 을 보 냅 니 다. 짧 은 시간 안에 속도 상한 선 에 도달 하기 쉽 습 니 다. 이 설정 은 이 문 제 를 잘 해결 할 수 있 습 니 다. 그러나 장시간 동안 전체적인 속 도 는 설정 한 rate, 즉 누 출 통 의 누수 속도 와 같 습 니 다.
 
nodelay / delay: delay = 3 으로 설정 하 는 방법 입 니 다. 그러면 5 개의 지연 요청 은 앞의 3 개 는 지연 되 지 않 고 직접 요청 합 니 다. 후 2 개 (burst - delay) 는 계속 지연 요청 합 니 다.이렇게 되면 전체 속도 제한 이 rate + delay 로 바 뀌 고 통 의 누수 구 를 늘 리 는 셈 이 며 통 의 용량 은 burst - delay 로 변 한다.nodelay 라면 지연 되 지 않 고 직접 요청 하면 전체 속 도 는 rate + burst 로 변 합 니 다. 즉, 통 이 없 으 면 누수 구 를 늘 리 고 누수 속 도 를 초과 하 는 요청 은 503 상태 코드 를 기본 으로 되 돌려 줍 니 다.
 
limit_req_status: 거부 한 요청 에 응답 하고 돌아 올 상태 코드 를 설정 합 니 다. 기본 값 503 입 니 다.예시:
limit_req_status 503;

예제 설정
http {
    ...  
    
    limit_req_zone $binary_remote_addr zone=myname:10m rate=10r/s;
    server {
        ...
        location / {
            limit_req zone=myname burst=1 nodelay;
            ...
        }
    }
}

위 설정 과 같이 누가 속 도 를 1 초 에 10 개의 요청 으로 정 했 습 니까? 돌발 요청 이 1 개 더 많 고 총 속 도 는 11 / s 입 니 다. 이 속 도 를 초과 하 는 요청 은 503 상태 코드 로 돌아 갑 니 다. 그러나 시간 이 사용 할 때 한 페이지 를 개발 하여 5 개의 요청 을 보 냅 니 다. 앞의 두 개 만 정상적으로 돌아 가 십시오. 그 다음 에 모두 503 으로 돌아 갑 니 다. 그리고 분명히 설정 한 속 도 는 11 / s 이기 때 문 입 니 다.넘 지 않 았 습 니 다.이것 은 원래 있 는 것 이 무엇 입 니까? nginx 제한 속 도 를 처음 사용 하 는 친구 가 이 문 제 를 가장 쉽게 만 날 수 있 습 니 다!!인터넷 에서 설명 하지 않 은 것 이 많 습 니 다. 여기 서 설명 에 중심 을 두 었 습 니 다. nginx 의 속도 제한 은 밀리초 단위 로 하 는 것 이지 초 가 아 닙 니 다!!
무슨 소리 야?즉, 10r / s 로 설정 되 어 있 지만 실제 nginx 가 실 행 될 때 ms 단위 에 따라 100 ms 의 한 요청, 즉 100 ms 는 하나의 요청 만 통과 할 수 있 습 니 다. 그리고 burst 의 1 개 를 더 하면 두 개 입 니 다. 그리고 http 요청 은 균일 한 속도 가 아 닙 니 다. 모두 순간 몇 개의 요청 이 왔 습 니 다.Nginx 로그 에서 $msec 인쇄 시간 스탬프 를 사용 하면 요청 한 시간 을 볼 수 있 습 니 다.순간 적 인 요청 시간 차이 가 매우 가 깝 고 심지어 같은 시간 까지 있 기 때문에 ms 단위 로 계산 하면 자연히 설 정 된 rate 를 초과 하여 503 으로 되 돌아 갑 니 다.따라서 http 요청 의 제한 에 있어 서 burst 는 매우 중요 합 니 다. burst + nodelay 인 자 를 사용 하여 속도 제한 을 설정 합 니 다.
 
4. 대역 폭 제한
각 연결 의 대역 폭 을 제한 하여 다운로드 속 도 를 제한 하고 데이터 제한 등에 사용 할 수 있다.
 
매개 변수 설명
limit_rate: 이 설정 을 통 해 모든 연결 의 대역 폭 을 제한 할 수 있 지만 클 라 이언 트 는 여러 개의 연결 을 열 수 있 기 때문에 전체 트 래 픽 이 작 아 지지 않 습 니 다. 다만 하나의 연결 이 대역 폭 을 독점 하 는 것 을 피 할 수 있 고 다운로드 가 더욱 균형 적 입 니 다.http {}, server {}, location {} 에 설정 할 수 있 습 니 다.
#        50kb/s
limit_rate 50k;
#        5m/s
limit_rate 5m;

 
limit_rate_after: 클 라 이언 트 가 일정 수량의 데 이 터 를 신속하게 다운로드 한 후에 나머지 데 이 터 를 다운로드 하 는 속 도 를 제한 합 니 다.http {}, server {}, location {} 에 도 설정 할 수 있 습 니 다.
#  500kb        ,    100k/s
limit_rate_after 500k;
limit_rate 100k;

이 두 설정 에 대해 목표 의 전체적인 대역 폭 을 제한 하려 면 연결 다운로드 속 도 를 제한 하 는 것 외 에 연결 속 도 를 제한 하여 연결 수 를 제한 하 는 것 과 함께 사용 할 수 있 습 니 다.
예제 설정
http {
    limit_conn_zone $binary_remote_address zone=addr:10m

    server {
        root /www/data;
        limit_conn addr 5;

        location / {
        }

        location /download/ {
            limit_conn addr 1;
            limit_rate 1m;
            limit_rate 50k;
        }
    }
}

 
5. IP 차단
위의 제한 방문 속 도 를 제외 하고 제3자 모듈 을 통 해 방문 속 도 를 초과 한 IP 에 대해 일정 시간 동안 봉인 을 해제 하 는 기능 을 간단 하고 편리 하 게 실현 할 수 있 습 니 다. 이것 은 제3자 모듈: ngx 가 필요 합 니 다.dynamic_limit_req_module。이 모듈 은 ngx 기반http_limit_req_module 모듈 에 서 는 사용 방법 이 유사 합 니 다. redis 를 버퍼 로 사용 하여 IP 데 이 터 를 저장 합 니 다.Github 주소:
https://github.com/limithit/ngx_dynamic_limit_req_module
이 플러그 인 을 다운로드 하여 nginx 에 추가 하고 nginx 는 제3자 모듈 을 추가 합 니 다. 참고 하 십시오.
《 Centos 7 nginx 는 서 비 스 를 중단 하지 않 고 새 모듈 이나 제3자 모듈 을 추가 합 니 다. 》
 
매개 변수 설명:
dynamic_limit_req_zone:   limit_req_zone,      :
dynamic_limit_req_zone key zone=name:size rate=rate redis=127.0.0.1 block_second=time;

redis 와 block 추가 설정second, redis 는 필요 한 redis 연결 주 소 를 지정 합 니 다. Blocksecond 는 IP 차단 시간 입 니 다.PS: 이 설정 은 redis host 만 있 고 포트, 비밀번호, 라 이브 러 리 설정 이 없습니다. 이 기본 값 은 6379 포트 를 사용 하고 비밀번호 가 없습니다. 기본 값 은 0 과 1 두 개의 redis 라 이브 러 리 를 사용 합 니 다.그리고 이 기본 값 은 코드 에 쓰 여 있 습 니 다. 이 제3자 모듈 을 사용 하려 면 이 기능 에 사용 할 redis 서 비 스 를 따로 시작 하 는 것 이 좋 습 니 다. 다른 것 과 혼합 하지 않 는 것 이 좋 습 니 다.
이 설정 들 의 부족 은 그다지 유연 하지 않 습 니 다. 이 모듈 은 c 언어 로 작 성 된 것 입 니 다. 능력 있 는 친 구 는 github 에 가서 코드 를 수정 하여 이 설정 들 을 추가 하여 사용 하기에 편리 하거나 Issue 를 제시 하여 작가 가 더 이상 보완 할 수 있 는 지 확인 할 수 있 습 니 다.
dynamic_limit_req: 유사 limitreq, 사용 방법 이 똑 같 고 매개 변수 도 같 습 니 다.
dynamic_limit_req_status: limitreq_status 와 유사 합 니 다. 사용 방법 은 완전히 같 습 니 다.
예제 설정
http {
    ...  
    
    dynamic_limit_req_zone $binary_remote_addr zone=aaa:10m rate=10r/s redis=127.0.0.1 block_second=300;
    server {
        ...
        location / {
            dynamic_limit_req zone=aaa burst=40 nodelay;
            ...
        }
    }
}

ngx 기반 이기 때문에http_limit_req_module 모듈 의, 그래서 안의 설정 과 사용 방식 은 모두 limit 와 유사 합 니 다.req_module 모듈 은 기본적으로 똑 같 습 니 다. 이것 은 설정 을 조금 더 추 가 했 을 뿐 입 니 다. 그러면 IP 를 차단 할 수 있 습 니 다. 봉 인 된 IP 는 redis 의 0 라 이브 러 리 에 존재 합 니 다. 만 료 시간 은 설정 한 차단 시간 이 고 시간 이 되면 해 지 됩 니 다.
이 는 기어 오 르 기 방지 에 자주 사용 되 는 것 으로 파충류 의 비용 을 추가 해 기어 오 르 는 백 엔 드 서비스 붕 괴 를 줄 이 는 것 이다.
 
 
끝나다
OK, 이 기록 을 소 개 했 습 니 다. 이번 설정 을 사용 하면 nginx 역방향 에이전트 의 제한 연결 수, 방문 속도, 대역 폭, 봉 IP 등 을 실현 할 수 있 습 니 다.유연 하 게 사용 하여 수 요 를 실현 하 다.
질문

좋은 웹페이지 즐겨찾기