4. NGINX 사용
이번엔 서버 배포를 위해 NGINX를 사용해 보자.
NGINX를 사용하면 WAS와 Web Server를 분리할 수 있고, 여러 대의 WAS를 사용할 경우 로드밸런서의 역할을 해 주며, Reverse Proxy 기능도 사용할 수 있다.
그렇기 때문에 NGINX를 사용하는 서버와 실제로 SpringBoot를 배포하는 서버는 따로 분리해 둘 것이다.
1. NGINX
인스턴스 생성
인스턴스 생성은 여러번 진행중이니 크게 설명하지 않겠다.
키 페어와 보안그룹 모두 이번 프로젝트에서 사용하는 것과 동일한 것으로 사용했으며, ubuntu로 생성했다.
NGINX 설치 및 실행
위 블로그를 따라 진행했다.
도메인은 예전에 가비아에서 구매했던 도메인을 사용하였다.
도메인은 NGINX 서버를 호스팅하도록 한다.
이 때 중요한 것은 우리는 위 블로그와 달리 NGINX를 사용하는 서버와 Spring 배포 서버가 서로 다른 서버라는 것이다.
서버 블록 파트에서의 location을 다음과 같이 작성해 주어야 한다.
server { # server 블록
listen 80;
server_name {domain} www.{domain};
access_log /var/log/nginx/proxy/access.log;
error_log /var/log/nginx/proxy/error.log;
location / { # location 블록
include /etc/nginx/proxy_params;
proxy_pass http://{배포 서버의 public ip 주소}:8080; # reverse proxy의 기능
}
}
이제 NGINX 서버는 80 포트로 들어오는 http 요청을 배포 서버의 8080로 전달해 줄 것이다.
이를 위해 AWS 보안 그룹의 아웃바운드 규칙에도 8080 포트를 추가해 주자.
2. Spring
이어서 Spring 배포 서버에서 Spring을 배포하자.
아직 배포 자동화를 진행하지 않았으니, FileZilla를 이용해 직접 파일을 전송할 것이다.
Spring 프로젝트 gradle 탭의 Tasks > Build > clean / build를 순서대로 실행해 실행 파일을 빌드해 준다.
이후 FileZilla를 이용해 실행파일을 배포 서버로 전송해 주었다.
java -jar [실행 파일 이름] 을 사용해 Spring을 실행하려는데, 문제가 생겼다.
현재 프로젝트에선 DB url이 localhost로 설정되어 있어 DB 커넥션을 제대로 만들지 못하였기 때문이다.
3. MySQL
DB를 구동하는 서버 역시 분리를 하였다.
인스턴스를 새로 생성해 주었다.
MySQL 설치
sudo apt-get install mysql-server
위 명령어를 사용해 mysql을 설치해 주자.
원격 접속을 위한 설정
우리는 배포 서버에서 DB 서버로, 즉 원격으로 DB를 위한 통신을 해야 한다.
https://minutemaid.tistory.com/170
외부 통신을 위한 설정은 위 블로그를 참고하였다.
위 블로그 대로 따라갔는데 재대로 접속이 안될때는 mysql 서버를 다시 시작해 주자.
NGINX - Spring - DB 연결 확인
위의 모든 과정이 끝났으면 Spring 배포 서버에서 jar 파일을 실행시켜 보자.
DB 커넥션풀을 정상적으로 받아오면서 에러 없이 Spring 실행파일이 정상 구동 된다.
[스프링 배포 서버 public IP]:8080 주소로 접속하면 우리가 만든 Spring 웹 페이지가 잘 보일 것이다.
NGINX 서버에서 NGINX를 다시 로드해 주면 NGINX 서버를 호스팅하는 도메인에서 Spring 웹페이지를 볼 수 있을 것이다.