[AWS] Spring boot war 파일 배포 오류

yunSeok·2024년 7월 2일
0

AWS

목록 보기
9/11

AWS EC2 인스턴스를 생성하고 파일질라를 이용해 간단하게 배포해보려고 합니다. 저는 EC2 Instance Connect를 이용해 서버를 다뤄보겠습니다. 별도의 소프트웨어 설치 없이 웹 브라우저만으로 인스턴스에 연결할 수 있기 때문에 사용하게되었습니다!

하지만 배포 과정에서 에러를 많이..만나게 되어 기록하고자 합니다.

war 파일 배포시 에러

이클립스 툴 + 스프링프레임워크에서는 잘 배포가 되었지만,
인텔리제이 + 스프링부트에서는 배포가 되지 않는 문제가 생겼다

1. 404에러...?

404라면 경로에 문제가 있을거라 생각해
컨트롤러나 jsp 파일을 다시 확인해 봤지만 이상없었다..

2. 톰켓의 server.xml

톰켓에서 배포한 프로젝트 war 파일을 읽지 못하는 경우도 있기 때문에

<Context docBase="프로젝트명" path="/" reloadable="true"/>

이런식으로 war 파일 이름과 경로를 지정해주었다. (스프링 프레임워크로 배포할 때는 이렇게 설정해서 작성했다.)

[warning] A context path must either be an empty string or start with a '/' and do not end with a '/'. The path [/] does not meet these criteria and has been changed to []

하지만 path를 empty string 으로 설정하거나 /로 끝나지 않게 설정해야 한다고 경고메시지가 나왔다...
(엥.. 스프링 프레임워크로 할 때는 이렇게 하지 않으면 에러가 나왔는데 오히려 이렇게 작성하니까 에러가 나네...? 라는 생각이었다..)

그래서 이부분은 문제가 아닌거 같아 다시 지웠다.

3. 그 외의 에러들.... (이게 문제가 아니었구나.)

그래서 catalina.out에서 톰켓 로그를 확인했다.

[warning] Failed to clear soft references from ObjectStreamClass Caches for web application [ROOT]

[warning] java.lang.ClassCastException: class java.io.ObjectStreamClassCaches$1 cannot be cast to class java.util.Map (java.io.ObjectStreamClassCaches$1 and java.util.Map are in module java.base of loader 'bootstrap')

Failed to create work directory [/var/lib/tomcat9/work/Catalina/localhost]

The scratchDir you specified: [/var/lib/tomcat9/work/Catalina/localhost] is unusable.

[warning] java.lang.IllegalStateException: java.io.IOException: java.lang.reflect.InvocationTargetException

파일 접근 권한, 클래스, 파일없음 등등 이상하리만큼 너무나 다양한 에러가 발생해 톰켓을 전부 지웠다 설치하기를 반복해봤지만 똑같았다..

4. 톰켓 버전 문제 (너였어..?)

하루가 꼬박 지웠다 설치하고 환경변수 설정하기를 반복하다가 인텔리제이에서는 스프링부트 3.3.1 버전 + 내장 톰켓 10.1.25 버전이 돌아가고 있었다는게 다시 생각이 나서 톰켓 버전의 문제인가 했다.

( 그 전에도 생각은 했지만 tomcat9 버전이 EC2 Instance의
시스템의 패키지 저장소에서 가장 높은 버전이기 때문에 톰켓 버전문제는 아닐거라 쉽게 생각한 나의 잘못이었다..😢 )

메이븐 레파지토리에서 버전을 확인해보니
https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-tomcat/3.3.1

역시나...10.1.25버전을 사용하지 않아서 생긴문제라고 생각이 들었다.

EC2 Instance의 시스템의 패키지 저장소에서 사용할 수 있는 톰켓은 9버전 까지이기 때문에 톰켓 공식 사이트에서 다운 받기로했다.

톰켓 버전 변경 (v9 -> v10.1.25)

높은 버전 설치하기에 앞서 이미 설치되어 있는 9버전을 지워줘야한다.

1. 삭제 작업

  1. 톰켓 관련 전체 삭제
    sudo apt-get remove --purge tomcat9*
    * : tomcat9으로 시작하는 모든 패키지를 의미

  2. 삭제 후 불필요한 패키지 제거 + 정리
    sudo apt-get autoremove

  3. 시스템 업데이트
    sudo apt-get update
    sudo apt-get upgrade

까지 마쳤다면 톰켓을 설치해보록 하겠습니다.

2. Tomcat v10.1.25 설치

아파치 톰켓 사이트 참고
https://tomcat.apache.org/download-10.cgi

순서대로 꼭 해주세요!!

  1. 톰켓 다운로드
    sudo wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.25/bin/apache-tomcat-10.1.25.tar.gz

  2. 압축 해제
    sudo tar xzvf apache-tomcat-10.1.25.tar.gz

  3. 디렉토리 변경
    sudo mv apache-tomcat-10.1.25 /usr/local/tomcat10

  4. 설치 확인
    sudo /usr/local/tomcat10/bin/version.sh

  1. 톰켓 환경 변수 설정 1
    sudo vi /etc/profile

맨 아래에 export CATALINA_HOME=/usr/local/tomcat10 추가
(📌 insert 눌러서 입력모드 만든 후 작성하고 esc눌러서 입력모드 해제한 후 :wq 입력해 저장)

  1. 환경 변수 적용
    source /etc/profile

