brunch

You can make anything
by writing

C.S.Lewis

by Master Seo Nov 30. 2023

42탄-2. Github에서 받아 우분트EC2에서 배포

서버에 배포해보자.

서버는 AWS에 우분트 EC2 1대 만들어 테스트한다.

테스트 어플리케이션(프로젝트)는 Github에 있다.



<1> AWS에 우분트 EC2 1대 만들기

<2> 우분트 EC2에 프로젝트를 배포하자.

<3> 프로젝트를 백그라운드로 실행하기

<4> 서버 시간 변경하기와 종료 스크립트 작성하기

<5> 자동 재시작을 위해 cron 사용하기.



<1> AWS에 우분트 EC2 1대 만들기


aws 콘솔 로그인 https://console.aws.amazon.com/console/home

GitHub에 있는 프로젝트를 서버에 배포하기 위해 배포용 우분트 서버 1대를 만든다.

seo-web01-dev

스토리지는 30G로 한다.

공인IP 1개 매칭한다. 탄력적IP = 고정 공인IP 1개를 EC2에 매칭한다.




<2> 우분트 EC2에 프로젝트를 배포하자.


1

Ec2 로그인

ubuntu



2

git 설치 확인

git --version



3

github에서 프로젝트를 다운로드한다.

git clone https://github.com/codingspecialist/aws-v1

cd aws-v1



4

gradle을 통해 빌드해 jar 실행 파일을 만들자.

gradlew가 프로젝트를 빌드해주는 실행파일이다.

실행 권한을 주자.

chmod u+x gradlew



5

JDK 설치.

실행파일로 빌드하기위해 JDK가 필요하다.

일반 사용자가 실행하기 위해서는 JRE만 필요함.


sudo apt update

sudo apt-cache search jdk

sudo apt-cache search jdk | grep openjdk-11

sudo apt install openjdk-11-jdk -y


java --version

jdk 설치확인 됨.



6

실행파일로 변경하자.


./gradlew build 

// 현재 폴더에서 소스 찾아 빌드한다.


cd build

cd libs

ls

실행파일인  xxxxx.jar 파일이 생김.



7

실행해보자.

java -jar   *.jar



8

ec2 보안그룹에서 8080 허용



9

웹 브라우저로 접속해보자.

ec2의 공인ip:8080/aws/v1 



성공





<3> 프로젝트를 백그라운드로 실행하기


1

터미털1에서 모니터링

aws-v1/build/libs$ tail -f nohup.out



2

세션을 닫으면 사이트 접속도 안된다.

실행한 세션이 끊어지더라도 서버가 돌아가도록 nohub을 사용해 실행하라.

no hang up 의 약자


nohup --version

nohup (GNU coreutils) 8.32

Copyright (C) 2020 Free Software Foundation


nohup java -jar *.jar  &


// nohup으로 터미널을 나가도 종료가 안되도록 하자.

// 백그라운드로 실행해야 한다!!!  &  옵션 줘야 한다.




2

확인?


사이트 접속 하기

http://52.79.205.190:8080/aws/v1



sodu apt intall net-tools

netstat -nlpt


Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name

tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      -

tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -

tcp6       0      0 :::8080                 :::*                    LISTEN      7217/java

tcp6       0      0 :::22                   :::*                    LISTEN      -



ip:8080/aws/v1?number=1




4

실시간 로그 모니터링

cd /home/ubuntu/aws-v1/build/libs

tail -f nohup.out



ubuntu@ip-172-31-43-118:~/aws-v1/build/libs$ ps -ef |grep java

ubuntu      7217       1  1 12:50 ?        00:00:07 java -jar v1-0.0.1-SNAPSHOT.jar

ubuntu      7493    7455  0 13:00 pts/3    00:00:00 grep --color=auto java



ubuntu@ip-172-31-43-118:~/aws-v1/build/libs$ kill -9 7217


ubuntu@ip-172-31-43-118:~/aws-v1/build/libs$ ps -ef |grep java

ubuntu      7496    7455  0 13:00 pts/3    00:00:00 grep --color=auto java


ubuntu@ip-172-31-43-118:~/aws-v1/build/libs$ netstat -nlpt

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name

tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      -

tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -

tcp6       0      0 :::22                   :::*                    LISTEN      -





5

정상로그와 에러로그 분리하기.

cd build/libs

nohup java -jar v1-0.0.1-SNAPSHOT.jar 1>log.out 2>err.out &


새창

 tail -f log.out


새창

 tail -f err.out.out &





<4> 서버 시간 변경하기와 종료 스크립트 작성하기


1

date


timedatectl 로 현재 타임존 확인하기

