본문 바로가기

Study/GW

[AWS, Spring Boot3] EC2 배포, 서버 스크립트, Nginx 설치

1. EC2 인스턴스 인바운드 규칙 추가

(HTTP/S, SSH는 이전에 추가) Spring Boot Server, React Server 접근 허용을 위해 아래와 같이 추가해준다.

 

인바운드 규칙 편집 > '규칙 추가'

 

인바운드 규칙 추가 완료

 

 

 

 

2. 서버 Java 설치, 환경변수 설정

아래 명령어를 순서대로 입력한다

# 서버 접속
ssh -i "키페어파일명.pem" ubuntu@{퍼블릭_DNS_주소}

# 우분투 패키지 업그레이드
sudo apt-get update

# Java17 설치
sudo api install openjdk-17-jdk

# 설치 확인
java -version

 

Java17 설치 완료

 

 

 

그리고 아래 명령어를 통해 자바 환경 변수를 설정해준다

# 환경변수 설정 확인 (결과 없음 상태)
$ echo $JAVA_HOME

# Java 절대경로 확인
$ whice java
/usr/bin/java

$ readlink -f /usr/bin/java
/usr/lib/jvm/java-17-openjdk-amd64/bin/java

# 환경변수 설정
$ vi /etc/profile

''' 커서를 가장 아래로 옮긴 뒤(shift+g), 아래 내용 입력
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/bin/java
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
'''

# 위의 변경사항 적용
source /etc/profile

vi /etc/profile 화면

 

그리고 재접속 후 확인하면, 아래와 같이 잘 적용된 것을 확인할 수 있다.

 



 

 


3. 빌드

build > build 클릭

 

Gradle > build/build 를 클릭하면, 빌드 과정 후 프로젝트_디렉토리명/build/lib/프로젝트명-1.0.jar 파일이 생성된다. 



 

 

4. 배포

간단하게 scp로 해당 파일을 서버로 옮겼다.

scp -i {pem_파일명}.pem ./backend-1.0.jar ubuntu@{서버주소}:~/

 

 

이어서 서버에 접속한 상태로 아래 명령어를 통해 실행하면 된다.

# jar 배포 파일 실행
java -jar backend-1.0.jar 

# 무중단 실행 
nohup java -jar backend-1.0.jar > {로그파일명}.txt &

 

실행 로그

 

 

 

참고 https://velog.io/@dlzlqlzl/AWS-Spring-Boot-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%B0%B0%ED%8F%AC-%ED%95%B4%EB%B3%B4%EA%B8%B0

 

 

 

* MySQL command denied 에러 발생

2024-06-11T07:55:58.572Z  WARN 24979 --- [nio-8080-exec-2] o.m.jdbc.message.server.ErrorPacket      : Error: 1142-42000: SELECT command denied to user 'godswork'@'{주소}' for table `gods_work`.`trainer`
2024-06-11T07:55:58.572Z  WARN 24979 --- [nio-8080-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 1142, SQLState: 42000
2024-06-11T07:55:58.573Z ERROR 24979 --- [nio-8080-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper   : (conn=2248) SELECT command denied to user 'godswork'@'{주소}' for table `gods_work`.`trainer`
org.springframework.dao.InvalidDataAccessResourceUsageException: JDBC exception executing SQL [select t1_0.trainer_id,t1_0.address,t1_0.birth_ymd,t1_0.center_id,t1_0.created_at,t1_0.email,t1_0.gender,t1_0.is_active,t1_0.is_admin,t1_0.is_withdrawal,t1_0.modified_at,t1_0.name,t1_0.password,t1_0.phone_number,t1_0.registration_ymd,t1_0.trainer_login_id from trainer t1_0 where t1_0.trainer_login_id=?]; SQL [n/a]

 

분명 'godswork' 계정에 "grant all previleges on gods_work.* to 'godswork'&'%' 설정을 해주었는데 왜 select가 안될까...

>> 우선, RDS 생성시 만들었던 마스터 사용자 계정을 사용하기로 했다.

 

 

 

 

5. 서버 스크립트 생성

1) 서버 실행 스크립트 작성

# 스크립트 파일 생성
$ nano start.sh

'''아래 내용 입력
#!/bin/bash

JAR=backend-0.0.1.jar
LOG=~/log.log

nohup java -jar $JAR > $LOG 2>&1 &
'''

# 실행 권한 부여
$ chmod +x start.sh

# 실행
$ ./start.sh

* 위에서 2>&1 은 오류 출력(stderr)을 일반 출력(stdout)으로 전달하라는 의미다.

 

 

2) 서버 중지 스크립트 작성

'''아래 내용 입력
#!/bin/bash

PID=$(ps -ef | grep java | grep backend | awk '{print $2}')

if [ -z "$PID" ];
then
	echo "Backend Application is not running!"
else
	kill -9 $PID
    echo "Backend Application Stopped"
fi
'''

# 권한 부여
$ chmod +x stop.sh

# 중지 실행
$ ./stop.sh

* awk '{print $2}' 명령은 출력 문자열의 2번째 항목인 프로세스 아이디만 뽑아낸다.

 

 

 

 

6. 기본 80번 포트로 변경 (Nginx)

지금까지 8080번 포트를 사용했지만, 실제 운영 환경에서는 80번 포트를 가장 많이 사용한다. 

 

그 방법 중 아래 명령어를 사용해서 80번 포트를 직접 실행할 수도 있지만, 추천되지는 않는다.

$ sudo java -Dserver.port=80 -jar backend-0.1.jar

 

 

그래서 보통 엔진엑스(Nginx)아파치(Apache)와 같은 웹 서버를 사용해서 80번 포트를 사용한다.

여기에서는 엔진엑스와 스프링부트를 연동해 80번 포트로 웹 서비스를 운영하도록 한다. 

# nginx 설치
$ sudo apt install nginx

# 엔진엑스 설정을 루트 권한으로 생성
$ cd /etc/nginx/sites-available
$ sudo nano backend

''' 아래 내용을 작성
server {
	listen 80;
    server_name localhost;
    
    location / {
    	proxy_pass http://localhost:8080;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
    }
}
'''

 

터미널 실행
backend 설정 파일 생성 완료!

 

 

 

 

 

이제 위에서 생성한 backend 파일을 엔진엑스가 설정 파일로 읽을 수 있도록, backend 파일을 /etc/nginx/sites-enabled 디렉터리에 링크해준다. 아래 명령어를 순서대로 따라 입력해준다.

$ cd /etc/nginx/sites-enabled

# 현재 default 설정 파일만 링크되어 있음을 확인
$ ls
default

# 기존에 있던 링크 삭제
$ sudo rm default

# 새로 만든 파일을 링크
$ sudo ln -s /etc/nginx/sites-available/backend

# 링크 확인
$ ls
backend

링크 설정 완료

 

 

 

 

 

위의 엔진엑스 설정을 적용하기 위해, 엔진엑스를 다시 시작한다.

# 관리자 권한으로 재시작
$ sudo systemctl restart nginx

* 처음 시도시 에러가 발생해서 확인 해보니(sudo nginx -t) sites-available/backend 파일에 오타가 있었다. sudo 권한으로 수정 후 다시 재부팅 성공! 

 

 

(좌)기존 방식대로 8080 포트로 접속 / (우) 포트 입력 없이 접속

 

 

반응형