[Spring] AWS 배포

2020. 8. 23. 15:48Spring/Spring

1. AWS 터미널 접속

chmod 400 ~/Desktop/keys/keyfile.pem
ssh -i ~/Desktop/keys/keyfile.pem ec2-user@[서버 아이피 혹은 주소]

// 서버가 ubuntu일 경우
ssh -i ~/Desktop/keys/keyfile.pem ubuntu@[서버 아이피 혹은 주소]

 

 

 

2. AWS 설치 (Ubuntu)

1) apt 업데이트

sudo apt-get update

2) Java

Open JRE & JDK 설치를 한다. 

sudo apt-get install openjdk-8-jre
sudo apt-get install openjdk-8-jdk
javac -version
java -version

자바 설치 경로도 확인하여 환경 변수로 추가한다.

// 자바 위치
which javac

// 풀 경로
readlink -f [자바 위치]

// $JAVA_HOME
sudo vim /etc/profile
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$JAVA_HOME/bin/:$PATH
export CLASS_PATH=$JAVA_HOME/lib:$CLASS_PATH
// 재업로드
source /etc/profile

// 서버 재시작
sudo reboot now

// 자바 환경 변수 확인
echo $JAVA_HOME

3) Tomcat

설치가 끝나면 AWS에서 할당받은 IP:8080으로 접속하여 확인한다. (단, AWS의 인바운드 포트 8080도 설정이 되어있어야 한다.)

sudo apt-get install tomcat9

// 버전 확인
sudo /usr/share/tomcat9/bin/version.sh

// 포트 설정
sudo ufw allow 8080/tcp

// 서비스 시작
sudo service tomcat9 start

기본적으로 톰캣의 기본포트는 8080이다 그렇기 때문에 프로젝트를 서버에 배포를 완료할 경우 도메인 뒤에 포트를 같이 붙여줘야 접근이 가능하다. 이러한 번거로움과 접근성을 고려하여 HTTP 기본 포트인 80포트를 8080로 리다이렉팅하는 작업을 수행한다. 톰캣의 포트를 80으로 주어 해결하는 방안이 있지만 Well-Known-Port는 root 계정이 아니면 사용할 수 없도록 되어있다.

// 규칙 생성
sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

// 규칙 확인
sudo iptables -t nat -L

// 규칙 제거
sudo iptables -D PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

// 규칙 유지 설정 (1) - Ubuntu 16.04 하위 버전
sudo service iptables save

// 규칙 유지 설정 (2) - Ubuntu 16.04 상위 버전
sudo apt-get install iptables-persistent
sudo netfilter-persistent save
sudo netfilter-persistent reload

※ 서버 타임존도 설정해야한다.

4) MySQL 서버

MySQL을 설치한다.

sudo apt-get install mysql-server

// MySQL 시작
sudo service mysql start

이 후 사용자를 추가하고 UTF8 데이터베이스를 생성한다. Ubuntu 18.04에서 MySQL 접속 방법이 기존의 패스워드 방식이 아닌 auth_socket 플러그인을 이용하여 인증 로그인을 하기 때문에 패스워드 방식으로 바꿔야 한다.

sudo mysql

UPDATE mysql.user SET plugin='mysql_native_password' WHERE user='root';
UPDATE mysql.user SET authentication_string=PASSWORD('[새로운 비밀번호]') WHERE user='root';
FLUSH PRIVILEGES;

각 서비스별 사용하는 계정을 생성하여 데이터베이스를 해당 서비스에서만 사용하도록 설정한다.

USE mysql;
CREATE USER '[유저명]'@'localhost' identified by '[유저 비밀번호]';
GRANT ALL PRIVILEGES ON *.* TO '[유저명]'@'localhost'
CREATE DATABASE [DB명] DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

MySQL 언어셋의 경우 MySQL에 로그인되어있는 상태에서 'status;' 명령어를 통해 확인할 수 있다. utf8로 설정이 되어있지 않을 경우, 별도로 설정 파일을 통해 한글 설정을 할 수 있다.

sudo vim /etc/mysql/my.cnf
[client]
default-character-set = utf8

[mysqld]
init_connect = SET collation_connection = utf8_general_ci
init_connect = SET NAMES utf8
character-set-server = utf8
collation-server = utf8_general_ci

[mysqldump]
default-character-set = utf8

[mysql]
default-character-set = utf8

외부에서 원격 접속이 가능하도록 mysql 서버의 설정을 추가로 변경해준다.

sudo vim /etc/mysql/mysqld.conf.d/mysqld.cnf
# bind-address = 127.0.0.1

5) MySQL 클라이언트

톰캣이 설치되어있는 서버에서 원격으로 다른 서버의 데이터베이스를 사용할 수 있도록 클라이언트를 설치한다. 연결은 -h 옵션을 이용하여 데이터베이스 서버에 접속한다.

sudo apt-get install mysql-client
sudo mysql -h[데이터베이스 서버 주소] -u[유저명] -p[비밀번호]

 

 

 

3. Spring 배포

1) IntelliJ WAR 파일 추출

리눅스에 Tomcat이 설치되어있을 경우, WAR 파일을 배포해야한다. Project Structure (Command + ;)의 Artifacts 카테고리에서 원하는 파일 형식의 추출을 선택한다.

JAR/WAR 파일 추출

이 후 선택한 형식의 파일 빌드는 Build - Build Artifacts - [선택한 파일 형식] - Build로 진행하며, 생성된 파일은 out - artifacts 파일 하위에 생성이 된다. 생성된 형식의 파일을 Tomcat /var/lib/tomcat9/webapps/ 폴더 하위에 위치하고 실행하면 webapps/myapp 이름으로 폴더가 생성이된다. 접속 방식은 'localhost:8080/myapp/index.jsp' 형태의 주소로 접속하면 된다. 만약 자신의 프로젝트명을 URL에서 생략하고 싶을 경우, 실행했을 때 myapp 하위의 파일들을 webapps/ROOT로 위치하면 'localhost:8080/index.jsp' 형태의 URL로 사용이 가능하다.

 

서버에서 WAR 파일을 실행하는 방법은 간단히 Tomcat을 실행하면 자동으로 인식하여 실행된다.

빌드

 ubuntu 계정이기에 webapps에 파일을 넣을 수 있는 권한이 없기 때문에 권한 오류가 발생한다. 따라서 톰캣 서버에 webapps 폴더 포함 하위 폴더들의 ubuntu 계정에 권한을 설정해준다.

sudo chown -R ubuntu /var/lib/tomcat9/webapps

계정 권한 설정

※ out/artifacts/myapp_war_exploded 폴더의 경우 war 파일이 풀어진 형태이기에 해당 폴더를 그대로 옮겨 배포가 가능하다.

 

 

 

4. .ignore

1) .gitignore 생성 방법

File - new - .ignore (git) - maven 선택으로 생성이 가능하다.

2) .gitignore 시 참고할 내용

폴더 설명
.idea IntelliJ 프로젝트 세팅 정보가 담겨있는 폴더이다. 주로 ignore 한다.
*.imi IntelliJ가 생성한 파일로, 프로젝트의 모듈정보가 담겨있다. 삭제 후 다시 똑같은 파일을 생성한다는 보장은 할 수 없지만 다시 생성이 가능하다. 주로 ignore 한다.
- Gradle : Sync Project with Gradle Files 버튼
- Maven : Project Structure - Modules - Add
out IDE의 프로그램을 실행시켰을 때 모든 컴파일된 내용이 담기는 폴더이다. (Artifacts란 개발 프로세스에 의해 생성된 실행파일이나 중간 산출물을 뜻한다.) 주로 ignore 한다.
Target 프로젝트 결과물인 JAR 또는 WAR를 실서버에 반영할 때  Target 폴더 하위의 JAR 혹은 WAR를 배포한다. 즉, Maven으로 빌드 시 생기는 JAR파일을 저장하는 것이 주 용도이며, 주로 ignore한다.

[참고] https://roselumi.tistory.com/entry/IntelliJIntelliJ%EC%97%90%EC%84%9C-WAR%ED%8C%8C%EC%9D%BC-%EC%B6%94%EC%B6%9CEXPORT-%ED%95%98%EA%B8%B0

[참고] jwj1699.tistory.com/16

[참고] github.com/ozofweird/ServerTest

728x90