[nginx] 413 Request entity too large 범인 찾기

이호정·2023년 6월 13일
1

개발 중 nginx에서 날아온 행운의 편지
그 이름하야 413 Request entity too large!

정말 열받게도 열심히 만들어놓은 에러 핸들러에서는 잡히지 않고, 개발자 도구의 네트워크 탭에서만 확인할 수 있었다.
(왜 그런지는 아직 잘 모르겠다. 참고)

말그대로 요청의 사이즈가 너무 크다는 뜻이다.

현상

파일 업로드 기능을 구현하다가 마주하게 되었는데, 요청 사이즈가 1mb만 넘어가도 해당 에러가 발생했다.
참고로 nginx의 버전은 1.14.0 이고, spring 서버 앞단에 리버스 프록시로 nginx를 사용하고 있었다.

원인

nginx의 client_max_body_size 지시어로 요청의 최대 허용 크기를 설정할 수 있는데, 설정하지 않는다면 기본값으로 1mb가 적용된다.
nginx 공식문서

해결..?

구글에 '413 request entity too large nginx'로 검색하면 십중팔구 아래와 같은 처방전을 받을 수 있다.

// http | server | location
client_max_body_size 100m; //사이즈는 입맛대로

그러나 웬걸? 이미 location 내부에 설정되어 있는 것이 아닌가?

location / {
	...
	client_max_body_size 20m;
    ...
}

열심히 구글링하면서 나와 비슷한 현상을 찾았고, 이걸 테스트 하느라 거의 한나절을 소모했다.

client_max_body_size는 http, server, location 내부에서만 사용된다.
따라서 다음과 같은 대부분의 경우의 수를 테스트 해봤다.

  1. location에만 설정(기존 설정)
  2. server에만 설정
  3. http에만 설정
  4. location, server 모두 설정
  5. http, server 모두 설정
  6. http, server, location 모두 설정

결과는 모두 실패...
무엇이 문제인지 모르겠어 할 때쯤 동료가 보여준 nginx 로그....
nginx에는 요청조차 들어오지 않고 있었다.

범인 검거

결론부터 말하자면, 범인은 쿠버네티스의 인그레스(nginx)였다.

현재 인프라는 쿠버네티스에 의해 관리되고 있고, 인그레스가 nginx로 돌아가고 있었다.
내가 받은 행운의 편지는 인그레스(nginx)가 보냈던 것이었던 것이었다.

인그레스 yaml의 client_max_body_size 설정을 변경하니 제대로 동작하는 것을 보고 기쁨 30%, 허망함 70%의 눈물을 흘렸더랬다. 리버스 프록시의 client_max_body_size 설정은 기존 그대로(location only) 놔두어도 정상 동작했다.
인그레스 yaml 설정 - 내 경우에 20mb가 아니라 20m으로 설정해야 적용이 되었다. (까다롭다, 젠장할)

내 한나절은 무엇을 위한 시간이었을까..?

3줄 요약

  1. nginx(v1.14.0, 리버스 프록시), 413 응답은 client_max_body_size 설정이 답!
  2. http, server, location 어디에 해도 안되네?
  3. 쿠버네티스의 인그레스(nginx)가 범인,,, 엄한 놈 수갑 채웠네

0개의 댓글