상세 컨텐츠

본문 제목

[Ubuntu20.04] tomcat9 설정, 파일 업로드 실패

개발일반

by monad 2021. 8. 6. 16:09

본문

Quick Guide)

1. 톰캣 서비스 파일 수정: sudo nano /etc/systemd/system/multi-user.target.wants/tomcat9.service

2. 쓰기 폴더 추가: ReadWritePaths=/var/opt/upload/

3. 폴더 권한 수정: sudo chown -R tomcat:tomcat /var/opt/upload/

4. units를 재 로드: sudo systemctl daemon-reload

5. 톰캣 서비스 재 기동: sudo systemctl restart tomcat9

 

Ubuntu 18.04 이상에서 tomcat을 apt install tomcat9으로 설치한 경우, 서비스로 등록되고 시스템에서 관리하도록 설정이됩니다.

 

1. 파일 업로드 대상 폴더 정의

starseed@myserver:/etc/systemd/system/multi-user.target.wants$ sudo nano tomcat9.service

하기와 같이 톰캣에서 업로드할 폴더를 설정합니다.

ReadWritePaths=/var/opt/upload/

#
# Systemd unit file for Apache Tomcat
#

[Unit]
Description=Apache Tomcat 9 Web Application Server
Documentation=https://tomcat.apache.org/tomcat-9.0-doc/index.html
After=network.target
RequiresMountsFor=/var/log/tomcat9 /var/lib/tomcat9

[Service]

# Configuration
Environment="CATALINA_HOME=/usr/share/tomcat9"
Environment="CATALINA_BASE=/var/lib/tomcat9"
Environment="CATALINA_TMPDIR=/tmp"
Environment="JAVA_OPTS=-Djava.awt.headless=true"

# Lifecycle
Type=simple
ExecStartPre=+/usr/libexec/tomcat9/tomcat-update-policy.sh
ExecStart=/bin/sh /usr/libexec/tomcat9/tomcat-start.sh
SuccessExitStatus=143
Restart=on-abort

# Logging
SyslogIdentifier=tomcat9

# Security
User=tomcat
Group=tomcat
PrivateTmp=yes
AmbientCapabilities=CAP_NET_BIND_SERVICE
NoNewPrivileges=true
CacheDirectory=tomcat9
CacheDirectoryMode=750
ProtectSystem=strict
ReadWritePaths=/etc/tomcat9/Catalina/
ReadWritePaths=/var/lib/tomcat9/webapps/
ReadWritePaths=/var/log/tomcat9/
ReadWritePaths=/var/opt/upload/ # <== 여기를 추가함

[Install]
WantedBy=multi-user.target

2. 파일 업로드 폴더 설정

starseed@myserver:/var/opt$ sudo chown -R tomcat:tomcat upload

3. Java 소스 - 파일 업로드 - 예

@PostMapping("/post")
public String write(@RequestParam("file") MultipartFile files, BoardDto boardDto){
  try{
    if( !files.isEmpty() ) {
      String origFilename = files.getOriginalFilename();
      String filename = new MD5Generator(origFilename).toString();
      
      String savePath = "/var/opt/upload/";
      if (!new File(savePath).exists()) {
        try {
          new File(savePath).mkdir();
        } catch (Exception ex) {
          ex.printStackTrace();
        }
      }
      String filePath = savePath + filename;
      files.transferTo(new File(filePath));
      
      FileDto fileDto = new FileDto();
      fileDto.setOrigFilename(origFilename);
      fileDto.setFilename(filename);
      fileDto.setFilePath(filePath);
      Long fileId = fileService.saveFile(fileDto);
      boardDto.setFileId(fileId);
    }
    boardService.savePost(boardDto);
  } catch (Exception ex) {
    ex.printStackTrace();
  }
  return "redirect:/";
}

4. Java 소스 - 파일 다운로드 - 예

@GetMapping("/download/{fileId}")
public ResponseEntity<Resource> fileDownload(@PathVariable("fileId") Long fileId) throws IOException {
  FileDto fileDto = fileService.getFile(fileId);
  Path path = Paths.get(fileDto.getFilePath());
  Resource resource = new InputStreamResource(Files.newInputStream(path));
  return ResponseEntity.ok()
    .contentType(MediaType.parseMediaType("application/octet-stream"))
    .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileDto.getOrigFilename() + "\"")
    .body(resource);
}

5. log의 확인

stdout과 stderr 정보를 확인하는 방법

https://www.loggly.com/ultimate-guide/using-journalctl/
journalctl -u tomcat9.service -n 1100 --since "1 hour ago"

 

Using journalctl - The Ultimate Guide To Logging

Journalctl is a utility for querying and displaying logs from journald, systemd’s logging service. Since journald stores log data in a binary format instead of a plaintext format, journalctl is the standard way of reading log messages processed by journa

www.loggly.com

기본 로그 파일 생성 장소

/va/log/tomcat9/

 

관련글 더보기

댓글 영역