문제점
쿠버네티스로 블로그형 서비스를 배포하고 사진, 동영상 등의 이미지 데이터 테스트를 위해 업로드 하던 도중 위와 같은 에러 페이지를 맞닥뜨렸다!
확인 결과 요청되는 이미지나, 영상의 크기가 1mb
만 넘어가도 위와 같은 에러를 발생시킨다.
현재 앱 서버(Django
) 앞단에 리버스 프록시용인 nginx
를 두고 있다.
원인
client_max_body_sise
기본 값 (https://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size)
nginx
의 client_max_body_sise
지시어로 요청의 최대 허용 크기를 설정할 수 있는데,
이때 해당 값을 따로 설정하지 않았다면 기본값으로 1mb
가 적용된다.
구글에 413 request entity too large
를 검색하면 아래와 같은 해결 방법을 얻을 수 있는데
client_max_body_size 100m; # 사이즈는 사용자 임의로 설정
본인은 이미 nginx에 해당 설정이 들어가있는 상태였다.
location / {
...
client_max_body_size 0; # 사이즈 리미트 해제
}
해결 방법
결론부터 말하면 쿠버네티스의 ingress
가 범인이었다.
현재 서비스가 쿠버네티스에 의해 관리되고 있고, ingress 또한 nginx로 동작 중이다.
결국 위 에러는 리버스 프록시로 사용 중인 앱 서비스 앞단에 위치한 nginx로부터 발생한 에러가 아닌
nginx ingress로부터 발생한 에러인 것이다.
ingress.yaml
의 client_max_body_sise
값을 변경하니 서비스가 정상적으로 동작한다.
ConfigMap을 이용한 Global 설정 변경
nginx-ingress-controller
는 nginx-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 리소스에만 적용되며, 글로벌 설정에는 영향을 주지 않는다!