본문 바로가기

Server

Nginx request 제한 설정하기

728x90

서버를 돌리면 무지성으로 해외에서 봇을 통해서 크롤링하는건지 무수한 요청을 하는 아이피가 종종 보인다.

그 때문에 백그라운드로 express서버를 돌려놓으면 어느새 서버가 꺼져있는 경우가 있다.

nginx에서 요청 제한을 설정해봤다.

 

1. limit_req_zone 설정

시간당 request 개수를 설정한다.

 

limit_req_zone $binary_remote_addr zone=ddos_req:10m rate=5r/s;

server {
    # ...
    location / {
        limit_req zone=ddos_req;
    # ...
    }
}

$binary_remote_addr

=> 클라이언트 ip 주소 정보

 

zone=ddos_req:10m

=> 클라이언트의 request를 저장하는 메모리 영역 확보, 메모리 영역 이름 ddos_req, 10m는 10mb를의미한다.

 

rate=5r/s

=> 1s(초)당 5개의 request를 할당 지정. ex)30r/m 은 최대 1분에 30개 요청

 

limit_req zone=ddos_req

=> 설정한 limit_req_zone 적용, 메모리영역은 ddos_req로

 

최대 요청 개수를 벗어나는 요청에는 503 응답을 디폴트로 하게된다. 응답 코드는 설정이 가능

ex) limit_req_status 404;

 

초과된 request에 허용을 해줄수 있는 burst 옵션이 있다.

 

limit_req zone=ddos_req burst=5;

초과된 request 최대 5개까지 임시로 저장한 후 처리가 가능하다. 따라서 최대 1초에 10개

 

 

2. limit_conn_zone 설정

하나의 클라이언트 ip의 동시 요청 개수를 제한하는 설정

 

limit_conn_zone $binary_remote_addr zone=ddos_conn:10m;

server {
    # ...
    location /login {
        limit_conn ddos_conn 10;
        # ...
    }
}

limit_conn ddos_conn 10

=> ip당 동시 최대 10개 request 까지만 처리한다

 

3. request timeout 설정

server {
    client_body_timeout 5s;
    client_header_timeout 5s;
    # ...
}

body와 header의 최대시간을 5초로 설정한다.

기본값은 60초

728x90