
신청서 파일 업로드가 또 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를 분석했다.
🌟 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;