추가
- AWS CloudFront를 사용할때 http header를 이용해서 특정 국가를 nginx를 이용해서 차단하고 싶을때
if ($http_cloudfront_viewer_country = "CN") {
return 403;
}
rate limit에 해당될때 json으로 리턴하고 싶을때 샘플
error_page 429 /429.json;
location /429.json {
add_header 'Content-Type' 'application/json charset=UTF-8';
return 429 '{"success":false, "errorCd":"RATE_LIMITED","msg":"Too Many Requests(rate limit nginx)"}';
}
중국쪽 봇 등으로 짜증날때 nginx로 전체 인입허용 트래픽을 빠르게 조절할때 사용할 목적으로 간단하게 메모해둡니다.
- 아래 내용은 추후 복/붙 가능한 형태로 좀 수정해둘 예정
http블럭에
limit_req_zone $binary_remote_addr zone=myLimit:10m rate=10r/s;
location 블럭안에
limit_req zone=myLimit burst=5 nodelay;
limit_req_zone
예) limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
- context: http
- key: 요청량 제한 단위 지정 (예. server_name, remote_addr, uri 등) $server_name을 지정하면 모든 트래픽에 대해 요청량을 제한함
- zone: 요청량 기록을 위해 사용하는 Key:Value 가 저장될 Shared Memory 크기.
- 주의: IP 단위로 요청량을 제한 할경우 충분히 큰 값을 설정하지 않으면 메모리 부족 발생할 때 모두 503에러
- rate: 허용할 request per second 값으로 10r/s를 설정하면 NGINX는 100ms 마다 1개의 요청을 처리
limit_req
예) limit_req zone=mylimit burst=10 nodelay;
- context: http > server > location
- burst: key에 설정한 요청량보다 초과된 요청량을 수용하는 크기로 대기큐.
- rate를 10 rps 로 설정했을 때 100ms 안에 10개의 요청이 들어오면 1개만 처리되고 나머지 9개의 요청은 503 에러가 발생하는 데 이 때 해당 에러를 완화하기 위해서 burst옵션을 사용
- nodelay: 요청이 rps 에 지정된 시간보다 빨리 처리되었을 때 rps에서 지정한 시간을 기다리지 않고 burst queue에 있는 다음 요청을 바로 처리. 해당 옵션을 사용하지 않는다면 burst queue가 비워질 때까지 새로운 요청은 모두 503 응답
limit_req_dry_run
- on: 실제로 제한은 하지 않고 로그를 남김
- 꼭 해당 기능을 이용해서 라이브 환경의 적절한 수치를 확인하고 적용하는게 좋음
- 로그에 $limit_req_status 설정 추가 필요
- 꼭 해당 기능을 이용해서 라이브 환경의 적절한 수치를 확인하고 적용하는게 좋음
기타
- 제한에서 제외할 IP설정 방법
geo $apply_limit {
default $binary_remote_addr;
10.10.0.0/16 ''; # 내부 네트워크 대역 10.10.*.* 은 access limit 사용안함
211.33.188.246 ''; # 외부의 특정 IP 211.33.188.246 는 access limit 사용안함
}
...
...
limit_req_zone $apply_limit zone=depend_rate_limit:10m rate=10r/s;
...
geo 모듈을 사용해서 client ip 를 확인해서 $apply_limit 이라는 변수를 새롭게 할당했다. 10.10.. 대역 이거나, (내부 네트워크 대역인 경우), 외부의 특정 211.33.188.246 인 경우에는 빈값이 지정된다.
이렇게 하고 나서 limit_req_zone 에 정의한 $apply_limit 변수를 사용하면, 예외로한 IP 에 대해서는 접속제한이 동작하지 않는다.
참고 링크
- https://docs.nginx.com/nginx/admin-guide/security-controls/controlling-access-proxied-http/
'기타' 카테고리의 다른 글
if kakao day 2 후기 (0) | 2019.09.02 |
---|---|
메모 - 아파치 OFBIZ (0) | 2019.05.23 |
SNS 공유시 캐시 처리 및 validataor 등 (0) | 2018.09.14 |
웹 취약점 진단도구 메모 (0) | 2018.07.09 |
좋은 코드 작성하기 참고 (0) | 2018.06.29 |