본문 바로가기

리눅스

NGINX 및 PHP-FPM에서 파일 업로드 크기를 늘리는 방법

728x90

NGINX 및 PHP-FPM에서 파일 업로드 크기를 늘리는 방법

NGINX 설정 변경

NGINX에서 클라이언트가 업로드하는 파일 크기를 제한하는 것은 client_max_body_size 디렉티브를 사용합니다. 원하는 파일 크기로 설정해야 합니다. 기본값은 1MB입니다.

vim /etc/nginx/nginx.conf
http {
    ...
    client_max_body_size 100M;
    ...
}

이 설정은 NGINX의 설정 파일에 위치하며 업로드한 파일의 최대 크기를 100MB로 제한합니다.

NGINX 재시작

변경된 NGINX 설정이 적용되려면 NGINX 서비스를 다시 시작해야 합니다.

sudo systemctl restart nginx

PHP-FPM 설정 변경

기본 설정(Default Value)

max_execution_time = 30
max_input_time = 60
memory_limit = 128M
post_max_size = 8M
file_uploads = On
upload_max_filesize = 2M
max_file_uploads = 20
  • upload_max_filesize : 업로드할 수 있는 개별 파일의 최대 크기를 설정합니다. 이 디렉티브는 업로드되는 단일 파일의 최대 크기를 제한합니다.
  • post_max_size : POST 요청으로 전송되는 데이터의 최대 크기를 설정합니다. 이 값은 파일 업로드와 함께 다른 데이터도 포함됩니다.
  • max_file_uploads : 단일 요청에서 업로드할 수 있는 최대 파일 수를 제한합니다.
  • upload_tmp_dir : 파일이 업로드되기 전에 임시로 저장될 디렉토리를 지정합니다. 업로드된 파일은 여기에 저장된 후 PHP 스크립트에서 처리됩니다.

PHP-FPM에서도 업로드된 파일의 크기를 제한하는 설정이 필요합니다. php.ini 파일을 수정하여 변경할 수 있습니다.

vim /etc/php/8.1/fpm/php.ini
upload_max_filesize = 100M
post_max_size = 100M

이 설정은 PHP의 php.ini 파일에 위치하며 업로드한 파일의 최대 크기를 100MB로 제한합니다. upload_max_filesize는 단일 파일의 크기를 제한하고 post_max_size는 전체 요청의 크기를 제한합니다.

PHP-FPM 재시작

변경된 PHP 설정이 적용되려면 PHP-FPM 서비스를 다시 시작해야 합니다.

sudo systemctl restart php-fpm

 

이렇게 설정하면 NGINX 및 PHP-FPM 환경에서 업로드할 수 있는 파일의 최대 크기가 100MB로 제한됩니다. 원하는 크기로 설정하여 파일 업로드 크기를 늘릴 수 있습니다.

728x90

파일 업로드 테스크 코드

index.html 파일 편집

vim /usr/share/nginx/html/index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>File Upload Test</title>
</head>
<body>
    <h1>File Upload Test</h1>
    <form action="upload.php" method="post" enctype="multipart/form-data">
        <input type="file" name="file" required><br>
        <input type="submit" value="Upload File">
    </form>
</body>
</html>

upload.php 파일 편집

vim /usr/share/nginx/html/upload.php
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_FILES["file"])) {
    $target_dir = "uploads/";
    $target_file = $target_dir . basename($_FILES["file"]["name"]);
    $uploadOk = 1;
    $imageFileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION));

    // Check if file already exists
    if (file_exists($target_file)) {
        echo "Sorry, file already exists.";
        $uploadOk = 0;
    }

    // Check file size (10MB)
    if ($_FILES["file"]["size"] > 10000000) {
        echo "Sorry, your file is too large.";
        $uploadOk = 0;
    }

    // Allow certain file formats
    $allowedExtensions = array("jpg", "jpeg", "png", "gif", "pdf", "txt", "zip");
    if (!in_array($imageFileType, $allowedExtensions)) {
        echo "Sorry, only JPG, JPEG, PNG, GIF, PDF, TXT and ZIP files are allowed.";
        $uploadOk = 0;
    }

    if ($uploadOk == 0) {
        echo "Sorry, your file was not uploaded.";
    } else {
        if (move_uploaded_file($_FILES["file"]["tmp_name"], $target_file)) {
            echo "The file " . htmlspecialchars(basename($_FILES["file"]["name"])) . " has been uploaded.";
        } else {
            echo "Sorry, there was an error uploading your file.";
        }
    }
} else {
    echo "Please select a file to upload.";
}
?>

uploads 디렉토리 생성

mkdir -p /usr/share/nginx/html/uploads

uploads 디렉토리 권한 설정

chown www-data.www-data /usr/share/nginx/html/uploads

브라우저

file_upload_test

 

참고URL

- NGINX Documentation : Module ngx_http_core_module

- PHP Manual : php.ini directives

 

728x90