AWS EC2 Tomcat 설치하고 배포 준비하기
카테고리: aws
태그: aws
1. Tomcat 구축 동기
얼마전 예전에 가르치던 학생에게 질문을 받았다. Springframe로 프로젝트를 만들고 백엔드 서버를 기동하고 배포하는데 공부한데로 실행파일을 만들어 서버에서 기동을 했응데 문제가 장애가 발생하고 기동이 안된다는 것이었다.
로그도 안보고 에러 났다고만 하면 나도 모른다고 로그를 보내라고 했는데 과정이 충격이었다.
원인은 사용 중인 포트를 사용하여 기동한 것이 문제였다.
학습단계에선 자주 발생하는 상황이었고 port 번호를 변경해서 배포하면 된다고 했다.
문제는 여기서 발생했다.
포트가 뭐냐는 거였다.. 외부에서 접속할 때 호스트(ip,도메인)뒤에 :
뒤에 숫자를 붙인다. 80
을 제외하고는 생략이 안되기 때문에 반드시 사용할꺼다. 로그보니 8080
사용 중인데 그걸 변경하면 된다고 했다.
그런거 설정 한적도 없고 어떻게 하는지 모른다고 한다. 설명이 너무 힘들어서 만나서 알려주겠다고 했다.
확인결과 로컬 pc에 Springboot를 Jar로 배포파일을 만들어서 이미 기동중이었는데, 한 개 더 만들어서 Jar파일을 실행하니 port 충돌이 난 것이었다.
포트의 개념과 SpringBoot에서 port를 설정하는 방법을 알려주었다.
그런데 또 질문이 나왔다. 다른사람이 한 프로젝트에는 포트설정 같은 거 안해도 하나의 pc에 여러개의 백엔드 서버가 동작된다는 것이었다.
포트를 지정하는 방법이 설정파일이나 하드코딩으로 직접 지정 할 수도 있지만, 런타임시 지정해 줄 수도 있다고 알려주었고 어렵다면 그냥 WAS를 이용해서 WAR 배포를 하면 Was에서 웹어플리케이션 마다 포트나 경로 관리 할수 있다고 설명해주었다.
서버에 WAS 못해본 학생들을 위해 Tomcat를 이용한 배포를 준비를 처음부터 정리해볼려고 한다.
JAR와 WAR의 비교
JAR( Java Archive)는 기본적으로 컴파일된 java파일인 class파일을 압축해 준 것인데 실행가능한 형태로 jar를 만들 때 Runnable jar라고 부른다. 이번에는 jar는 SpringBoot 실행을 위해 만들어진 jar라고 가정한다.
- JAR (Java Archive)
- java가 시스템에서 동작할 수 있도록 class를 압축한 파일(라이브러리, 실행파일로 존재)
- Class (java, properies 파일)를 가짐
- OS 맞는 JRE(java Runtime Environment)만 있어도 실행 가능함
- 구조
일반적인 Runnable JAR의 경우 Main-Class는 Main메서드가 존재하는 클래스로 설정되지만, 스프링 부트의 Main-Class에서는 JarLauncher라는 클래스로 설정되어있다.
- JarLauncher를 통한 Jar의 실행방식은 아래 순서로 이루어진다.
- org.springframework.boot.loader.jar.JarFile: 내장 jar 인식
- org.springframework.boot.loader.Launcher 실행
- Start-Class에 선언된 클래스의 Main메서드 실행 (com.example.demo.DemoApplication)
실행은 jar파일 처럼 실행 하면된다.
# 단순 실행 추가 설정이 없다면 기본 8080로 기동됨
java -jar SpringApp.jar
# runtime port 지정
java -jar -Dserver.port=8090 SpringApp.jar
- WAR (Web Application Archive)
- Servlet / Jsp 동작 할 수 있는 웹 애플리케이션(Web Application) 압축파일
- 웹 파일(JSP, Servlet, JAR, Class, XML, HTML, Javascript)을 포함
- 사전 정의된 구조 (WEB-INF, META-INF)를 사용
- 별도의 웹서버(WEB) or 웹앱서버(WAS) 필요
- JAR + 웹 파일 + 설정파일로 구성되어 있다.
- 구조
구조는 JAR와 유사하지만 BOOT-INF
가 WEB-INF
로 변경되어있고 이곳에 단순 class, jar파일이 아니라 웹리소스 파일, 설정파일 등이 등록되어 웹서버가 기동하면서 설정을 읽어들여서 동작한다. jar를 실행 할 때 포트, 메모리 등 설정을 해야하지만 WAR를 웹서버가 기동시키기 때문에 설정파일을 등록해야 한다.
정리
JAR, WAR는 패키징 하는 방법이 다를 뿐 백엔드로만 사용한다면 차이는 없다. 이미 사용중인 WAS에 배포해야하거나 프론트를 포함하여 배포해야한다면 WAR로 작성하면 된다. 화면 구성없이 백엔드로만 동작한다면 JAR로 배포하는게 더 편할 수도 있다. WAS가 준비 안된 학생들이 학습하고 배포 할때 주로 이것을 사용하고 있었다.
2. AWS EC2 Tomcat 설치
java jdk 설치
Spring이든 Tomcat이든 java는 필수다. Java를 설치하도록 하자. 회사라면 라이센스 문제때문에 java8이나 java11 버전을 사용 중이었는데 자료를 찾는 과정에서 oracle에서 공식으로 jdk17을 무료 라이선스인, NFTC라는 라이선스가 적용이 된 것을 확인했다.
참고 사이트 : https://www.oracle.com/java/technologies/javase/jdk-faqs.html
이러면 굳이 openjdk를 설치 할 필요도 없고 아마 자연스럽게 앞으로의 상용서버들도 jdk 17 이상으로 이전 할 가능성이 높아졌다.
오라클 공식 jdk17 : https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html
# wget으로 java jdk 17을 다운 받는다.
sudo wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.rpm
# rpm 패키지 설치
sudo rpm -ivh jdk-17_linux-x64_bin.rpm
# java 버전 확인
java -version
tomcat 다운로드
tomcat 다운 : https://tomcat.apache.org/download-80.cgi
# wget으로 tomcat 8.5를 다움 받는다.
sudo wget https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.87/bin/apache-tomcat-8.5.87.tar.gz
tomcat의 경우 패키지 파일이 아니라 압축 파일 형태로 제공되며 압축을 풀고 실행을 하면된다.
압축 해제 할 경로는 나중에 다른 유저가 추가되더라도 사용가능하도록 위치를 지정해서 풀어둔다.
# 압축 해제
sudo tar xvfz apache-tomcat-8.5.87.tar.gz
# 폴더를 이동시키면서 폴더명변경
sudo mv apache-tomcat-8.5.87/ /usr/local/tomcat8.5
tomcat 환경설정
tomcat 설치경로에 관한 환경 설정을 진행한다.
# 환경 설정
sudo vi /etc/profile
# 마지막 줄에 아래 내용 추가
export CATALINA_HOME=/usr/local/tomcat8.5
# 환경 재적용
source /etc/profile
# 환경변수 확인
echo $CATALINA_HOME
이제 tomcat 환경설정을 진행하자
# 설정전 반드시 확인한다.
netstat -tulpn
# 만약 사용중인 포트가 있다면 피해야 한다.
# 환경 설정 파일을 수정한다.
sudo vi /usr/local/tomcat8.5/conf/server.xml
# 아래 내용을 찾은 후 UTF8 인코딩 설정을 추가한다.
<Connector port="8080" protocol="HTTP/1.1"
URIEncoding="UTF-8"
connectionTimeout="20000"
redirectPort="8443" />
8080
포트가 기본이다. 사용할 포트가 8080이라면 그대로 두고 다른 포트를 사용한다면 변경한다.
tomcat 시작 및 주요 명령어
# 시작
/usr/local/tomcat8.5/bin/startup.sh
# 중지
/usr/local/tomcat8.5/bin/shutdown.sh
# 동작확인
ps -ef | grep tomcat
# 로그위치
/usr/local/tomcat8.5/bin/logs/catalina.out
서버주소:포트
로 접속하면 톰켓 초기 화면이 출력되면 성공이다.
개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
댓글 또는 메일로 알려주시면 감사하겠습니다.
댓글 남기기