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

그리고 아래 명령어를 통해 자바 환경 변수를 설정해준다
# 환경변수 설정 확인 (결과 없음 상태)
$ 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

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

3. 빌드


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 &

* 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 파일을 /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 권한으로 수정 후 다시 재부팅 성공!


'Study > GW' 카테고리의 다른 글
[Spring Boot3] 로컬-운영 환경 분리 (0) | 2024.06.19 |
---|---|
[AWS] 에러해결 - 인스턴스 연결성 검사 실패, 메모리 부족 (0) | 2024.06.13 |
[Spring Boot3] SSH 터널링 설정 (EC2 > RDS 데이터베이스) (0) | 2024.06.10 |
[AWS] 프리티어 EC2 생성, EC2-RDS 연결, DataGrip SSH 연결 (0) | 2024.06.05 |
[AWS] RDS Free Tier 과금 해결 (0) | 2024.06.05 |