서버에 배포해보자.
서버는 AWS에 우분트 EC2 1대 만들어 테스트한다.
테스트 어플리케이션(프로젝트)는 Github에 있다.
aws 콘솔 로그인 https://console.aws.amazon.com/console/home
GitHub에 있는 프로젝트를 서버에 배포하기 위해 배포용 우분트 서버 1대를 만든다.
seo-web01-dev
스토리지는 30G로 한다.
공인IP 1개 매칭한다. 탄력적IP = 고정 공인IP 1개를 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
성공
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
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 &
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
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
감사합니다.