티스토리 뷰

카테고리 없음

게시판 파일 업로드가 특정 크기부터 실패할 때 제한값을 찾는 순서

생각방 2026. 11. 8. 20:17

목차


    같은 게시판에 9MB짜리 파일은 올라가는데 10MB 파일은 업로드에 실패합니다. 이때 화면에 뜬 ‘첨부 실패’ 문구만으로는 어느 설정을 확인해서 수정해야될지 확인하기 어렵습니다. Nginx가 요청을 끊었을 수도 있고, PHP가 파일을 받지 못했거나 게시판이 자체 정책으로 거절했을 수도 있습니다. Nginx 뒤에서 PHP 게시판을 운영하는 구성을 예로 들어, 성공 요청과 실패 요청을 비교해 보겠습니다.


    게시판 파일 업로드 실패 시 확인 항목

    파일 크기와 요청 본문 크기

    먼저 테스트 게시판에서 허용된 형식의 파일을 준비합니다. 같은 계정과 같은 업로드 경로에서 파일 한 개씩 보내고, 제목·본문 같은 입력값은 고정한 채 파일 크기만 바꿉니다. 브라우저 개발자 도구의 Network에서 첨부를 전송한 요청을 찾아 경로, 시각, 응답 코드와 본문을 기록합니다. 요청의 Content-Length가 표시되면 파일 크기와 함께 바이트 단위로 적어 둡니다.


    multipart/form-data에서는 파일 외에 제목 같은 폼 필드, 각 부분의 헤더, 부분을 나누는 경계 문자열도 요청 본문에 들어갑니다. 이 구성에서는 정확히 10 MiB인 파일 하나를 첨부해도 요청 본문은 10 MiB보다 커집니다. 게시판이 여러 파일을 한 요청으로 보내는 방식이라면, 파일 한 개씩 올릴 때 성공해도 두 개를 함께 올릴 때 본문 한도에 걸릴 수 있습니다. RFC 7578 — multipart/form-data의 구성

    요약 파일 하나의 크기와 서버로 전송된 본문 크기를 각각 기록합니다.

    파일 크기와 요청 본문 크기

    413을 반환한 구간

    Nginx의 client_max_body_size는 요청 본문 전체에 적용됩니다. 실패 요청의 시각과 경로를 기준으로 Nginx 액세스 로그와 오류 로그를 맞춰 봅니다. 액세스 로그가 $status와 $upstream_status를 기록하도록 구성되어 있다면, 앞의 값은 클라이언트에 보낸 상태 코드, 뒤의 값은 백엔드에서 받은 상태 코드를 보여 줍니다. NGINX — client_max_body_size NGINX — 업스트림 로그 변수


    예를 들어 Nginx 액세스 로그에 413이 있고 업스트림 응답은 기록되지 않았다고 가정해 보겠습니다. 같은 요청의 오류 로그에 요청 본문이 너무 크다는 메시지까지 있다면, 해당 호스트와 업로드 경로에 적용되는 client_max_body_size를 확인할 차례입니다. 업스트림도 413을 반환했다면 그 응답을 보낸 백엔드의 로그를 봅니다. 두 로그에 공통 요청 ID가 있다면 같은 ID로 기록을 대조합니다. 브라우저에는 413이 보이는데 Nginx에는 요청 기록이 없다면, 로그 수집 범위를 먼저 확인하고 앞단에 CDN이나 게이트웨이가 있는지도 살핍니다.

    요약 브라우저의 413은 출발점입니다. 같은 요청을 남긴 로그에서 응답을 만든 구간을 찾습니다.

    에러메세지 확인

    PHP 제한과 게시판 정책

    요청이 PHP에 도달했다면 웹 요청을 처리하는 PHP 설정에서 post_max_size와 upload_max_filesize의 실제 적용값을 확인합니다. PHP-FPM을 사용한다면 터미널에서 실행한 PHP의 값과 다를 수 있으므로 웹 요청을 맡은 PHP-FPM의 설정을 봅니다. post_max_size는 POST 본문 전체에 적용됩니다. PHP의 기본 POST 처리 방식에서는 이 값을 넘기면 $_POST와 $_FILES가 비게 되어 화면에는 ‘필수값 누락’처럼 보일 수 있습니다. 본문 전체는 한도 안에 들어왔더라도 파일 한 개가 upload_max_filesize를 넘으면, 해당 파일의 $_FILES 오류 값에서 UPLOAD_ERR_INI_SIZE를 확인할 수 있습니다. PHP — POST 및 파일 업로드 크기 설정 PHP — 파일 업로드 오류 상수


    PHP에서 파일을 정상적으로 받았다면 게시판의 첨부 처리 로그나 검증 결과를 봅니다. 게시판이 파일당 최대 용량이나 첨부 합계 용량을 별도로 검사하는지 확인합니다. 예를 들어 파일 한 개씩은 성공하고 두 개를 같은 요청에 담을 때만 실패한다면, 두 파일 각각의 용량과 전송 본문 크기를 대조해 게시판의 합계 한도와 PHP의 POST 한도를 구분합니다.

    결론

    변경할 값은 게시판에서 허용할 파일당 크기와 한 번에 첨부할 수 있는 총량을 정한 뒤 결정합니다. 예를 들어 파일당 10 MiB를 허용한다면 PHP의 파일당 한도는 그 크기를 수용해야 하고, Nginx와 PHP의 본문 한도에는 폼 필드와 전송 형식에 필요한 여유도 있어야 합니다. 설정을 조정한 뒤에는 허용 한도 바로 아래·경계값·바로 위를 다시 올려 보고, 여러 파일을 허용하는 게시판에서는 합계 한도도 같은 방식으로 확인합니다. 성공한 요청에서는 글 등록과 첨부파일 저장을 함께 확인합니다.

    참고자료