[nginx][에러해결] 413 Request Entity Too Large 오류

이원찬·2024년 9월 4일
0

Web

목록 보기
5/7

nginx로 프록시 서버를 설정한 상태였고 사용자가 5장의 이미지를 한번에 서버에 보내 업로드 하는 기능이 있었다.

이미지를 한번에 보내는 과정에서 위와같은 오류가 뜨며 기능이 제대로 먹히지 않았다…

413 Request Entity Too Large

nginx설정중 요청의 크기를 제한 가능하며 위 문구는 제한한 크키보다 큰 요청을 받았을때 뱉는 응답이라고한다.

그렇다면 내가 설정한 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 블럭으로 생략한다.
		...
}

보다 싶히 아무런 크기 제한 설정을 하지 않은것을 확인 가능하다.

nginx 공식문서를 확인해보자

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에 있다.

MDN의 문서를 살펴 보자

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.conf 설정으로 해결해보자

위 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-범인-찾기

profile
소통과 기록이 무기(Weapon)인 개발자

0개의 댓글