nginx
로 프록시 서버를 설정한 상태였고 사용자가 5장의 이미지를 한번에 서버에 보내 업로드 하는 기능이 있었다.
이미지를 한번에 보내는 과정에서 위와같은 오류가 뜨며 기능이 제대로 먹히지 않았다…
413 Request Entity Too Large
nginx설정중 요청의 크기를 제한 가능하며 위 문구는 제한한 크키보다 큰 요청을 받았을때 뱉는 응답이라고한다.
아래는 내가 설정한 nginx.conf
의 내용이다.
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log error;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
# 요 밑에는 server, location 블럭으로 생략한다.
...
}
보다 싶히 아무런 크기 제한 설정을 하지 않은것을 확인 가능하다.
https://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size
클라이언트 요청 본문의 최대 허용 크기를 설정합니다. 요청의 크기가 설정된 값을 초과하면 클라이언트에 413(요청 엔티티가 너무 큼) 오류가 반환됩니다. 브라우저에서 이 오류를 올바르게 표시할 수 없다는 점에 유의하세요. 크기를 0으로 설정하면 클라이언트 요청 본문 크기 확인이 비활성화됩니다.
http, server, location 블럭에 설정 가능하고 client_max_body_size 구문을 이용해 설정 가능하며 아무것도 설정하지 않으면 1메가바이트 이고 설정을 비활성화 하려면 0으로 설정하라고 한다!
그렇다면 나의 현재 nginx 요청 제한 크기는 1MB 가 되는것
내가 보낸 http 요청의 request body의 크기는 어떻게 확인할까?
정답은 request header인 Content-Length
에 있다.
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Length
Content-Length 헤더는 수신자에게 전송되는 메시지 본문의 크기(바이트)를 나타냅니다.
request body의 크기를 나타내며 바이트 단위로 단위를 측정한다고 한다.
내가 요청한 http의 헤더를 살펴보자
크롬 브라우저엔 정말 편리하게 request header만 복사 가능하게 기능을 제공한다.
아래는 내가 보낸 요청의 헤더 이다.
POST /api/image/all HTTP/1.1
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
Connection: keep-alive
===
# 요부분!
Content-Length: 3209388
===
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryyhRJGkf0p1rSFluH
Cookie: ajs_anonymous_id=b4568734-0904-4d6e-ac1e-a9221e07b711
Host: remomory.shop
Origin: https://remomory.shop
Referer: https://remomory.shop/diary/draw
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Safari/605.1.15
내가 보낸 요청의 Content-Length 값은 3209388바이트로 어림잡아 3.2MB 정도가 되겠다!
200x200 크기의 사진 4장을 업로드 하기 때문에 이렇게 높은 크기의 요청이 날라가는 것이다.
위 nginx 공식문서에서 client_max_body_size
구문을 이용해 요청제한을 걸수 있다고 했다.
http
블럭에 아래와 같이 추가했다.
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log error;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
# 요기!
client_max_body_size 10M;
# 요 밑에는 server, location 블럭으로 생략한다.
...
}
10M을 적어주며 이제 내 nginx 서버는 최대 10M 요청 body 사이즈를 받을수 있게 되었다.
참고자료
https://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size
https://velog.io/@teddybearjung/HTTP-구조-및-핵심-요소
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Length
https://blog.leocat.kr/notes/2020/04/21/nginx-413-request-entity-too-large
https://velog.io/@lhjeong60/nginx-413-Request-entity-too-large-범인-찾기