Nginx로 대용량 파일 업로드 요청 처리하기

jinvicky·2025년 4월 1일
post-thumbnail

신청서 파일 업로드가 또 Nginx를 뻗게 만들었다... 해결 자체는 큰 일이 아니고 설정 변경이 전부였지만, 이번 포스팅에서 client_body_temp 를 이해할 수 있었다.

문제 상황

첨부파일이 백엔드 서버에 도달하지 못하고 Nginx단에서 500에러가 뜨며 요청이 거부되었다. 또한 첨부파일 API만 500에러가 뜨고, requestBody를 이용한 POST 요청은 제대로 처리되었다.

??? 왜 이러는데 ???

로그 분석하기

로그를 봐야만 원인을 분석할 수 있다. VsCode 기준으로 Shell Command : install 'code' command in PATH를 통해서 code 명령으로 로그를 열어본다.

에러 로그 위치

code opt/homebrew/var/log/nginx/error.log

수집한 에러 로그

2025/04/01 02:17:40 [crit] 848#0: *11 open() "/opt/homebrew/var/run/nginx/client_body_temp/0000000001" failed (13: Permission denied), client: ~ip주소~, server: 내 서버 도메인, request: "POST /대충요청경로 HTTP/1.1", host: "내 도메인"

원인 정의하기

client_body_temp 폴더와 permission denied가 눈에 띈다.
보통 폴더 권한이 없으면 이럴 것 같아서 nginx permission denied 위주로 검색한다.

간단한 해결

해당 경로에 쓰기 권한을 부여하면 된다.

sudo chmod -R 755 /opt/homebrew/var/run/nginx/client_body_temp

터미널에서 다음과 같은 결과가 나오면 성공이다.

꼭 재시작해야 한다.

sudo nginx -s reload

client_body_temp가 뭔데?

문제는 해결했지만, 왜 이런 문제가 발생했는 지 근본적인 원인을 알기 위해서 client_body_temp를 분석했다.

🌟 Nginx는 기본으로 업로드되는 요청 본문(body)을 우선 메모리 내의 버퍼에 저장하며, 이 설정이 client_body_buffer_size다. 하지만 이 버퍼의 용량조차 요청 본문이 초과한다면 Nginx는 client_body_temp 폴더에 임시로 저장한다. 이 과정에서 권한이 없어서 임시 저장을 못했고, 따라서 요청이 실패한 것이다.

버퍼 사이즈 개선

client_body_buffer_size는 기본값으로 32bit에서 8k, 64bit에서 16k 값을 가진다. 이번 신청 이미지는 17장으로 저번 최고치보다 많았고, 단순히 client_max_body_size를 늘려도 디스크 접근을 줄이기 위해서 버퍼의 사이즈를 늘려야 한다. 평균적으로 mb 단위의 이미지를 처리하고, 최대 20장 이상까지도 견디기 위해서 128k로 버퍼 크기를 늘렸다.

추가된 설정

client_body_buffer_size 128k
client_body_temp_path /opt/homebrew/var/run/nginx/client_body_temp;

참고

https://turtles7.tistory.com/49

profile
개발, 그림, 기록

0개의 댓글