반응형
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
브라우저
참고URL
- NGINX Documentation : Module ngx_http_core_module
- PHP Manual : php.ini directives
728x90
반응형
'리눅스' 카테고리의 다른 글
우분투에서 Certbot을 사용하여 Let's Encrypt SSL 인증서를 생성하는 방법 (0) | 2024.03.28 |
---|---|
Portainer를 설치하고 컨테이너를 관리하는 방법 (0) | 2024.03.27 |
우분투에서 Docker 컨테이너 내에서 systemd를 실행하는 방법 (0) | 2024.03.22 |
우분투에서 cron 작업에 대한 로그를 별도의 파일로 분리하는 방법 (0) | 2024.03.20 |
우분투에 Gradle을 설치하는 방법 (0) | 2024.03.14 |