본문 바로가기

프로젝트

client intended to send too large body 문제 해결하기

문제 사항

사이드 프로젝트 배포 앱에서 프로필 업데이트를 하는데 실패를 하는 상황이 발생했다. 테스트 환경에서도 문제가 없었으며, Postman을 통해 요청을 보냈을 때도 정상적으로 처리가 되는 것을 확인했다. 그래서 ElasticBeanstalk을 통해 배포된 서버의 로그를 확인했고 아래와 같은 예외가 발생한다는 것을 알았다. 

[error] 2580#2580: *19639 client intended to send too large body: 2537093 bytes

원인

로그를 확인한 결과 클라이언트에서 API를 요청할 때 보내는 데이터의 크기가 커서 생기는 문제라는 것을 알 수 있었다. Postman을 통해서 요청을 했을 때는 크기가 작은 사진을 보내다보니 확인할 수 없었던 문제였다.

해결하기

사진의 크기로 인해 생기는 문제를 해결하기 위해 Multipartfile에 대한 Servlet 환경 설정을 확인하기로 했다. 그런데 이미 크기가 50MB로 설정이 되어있는 것을 확인할 수 있었다. 또한 로컬에서 테스트 했을 때도 이 설정은 정상 동작하는 것을 확인할 수 있었다.

 

spring:
  servlet:
    multipart:
      max-file-size: 50MB
      max-request-size: 50MB

 

 

그렇다면, 다른 부분에서 요청 데이터의 크기를 제한하고 있는 것이었고 그 부분을 찾아보기로 했다. 

우리가 배포하고 있는 환경 EalsticBeanstalk에는 Nginx를 사용을 하는데 Nginx에서도 요청 데이터의 크기를 설정할 수 있다는 것을 알게 되었다. 요청에 대한 크기 제한이 여기서 걸린다는 가설을 세우고 전송 데이터의 크기를 Servlet 설정과 동일하게 맞춰주기로 했다.

 

ElasticBeanstalk Nginx 설정 파일 위치

AWS ElasticBeanstalk 공식 문서를 확인해보니 Nginx 설정을 위해서는 아래와 같은 폴더에 파일을 넣어야 했다. 우리 프로젝트에도 이와 같은 폴더 설정 아래 Nginx에 요청 데이터의 크기 설정 파일을 넣어줬다.

 

`-- .platform
       |-- nginx
       |-- nginx.conf
       `-- conf.d
               `-- custom.conf

 

 

다른 것은 건드리지 않고 요청 데이터의 크기를 "client_max_body_size" 값을 통해 Servlet 요청 데이터 크기와 동일하게 설정해줬다. 

 

client_max_body_size 50m;

결론

위와 같은 설정을 하고나니, 배포 앱에서 프로필 등록 및 수정 API 요청이 정상적으로 처리가 되는 것을 확인할 수 있었다. 이번 기회를 통해 내가 사용하고 있는 환경을 더 잘 알아야겠다는 생각을 하게 되었다. 내가 작성하는 코드에서만 문제가 발생하는 것이 아니라... 내가 사용하고 있는 환경에서도 문제가 발생할 수 있다. 항상 생각하고 열린 생각으로 접근을 하자. 

참고한 AWS URL

 

Elastic Beanstalk Linux 플랫폼 확장 - AWS Elastic Beanstalk

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다. Elastic Beanstalk Linux 플랫폼 확장 AWS Elastic Beanstalk Linux 플랫폼은 애플리케이

docs.aws.amazon.com