⚠️ Issue
매우 작은 파일만 업로드되고 그렇지 않은 파일들은 업로드 실패
실시간 로그에도 뜨지 않는 상황
✅ Solution
1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- log4j2.xml -->
<File name="file_appender" fileName="/tmp/test-log.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/>
</File>
<Logger name="org.springframework.web.multipart" level="DEBUG" additivity="false">
<AppenderRef ref="console_appender"/>
<AppenderRef ref="file_appender"/>
</Logger>
<Logger name="org.springframework.web" level="DEBUG" additivity="false">
<AppenderRef ref="console_appender"/>
<AppenderRef ref="file_appender"/>
</Logger>
파일관련 로그를 추가하여 원인 파악
1
2
3
4
5
6
7
8
9
10
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="1048576000" />
<property name="uploadTempDir" ref="uploadDirResource" />
</bean>
<bean id="uploadDirResource" class="org.springframework.core.io.FileSystemResource">
<constructor-arg>
<value>/a/b</value>
</constructor-arg>
</bean>
로그 확인 결과, 임시 업로드 폴더 /a/b에 권한이 없어 업로드가 되고 있지 않은 상황
/a/b 에 쓰기 권한이 부여되어있어야 했다.
모든 권한이 열려있는 폴더로 변경하여 문제 해결 완료
⚠️ Issue
설정된 파일 업로드 폴더가 톰캣 폴더 내부로 되어 있어, 우분투 서버에 재배포시 이전에 업로드되었던 파일이 휘발되었다.
ada53aa559d9d2e057f8aadabacc4177897603b1
1 2 // 설정된 파일 업로드 경로 request.getSession().getServletContext().getRealPath("/");
📖 Info
Tomcat이 우분투와 같은 리눅스 시스템에서 systemd에 의해 관리될 경우, Tomcat 프로세스가 샌드박스화되어 특정 디렉토리만 쓰기 권한을 가지는 설정이 기본적으로 적용된다. 아래는 기본적으로 톰캣에 쓰기 권한이 부여된 폴더이다.
1
2
3
4
/etc/tomcat9/Catalina
/var/log/tomcat9
/var/lib/tomcat9/webapps
/var/cache/tomcat9
✅ Solution 1(톰캣이 서비스로 등록되었을 경우)
톰캣에 쓰기 권한이 부여되지 않은 폴더 외에, 업로드 경로로 사용할 폴더를 설정 파일에 지정해야 한다.
톰캣 서비스 파일 위치 확인
cat /lib/systemd/system/tomcat9.service
시스템 서비스 파일을 복사하여 사용자 정의로 수정
sudo cp /lib/systemd/system/tomcat9.service /etc/systemd/system/tomcat9.service
복사된 서비스 파일 수정
sudo vim /etc/systemd/system/tomcat9.service
[Service] 섹션에 아래 속성 추가
ReadWritePaths=/upload
systemd 데몬 재로드, tomcat service 재시작
sudo systemctl daemon-reload sudo systemctl restart tomcat9
1
2
3
4
5
6
7
8
9
<br>
✅ Solution 2(톰캣이 서비스로 등록되지 않았을 경우)
```bash
# 톰캣 서비스가 등록되어있지 않다면, 현재 띄워져있는 톰캣 프로세스를 확인 후 업로드될 폴더를 맞춰준다.
ps -aux | grep tomcat
chown -R [사용자명]:[사용자명] /upload
chmod -R 755 /upload