AWS EC2 인스턴스를 생성하고 파일질라를 이용해 간단하게 배포해보려고 합니다. 저는 EC2 Instance Connect를 이용해 서버를 다뤄보겠습니다. 별도의 소프트웨어 설치 없이 웹 브라우저만으로 인스턴스에 연결할 수 있기 때문에 사용하게되었습니다!
하지만 배포 과정에서 에러를 많이..만나게 되어 기록하고자 합니다.
이클립스 툴 + 스프링프레임워크에서는 잘 배포가 되었지만,
인텔리제이 + 스프링부트에서는 배포가 되지 않는 문제가 생겼다
404라면 경로에 문제가 있을거라 생각해
컨트롤러나 jsp 파일을 다시 확인해 봤지만 이상없었다..
톰켓에서 배포한 프로젝트 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 으로 설정하거나 /로 끝나지 않게 설정해야 한다고 경고메시지가 나왔다...
(엥.. 스프링 프레임워크로 할 때는 이렇게 하지 않으면 에러가 나왔는데 오히려 이렇게 작성하니까 에러가 나네...? 라는 생각이었다..)
그래서 이부분은 문제가 아닌거 같아 다시 지웠다.
그래서 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
파일 접근 권한, 클래스, 파일없음 등등 이상하리만큼 너무나 다양한 에러가 발생해 톰켓을 전부 지웠다 설치하기를 반복해봤지만 똑같았다..
하루가 꼬박 지웠다 설치하고 환경변수 설정하기를 반복하다가 인텔리제이에서는 스프링부트 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버전 까지이기 때문에 톰켓 공식 사이트에서 다운 받기로했다.
높은 버전 설치하기에 앞서 이미 설치되어 있는 9버전을 지워줘야한다.
톰켓 관련 전체 삭제
sudo apt-get remove --purge tomcat9*
* : tomcat9으로 시작하는 모든 패키지를 의미
삭제 후 불필요한 패키지 제거 + 정리
sudo apt-get autoremove
시스템 업데이트
sudo apt-get update
sudo apt-get upgrade
까지 마쳤다면 톰켓을 설치해보록 하겠습니다.
아파치 톰켓 사이트 참고
https://tomcat.apache.org/download-10.cgi
순서대로 꼭 해주세요!!
톰켓 다운로드
sudo wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.25/bin/apache-tomcat-10.1.25.tar.gz
압축 해제
sudo tar xzvf apache-tomcat-10.1.25.tar.gz
디렉토리 변경
sudo mv apache-tomcat-10.1.25 /usr/local/tomcat10
설치 확인
sudo /usr/local/tomcat10/bin/version.sh
맨 아래에 export CATALINA_HOME=/usr/local/tomcat10
추가
(📌 insert 눌러서 입력모드 만든 후 작성하고 esc눌러서 입력모드 해제한 후 :wq 입력해 저장)
이어서 echo $CATALINA_HOME 실행하면 적용된 것을 확인 할 수 있습니다.
전체 공백으로 되어 있다면 처음 설정하는 것이기 때문에 전체 복사해서 붙여넣어주세요.
[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
파일 들어가서 URIEncoding="UTF-8"
을 <Connector 부분에 추가하겠습니다 !!
다 설정했다면
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
에러가 안나면 재미없잖아요..그쵸..?
톰켓 실행 시 위처럼 Permission denied 에러가 발생한다면 권한 설정을 해줘야합니다. (순서대로 해주세요!)
Tomcat 디렉토리의 소유권 변경
sudo chown -R tomcat:tomcat /usr/local/tomcat10
Tomcat 디렉토리와 파일의 권한 설정
sudo chmod -R 755 /usr/local/tomcat10
startup.sh 파일에 실행 권한 부여
sudo chmod +x /usr/local/tomcat10/bin/*.sh
서비스 파일 권한 확인:
sudo ls -l /etc/systemd/system/tomcat.service
서비스 파일 권한 설정
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 파일에 문제가 생긴거라서
톰켓 종료
sudo pkill -9 -f tomcat
PID 파일 삭제
sudo rm -f /usr/local/tomcat10/temp/tomcat.pid
temp 디렉토리 권한 확인 및 수정
sudo chown -R tomcat:tomcat /usr/local/tomcat10/temp
sudo chmod 755 /usr/local/tomcat10/temp
리로드
sudo systemctl daemon-reload
톰켓 재시작
sudo systemctl restart tomcat
상태확인
sudo systemctl status tomcat
sudo systemctl status tomcat.service
에러메시지 없이 잘 실행되고 있는지 확인해주세요!
실제 코드를 작성하고 구현하는 것 보다 충돌하거나 어긋나지 않은 개발환경을 만드는 것이 중요하다는 생각을 한번 더 하게되었다.
새로운 무언갈 다룰때는 시작전에 항상 명심하고 확인하고 시작해야겠다.
버전과 호환, 인식...