http {
    server {
        ...
        location / {
            limit_rate 100k;  # 100 KB/s의 속도로 제한
        }
    }
}

 

요청에 대한 속도제한

 

 

 

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

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

$binary_remote_addr : 클라이언트의 ip 주소를 기반으로 제한 설정 $remote_addr 보다 메모리 사용량이 적어서 효율적

 

zone=one:10m one이라는 이름의 메모리영역에 10MB의 메모리 할당

 

rate=1r/s 클라이언트당 요청 비율을 초당 1개로 설정 -> 이렇게 하면 각 ip 주소에서 /api/로 1초에 한 번만 요청을 허용

 

 

 

location /api/

/api/ 경로에 대한 설정

zone=one 을 참조하여 이 루트의 요청을 제어

burst=5 대기열 용량을 5개의 추가 요청으로 설정

nodelay 일반 상황이 아닌, 대기열에 요청이 밀려 있는 경우 바로바로 큐된 요청들을 처리한다

 

쿠버네티스로 관리하던 사이트가 갑자기 접속이 안되는 경우가 있었다.

ERR_EMPTY_RESPONSE....?

응답이 없다니...?

요청을 받는 주체는 살아있는지 궁금해서 

kubectl get pods -n want-NameSpace 로 확인해보니 사이트가 올라와있는 파드는 살아있었다.

kubectl edit svc this-service -n want-NameSpace 로 서비스 type을 NodePort로 바꾸거나,

LoadBalancer로 변경(LB로 변경시 ingressClass가 디폴트인 경우 해당 클라우드에서 자동생성)해서 문제가 없다

그렇다면

인그레스 컨트롤러나 기존에 사용중인 로드밸런서 밖에 없다

 

그러다가 발견한게 로드밸런서 설정에 proxy_protocol이 해제되어있었다.

혹시나 해서 체크해보니 바로 잘 동작했다.

 

그렇다면 왜? proxy_protocol을 해제하니 안나온것일까?

 

답은 ingress-controller에 있었다.

ingress-controller는 ingress의 요청대로 들어온 트래픽을 처리해주는 리소스다

 

nginx ingress-controller, HAproxy, Traefik 같은 것을 사용한다고 한다.

HAproxy만 봐도 proxy가 관련이 있을 거 같은데

회사에서는 nginx ingress controller를 사용하고 있다.

이렇게 사진과 같이 proxy_protocol을 받아 처리한다.

 

클라이언트의 IP를 TCP의 proxy 헤더로 전송하는 방식이다.

 

proxy protocol 헤더는 아래와 같은 형태이며

 

PROXY TCP4 192.168.1.1 1234 10.0.0.1 80\r\n

 

PROXY 프로토콜의

TCP4 유형으로

192.168.1.1 ip의

1234 포트에서 오는 요청을

ip 가 10.0.0.1의 포트는 80번인 프록시서버로 수행 한다는 의미이다.

 

nginx ingress controller에서 저런식으로 트래픽을 처리하고 있으니

 

로드밸런서에서 proxy_protocol을 빼면 PROXY헤더가 아닌 HTTP의 헤더를 보내고

nginx가 이를 읽지못해 client의 IP를 몰라 응답이 없었던것이다.

 

조만간 이를 테스트 할 수 있는 환경을 구축해봐야겠다.

 

 

'nginx' 카테고리의 다른 글

Nginx 속도 제한 설정  (0) 2025.07.16
nginx health check (로드밸런서 사용 시 health check 실패인 경우)  (0) 2024.05.09
Nginx 용량 설정  (0) 2024.04.30

로드밸런서를 사용하고자 하는데

 

계속해서 health Check 에서 fail이 났다.

 

방법은 여러가지가 있다고는 한다. 톰캣을 사용하는 경우 nginx에서  proxy_pass등을 이용해

톰캣의 healthcheck.jsp를 사용하여 'OK'나 200 코드를 출력해서 success를 받는다고한다.

 

그런데 톰캣을 사용하지 않고 nginx만 사용하여, 고민을 하던 찰나에

바로 리턴값을 주면 되지 않을까 싶어서 활용해보았다.

 

nginx health check 라고 검색하면 여러개 나올 듯 싶다.

 

 

location /health {
           default_type text/html;
           return 200 "<!DOCTYPE html><h2>This is healthy</h2>\n";
       }

'nginx' 카테고리의 다른 글

Nginx 속도 제한 설정  (0) 2025.07.16
페이지가 작동하지 않습니다 ERR_EMPTY_RESPONSE  (2) 2024.11.25
Nginx 용량 설정  (0) 2024.04.30

블로그에 용량 업로드 시 용량 제한 문제가 발생

 

Client_max_body_size 300M로 설정 하여 용량 제한 300M로 설정

+ Recent posts