어쩌다보니 보안 관련 설정만 올리고 있는 거 같은 느낌이 드네요..

 

동일한 ip에서 여러 요청이 동시에 들어올 경우 nginx에서는 해당 요청을 제한할 수 있습니다.

1. 먼저 들어온 요청이 처리되는 동안 들어오는 요청 수 제한


limit_conn_zone $binary_remote_addr zone=addr:10m; server { location /download/ { limit_conn addr 1; }

 

위와 같이 설정할 경우 /download 로는 동일한 IP에서 1회만 동시에 요청을 보낼 수 있습니다.

이 때의 '동시'는 해당 요청이 서버에서 처리되고 있는 동안을 의미하구요.

 

실제로 테스트 서버에서 사이즈가 큰 파일을 위 값을 1을 주고 요청했을 때, 두번째로 요청한 인터넷 창에서는 모래시계만 실행되는 것을 확인할 수 있었습니다.

이 경우 기본적으로는 503을 return한다고 하는데요. 아래 설정을 이용해서 return code를 지정해 줄 수 있습니다.

limit_conn_status 404;

 

 

2. 요청 처리 비율 지정

 

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

server {
    location / {
        limit_req zone=one burst=5;
    }

위 설정은 단일 IP에서 들어오는 요청이 1초에 1회만 처리될 수 있음을 의미합니다. (request/minute도 가능 r/m)

5개 까지는 queue에서 보관하고, 요청이 burst 수를 넘어갈 경우 503 에러를 반환받게 됩니다.

limit_conn과 마찬가지로 에러 코드는 지정할 수 있습니다.

 

테스트 환경에서는 1r/m으로 지정하고 요청하였는데, burst에 할당된 개수까지는 처리가 되고 그 이후부터는 처리가 안되는 모습을 보였습니다.

 

3. ddos 막기

http {
  limit_conn_zone $binary_remote_addr zone=ddos_conn:10m;
  limit_req_zone $binary_remote_addr zone=ddos_req:10m rate=5r/s;

  server {
    limit_conn ddos_conn 10;
    limit_req zone=ddos_req burst=10 nodelay;
  }
}

위 두 가지 옵션을 사용해서 위와 같이 ddos 공격을 막도록 설정할 수 있습니다.

 

위에서 zone의 shared memory size를 모두 10MB로 설정하였는데요.

사이트 규모에 따라 적절한 사이즈는 달라질 수 있을 것 같습니다. 일단 용량이 모자랄 경우 503 에러를 return하게 되고, 로그에 기록이 남는다고 합니다.