UTC(미국)으로 되어 있다.

timedatectl  list-timezones


로그를 서울 시간으로 맞추자~



2

sudo timedatectl  set-timezone  Asia/Seoul

timedatectl 로 현재 타임존 확인하기



3

시간을 변경했으니 제대로 나오도록 프로세스를 재시작해야 한다.

프로세스를 확인하고 종료하자.

ps -ef 와 kill로 가능.

$ ps -ef |grep *.jar



하지만, pgrep으로 pid 확인하려 스크립트로 작성하자.

pgrep -f *.jar


vi spring-stop.sh

echo "spring boot stop !!!"

SPRING_PID=$(pgrep -f .jar)

echo $SPRING_PID

kill -9 $SPRING_PID



chmod 700 spring-stop.sh

or

chmod u+x spring-stop.sh



netstat -nlpt

8080 포트 확인.


웹사이트 접속 확인.


./spring-stop.sh

웹사이트 접속 확인.



4

어플리케이션 재시작


cd build/libs

nohup java -jar v1-0.0.1-SNAPSHOT.jar 1>log.out 2>err.out &



로그 확인.

tail -f log.out 




<5> 자동 재시작을 위해 cron 사용하기.


cron은 주기적으로 어플리케이션을 실행하기 위해 사용한다.

etc/crontab파일을 읽어서 작업한다.


crontab -e

vi로 작업한다.



1

cron 동작 이해하기.

crontab -e

* * * * * ls -l 1>>cron.log


* * * * * 는 1분마다 동작이다.

>> 는 추가.

ls -l 내용이 1분마다 cron.log 파일에 추가 된다.


2분 지나면 

ls -l 내용이 2개 생긴다.



2

vi my.sh

crontab -l 1>crontab_new

chmod 700 my.sh


./my.sh

crontab_new 파일이 생긴다.


내용은 crontab의 내용이다.

echo "* * * * * ls -l"  1>>crontab_new


// 기존 crontab 내용을 crontab_new로 옮기고,  * * * * *  ls -l 문자열을 crontab_new에 추가한다.

crontab_new에 로그 가 추가 되며, crontab_new을 crontab에 등록할수 있게 딘다.

crontab  crontab_new  실행.

crontab_new 삭제.

./my.sh 실행.



cat crontab_new

* * * * * ls -l  이 들어가 있다.



vi my.sh

echo "* * * * * /home/ununtu/job.sh"  1>>crontab_new


// job.sh가 매분 수행 되는 것이다.



vi job.sh

ls -l > /home/ubuntu/cron.log

현재 폴더의 모든 리스트를 cron.log 파일로 옮기라는것이다.


chmod 700 job.sh

./my.sh

1분 기다리면 모든 리스트가 cron.log 파일로 추가 된다.




스크립트 실행시에 크론텝에 자동 등록 


mkdir restart


netstat -nlpt

8080이 떠있다.


cd restart


vi stop.sh

echo "spring boot stop !!!"

SPRING_PID=$(pgrep -f .jar)

echo $SPRING_PID

kill -9 $SPRING_PID

chmod 700 stop.sh

./stop.sh


netstat -nlpt

8080 stop 되어있다.


restart.sh

SPRING_PID=$(pgrep -f xxxxxxxx.jar)

SPRING_PATH="/home/ubuntu/aws-v1/build/libs/xxxxxxxxxxx.jar"

echo $SPRING_PID

echo SPRING_PATH

if [ -z "$SPRING_PID" ]; then

echo " spring stop ." else

echo " spring start ......."

fi



chmod 700 restart.sh

./restart



update


restart.sh

SPRING_PID=$(pgrep -f xxxxxxxx.jar)

SPRING_PATH="/home/ubuntu/aws-v1/build/libs/xxxxxxxxxxx.jar"

echo $SPRING_PID

echo SPRING_PATH

if [ -z "$SPRING_PID" ]; then

echo " spring stop ." else

echo " spring start ......."

fi

./restart


cat restart.log

netstat -nlpt  

8080 포트가 돌고 있다. 확인.






3


배포

vi deploy.sh


echo "crontab 등록 - spring restart..."

crontab -l > crontab_new

echo "* * * * * /home/ubuntu/cron-restart/spring-restart.sh" 1>>crontab_new

crontab crontab_new

rm crontab_new



crontab -e

내용 삭제


./deploy.sh



crontab -e 

확인


데몬 stop

./stop.sh



모니터링

1분후 데몬  on 학인




다음

https://brunch.co.kr/@topasvga/3555



개발과 배포 전체  다시 보기

https://brunch.co.kr/@topasvga/3558





감사합니다.


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari