Profile picture

[nginx/kubernetes] 413 Request entity too large 해결하기 - k8s/ingress

JaehyoJJAng2023년 06월 11일

문제점

image

쿠버네티스로 블로그형 서비스를 배포하고 사진, 동영상 등의 이미지 데이터 테스트를 위해 업로드 하던 도중 위와 같은 에러 페이지를 맞닥뜨렸다!


확인 결과 요청되는 이미지나, 영상의 크기가 1mb만 넘어가도 위와 같은 에러를 발생시킨다.


현재 앱 서버(Django) 앞단에 리버스 프록시용인 nginx를 두고 있다.


원인


nginxclient_max_body_sise 지시어로 요청의 최대 허용 크기를 설정할 수 있는데,

이때 해당 값을 따로 설정하지 않았다면 기본값으로 1mb가 적용된다.


구글에 413 request entity too large를 검색하면 아래와 같은 해결 방법을 얻을 수 있는데

client_max_body_size 100m; # 사이즈는 사용자 임의로 설정

본인은 이미 nginx에 해당 설정이 들어가있는 상태였다.

location / {
  ...
  client_max_body_size 0; # 사이즈 리미트 해제
}

해결 방법

결론부터 말하면 쿠버네티스의 ingress가 범인이었다.

현재 서비스가 쿠버네티스에 의해 관리되고 있고, ingress 또한 nginx로 동작 중이다.


image

결국 위 에러는 리버스 프록시로 사용 중인 앱 서비스 앞단에 위치한 nginx로부터 발생한 에러가 아닌

nginx ingress로부터 발생한 에러인 것이다.


ingress.yamlclient_max_body_sise 값을 변경하니 서비스가 정상적으로 동작한다.


ConfigMap을 이용한 Global 설정 변경

nginx-ingress-controllernginx-configuration 이라는 이름의 ConfigMap을 통해 전역 설정을 제어할 수 있다.

여기에서 client_max_body_size 변경이 가능하다.


1. ConfigMap 확인

kubectl get configmap -n ingress-nginx

2. ConfigMap 수정

kubectl edit configmap nginx-configuration -n ingress-nginx

다음 항목을 추가하거나 수정해주자.

data:
  client-max-body-size: "50m"

3. Ingress 컨트롤러 Pod 재시작

kubectl delete pod -l app.kubernetes.io/name=ingress-nginx -n ingress-nginx

주석(Annotations)을 이용한 특정 Ingress 리소스 설정

특정 Ingress 리소스에만 client_max_body_sise 설정을 변경하려면 해당 방법을 따라하면 된다.


1. Ingress 리소스 주석 추가

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app-ingress
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: "50m" # 다음 주석 추가
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-app-service
            port:
              number: 80

이 설정은 Ingress 리소스에만 적용되며, 글로벌 설정에는 영향을 주지 않는다!


Loading script...