Table of Contents
Nginx 로 reverse proxy를 구성할 때 과도한 요청에 대한 제한을 두기 위해서 limit_req
모듈을 적용해보았다.
nginx에서 지원하는 limit_req 모듈을 사용하면, 동일한 IP 에서 과도한 요청이 유입될 때, 이를 제한할 수 있다.
Limit req 설정
limit_req_zone $binary_remote_addr zone=depend_rate_limit:10m rate=10r/s;
# binary_remote_addr : 클라이언트의 IP를 기준으로 제한하겠다는 의미.
# zone name : depend_rate_limit
# share memory assign : 10M
# rate : 10 request / second
하나씩 살펴보자면,
- limit_req_zone 이라는 것은 요청-request를 확인하고 이를 제한하기 위해서 특정한 영역(zone)을 선언한다는 의미이다.
- $binary_remote_addr 은 nginx 에서 기본적으로 제공하는 내장 변수로, 클라이언트의 IP를 기준으로 제한을 하겠다는 의미이다.
- zone=depend_dos 라는 것은 zone 의 이름을 설정하는 것으로, zone의 이름은 임의로 변경이 가능하다
- 30m 이라는 것은 zone에서 활용가능한
share memory size
로. 10M 정도면 충분하다. - rate 는 요청-request 의 비율로, 여기에서는 초당 10개 이상의 요청-request 이 유입되면 제한을 하겠다는 의미이다. (r/s, r/m 가능)
이제 다음과 같이 적용하면 된다.
http {
limit_req_zone $binary_remote_addr zone=depend_rate_limit:10m rate=10r/s;
...
server {
...
location / {
...
limit_req zone=depend_rate_limit burst=5;
}
burst
를 적용한 것은 rate(여기서는 10r/s) 이상의 request-요청에 대해서 5개 까지는 queue에 보관하도록 하고, 그 이상은 에러를 반환하게 한다는 의미이다.
에러 반환
기본적으로 정의한 rate 를 넘어서는 request-요청에 대해서는 503
에러를 반환하는데. 이를 변경할 수 있다.
429 status code는 Too Many Requests
를 의미한다. 참고
limit_req zone=depend_rate_limit burst=5 nodelay;
limit_req_status 429;
log level 설정
제한에 걸린 request-요청을 기록할 때 log level 을 설정할 수 있다.
limit_req zone=depend_rate_limit burst=5 nodelay;
limit_req_status 429;
limit_req_log_level error;
제한에서 제외할 IP 설정
실제로 limit_req 모듈을 적용하기 전에, 내부 네트워크 대역이나, 특정 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 에 대해서는 접속제한이 동작하지 않는다.
참고
- http://nginx.org/en/docs/http/ngx_http_limit_req_module.html
- https://sarc.io/index.php/nginx/99-2014-03-18-14-30-00
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429
comments powered by Disqus
FEATURED TAGS
accesscontrol
adaptive-growth
alpine-linux
ansible
ansible-tower
apache2.4
architecture
argocd
asgi
aws
awx
backoffice
beautiful-goodbye
begining-docker
benchmark
blockhound
blocking-code
blog
book
brew-cask
build-cache
collaboration
communication
composer
confluence
cronjob
curl
customizing
customlog
data.sql
database
developer
difference
docker
docker-desktop
dockerize
dos-attack
eks
elasticsearch
empty-string
environment-to-do-well
errorlogformat
event-driven
experience
file-upload
filebeat
fluentd
forwarded-option
framework
fuse.js
golang
graceful-deploy
happy-new-year
haproxy
haproxy-1.8
haproxy-acl-logging
haproxy-custom-variable-logging
haproxy-metric
haproxy-reload-fail
haproxy-stat
heap-memory
hedgehog-sharp
how-do-i-work
hugo
index-alias
install
installation
instance-type
inverted-index
istio
iterm
java
jdk-21
jekyll
jekyll-to-hugo
jetbrains
json
k8s
k8s-api
kmooc
kubernetes
leadership
learning-in-2019
lets-encrypt
letsencrypt
limit_req_zone
litestar
logstash
m1-macbook-pro
macro
macro-key-mapping
mapping
match
match_phrase
maven
microservice-설계-및-구현
migration
mm
multi-datasource
mysql
nginx
nginx-ingress
nginx-regexp
ngram
null
openjdk
partial-matching
phpstorm
poeaa
portfolio-expansion
product-strategy
python
query-dsl
rate-limit
rate-litmiting
rds
reindex
rss-template
seamless-reload
search-on-hugo
service-account-role
sidebar-search
speed-up
speedup
spring
spring-boot
spring-camp
spring-camp-2023
spring-event
ssh
struct
study
system-manager
systemd-reload
template
term
throughput
timezone
tips
traffic-management
ulid
unused-plugins
uuid
ux-consideration
virtual-thread
vm-options
webflux
wildcard
zero-downtime
만들면서-배우는-클린-아키텍처
시작하세요-도커
엔터프라이즈-애플리케이션-아키텍처-패턴
쿠버네티스-시작하기