이어서 echo $CATALINA_HOME 실행하면 적용된 것을 확인 할 수 있습니다.

  1. 환경 변수 설정 2
    sudo vi /etc/systemd/system/tomcat.service

전체 공백으로 되어 있다면 처음 설정하는 것이기 때문에 전체 복사해서 붙여넣어주세요.

[Unit]
Description=Apache Tomcat 10 Web Application Server
After=network.target

[Service]
Type=forking
User=tomcat
Group=tomcat

Environment=JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
Environment=CATALINA_PID=/usr/local/tomcat10/temp/tomcat.pid
Environment=CATALINA_HOME=/usr/local/tomcat10
Environment=CATALINA_BASE=/usr/local/tomcat10

ExecStart=/usr/local/tomcat10/bin/startup.sh
ExecStop=/usr/local/tomcat10/bin/shutdown.sh

[Install]
WantedBy=multi-user.target
  1. 톰켓 환경 설정 파일 (UTF8 인코딩 설정)
    sudo vi /usr/local/tomcat10/conf/server.xml

파일 들어가서 URIEncoding="UTF-8"<Connector 부분에 추가하겠습니다 !!

  1. 실행

다 설정했다면

sudo reboot
위 명령어로 재부팅 해주세요.

sudo systemctl daemon-reload
그 다음 systemd 리로드해주세요.

sudo /usr/local/tomcat10/bin/startup.sh
그 다음 위 명령어로 톰켓을 실행해주세요!

sudo systemctl status tomcat10
sudo systemctl status tomcat.service

위 명령어도 한번씩 입력해서 톰켓 status 확인해주세요.

여기까지 했다면 톰켓 환경설정은 마무리입니다.

주소창에 ip:8080 입력하시면

화면이 나와야합니다!!

고생하셨습니다. 혹시 에러가 발생하시는 분은 밑에 더 봐주세요.

📌 톰켓 재 실행
sudo systemctl restart tomcat
sudo systemctl restart tomcat.service

3. ❗❗ 에러

에러가 안나면 재미없잖아요..그쵸..?

톰켓 실행 시 위처럼 Permission denied 에러가 발생한다면 권한 설정을 해줘야합니다. (순서대로 해주세요!)

  1. Tomcat 디렉토리의 소유권 변경
    sudo chown -R tomcat:tomcat /usr/local/tomcat10

  2. Tomcat 디렉토리와 파일의 권한 설정
    sudo chmod -R 755 /usr/local/tomcat10

  3. startup.sh 파일에 실행 권한 부여
    sudo chmod +x /usr/local/tomcat10/bin/*.sh

  4. 서비스 파일 권한 확인:
    sudo ls -l /etc/systemd/system/tomcat.service

  5. 서비스 파일 권한 설정
    sudo chmod 644 /etc/systemd/system/tomcat.service


❗❗❗❗ 혹시 이런 에러가 발생하시나요!!!!!???

× tomcat.service - Apache Tomcat 10 Web Application Server
     Loaded: loaded (/etc/systemd/system/tomcat.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Wed 2024-07-03 04:17:42 KST; 49s ago
    Process: 2740 ExecStart=/usr/local/tomcat10/bin/startup.sh (code=exited, status=0/SUCCESS)
    Process: 2767 ExecStop=/usr/local/tomcat10/bin/shutdown.sh (code=exited, status=1/FAILURE)
   Main PID: 2747 (code=exited, status=0/SUCCESS)
        CPU: 3.113s
Jul 03 04:17:39 ip-9 systemd[1]: Starting Apache Tomcat 10 Web Application Server...
Jul 03 04:17:39 ip-09 startup.sh[2740]: Tomcat started.
Jul 03 04:17:39 ip-9 systemd[1]: Started Apache Tomcat 10 Web Application Server.
Jul 03 04:17:42 ip-1729 shutdown.sh[2767]: PID file found but either no matching process was found or the current user does not have permission t>
Jul 03 04:17:42 ip-9 systemd[1]: tomcat.service: Control process exited, code=exited, status=1/FAILURE
Jul 03 04:17:42 ip-9 systemd[1]: tomcat.service: Failed with result 'exit-code'.
Jul 03 04:17:42 ip-9 systemd[1]: tomcat.service: Consumed 3.113s CPU time.

주 에러
1. shutdown FAILURE
2. PID file found but either no matching process was found or the current user does not have permission

PID 파일에 문제가 생긴거라서

  1. 톰켓 종료
    sudo pkill -9 -f tomcat

  2. PID 파일 삭제
    sudo rm -f /usr/local/tomcat10/temp/tomcat.pid

  3. temp 디렉토리 권한 확인 및 수정
    sudo chown -R tomcat:tomcat /usr/local/tomcat10/temp
    sudo chmod 755 /usr/local/tomcat10/temp

  4. 리로드
    sudo systemctl daemon-reload

  5. 톰켓 재시작
    sudo systemctl restart tomcat

  6. 상태확인
    sudo systemctl status tomcat
    sudo systemctl status tomcat.service

에러메시지 없이 잘 실행되고 있는지 확인해주세요!


마무리

실제 코드를 작성하고 구현하는 것 보다 충돌하거나 어긋나지 않은 개발환경을 만드는 것이 중요하다는 생각을 한번 더 하게되었다.

새로운 무언갈 다룰때는 시작전에 항상 명심하고 확인하고 시작해야겠다.

버전과 호환, 인식...

0개의 댓글