코드 중에 아래와 같이 json과 이미지 파일을 한번에 같이 전송하는 코드가 있다.
@PostMapping(value = "/test")
public ResponseDto<RecipeResponseDto.RecipeStatusDto> testCreateRecipe(
@RequestPart(value = "content") RecipeRequestDto.CreateRecipeDto request,
@RequestPart(value = "thumbnail") MultipartFile thumbnail,
@RequestPart(value = "stepImages") List<MultipartFile> stepImages) throws IOException {}
이에 대한 부하테스트를 진행하고자, 평소 즐겨 사용하던 포스트맨을 뒤로하고 Jmeter에 세팅을 시작했다. Files Upload에 업로드할 이미지와Json 파일을 추가하였다.
(Body Data에 Json을 작성하지 않은 이유: https://velog.io/@nwactris/Jmeter에서-json과-이미지-파일-동시에-request하기-이미지-리스트-전송하기)
포스트맨에서는 이미 잘 동작하는 것을 확인했고 json도 복붙했으니, 잘 돌아갈 것이라는 두근거림을 안고 실행버튼을 누르자..
Response code:413
Response message:Request Entity Too Large
라는 응답을 마주했다.
application.yml에서는 이미 maxSize가 아래와 같이 설정되어 있으니
servlet:
multipart:
maxFileSize: 30MB
maxRequestSize: 30MB
enabled: true
이 부분이 문제는 아니었을 것이라고 생각하였고, nginx.conf에 maxSize 설정이 추가로 필요한 것인지 생각이 들어, 해당 내용을 작성하고
client_max_body_size 30M;
다시 테스트를 해보았으나, 여전히 도메인으로 보낼 때는 413 에러가 발생했다.
그러다가 문득 다시 포스트맨을 확인해봤는데, 포스트맨에서 테스트를 할 때는 도메인이 아니라 ec2의 ip로 바로 요청을 보내 성공했던 것이었다. 따라서, jmeter에서도 도메인 대신 ip로 요청을 보내니 바로 성공했다.
하지만 정말 임시방편일 뿐이라 좀 더 근본적으로 해결하자는 생각이 들었다. 또한, ip로 보내는 것과 도메인으로 보내는 것에 어떤 차이가 있는지에 대한 의문이 있었다.
nginx의 log를 확인하니 다음과 같은 에러 로그가 발생한다.
[error] 2628#2628: *149010 client intended to send too large body: 7860316 bytes, client: 10.0.1.214, server: , request: "POST /test HTTP/1.1", host: "dev.zipdabang.shop"
분명 프로젝트의 .platform/nginx.conf 경로에 client_max_body_size 30M;를 추가했건만..
cat /etc/nginx/nginx.conf
위의 명령어로 빌드된 서버의 nginx.conf를 확인하니 내가 작성한 nginx.conf 내용이 전혀 반영되지 않았다.
(beanstalk으로 빌드 시, /var/app/current/.platform 하위에 내가 작성한 nginx.conf 파일이 별도로 생성되기 때문에, /etc/nginx/nginx.conf에 덮어 씌워지는게 맞는지 조차 잘 모르겠다..)
다만, include conf.d/*.conf; 에서 힌트를 얻어 conf.d 디렉토리 하위에 필요한 정보를 추가하면 되겠다는 생각이 들었다.
참고: https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/platforms-linux-extend.html
-- .platform/
|-- nginx/ # Proxy configuration
| |-- nginx.conf
| `-- conf.d/
| `-- custom.conf
찾아보니 .platform/ngnix/conf.d 하위에 원하는 설정을 작성하여 *.conf 파일을 추가하면 /etc/nginx/nginx.conf에 반영이 되는 듯 하다.
따라서 proxy.conf 라는 이름으로 파일을 추가해 주었다.
#.platform/ngnix/conf.d/proxy.conf
client_max_body_size 30M;
이를 반영해 다시 elb에서 빌드를 하니..
드디어 성공.. 413이 어디에서 발생하는지부터 찾느라 꽤 오래 헤맸는데 뿌듯하다..
우선, 위에서 aws가 제시한 디렉토리 구조를 살펴보면 nginx.conf 위치가 .platform/ngnix/nginx.conf 가 되어야 한다. 그런데, 막상 이렇게 하면 elb에서 빌드조차 되지 않는다. 그래서 지금 선택한 구조는 아래와 같다.
이렇게 두면, 제대로 돌아가긴 하는데 과연 내가 작성한 nginx.conf가 제대로 반영되고 있는 것인지 의문이 든다.
413문제는 해결했지만, 결국 왜 ip로 접근했을 때는 200이었고 도메인으로 접근했을 때는 413이 발생했는지 알아내지 못했다.. 이 것도 nginx.conf의 위치와 관련이 있지 않을까 막연히 추측 중이다.