
🐻 Nginx 서버와 스프링 서버 연동하기
준비사항 : 리눅스 가상머신 2대 ( 1대 : 스프링 서버 / 1대 : Nginx 서버 )
➡ 스프링 서버 설치 : "Day_43 ( 스프링 - 10 )" 글 참고 ( IP : 77.77.77.111 )
: 스프링 서버는 지난 글에서 실시한 프로젝트를 그대로 사용하였다.
➡ Nginx 서버 설치 : "Day_02 ( 웹 서버, 포트 포워딩 )" 글 참고 ( IP : 77.77.77.113 )
설치가 끝났다면 nginx 서버에 스프링을 연동하는 설정을 해주면 된다.
➡ 현재 스프링 서버는 실행중인 상태이다.
1) nginx 설정 파일 열기 : vi /etc/nginx/nginx.conf
2) 줄 번호 보이게 하기 : :set nu
3) 47번 줄의 location / { } 안에 아래의 스프링 연동 설정을 추가한다.
location / {
proxy_pass http://77.77.77.111:8080; // 위에서 설치한 스프링 서버의 IP 주소 입력
proxy_set_header X-Real_IP $remote_addr;
proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
}
4) 편집한 내용을 저장한 뒤 nginx 서버를 재시작 : systemctl restart nginx
5) nginx 서버 주소로 들어가서 스프링 프로젝트에서 구현했던 상품 읽기 기능을 GET
방식으로 HTTP 요청을 보내보면, 아래와 같이 지정한 응답이 웹 페이지에 출력되는
것을 확인할 수 있다.

🦁 로드밸런싱을 이용한 스프링 서버 2대 연동하기
nginx 서버 1대에 스프링 서버 1대를 연동하는 것을 실습해봤다. 그렇다면 이제 스프링 서버 1대를 추가로 설치하여 로드밸런싱으로 연동하는 것을 실습해보겠다. nginx 서버 설정 변경하기 ✅
1) nginx 설정 파일 열기 : vi /etc/nginx/nginx.conf
2) 줄 번호 보이게 하기 : :set nu
3) 38번 줄 server 위에 아래의 내용 추가하기
upstream mybackends { // [mybackends] 이름은 설정하기 나름
server 77.77.77.111:8080; // 1번 스프링 서버 IP 주소
server 77.77.77.112:8080; // 2번 스프링 서버 IP 주소
}
4) 위에서 설정한 47번줄의 location의 첫번째 줄 수정하기
// 기존 : proxy_pass http://77.77.77.111:8080;
// 수정 : proxy_pass http://mybackends;
5) 편집한 내용을 저장한 뒤 nginx 서버를 재시작 : systemctl restart nginx
6) nginx 서버에서 스프링 서버 2개가 부하 분산되어 동작하는지 확인하기
➡ 명령어 실행 : while true;do curl http://77.77.113/product/1; echo -e "\n"; usleep 300000; done
➡ 먼저 nginx 서버 콘솔창에서 명령어를 실행시킨 뒤, 웹페이지에 접속해서 새로고침을
계속 눌러보면, 아래와 같이 스프링 서버 2개가 서로 부하 분산되어 HTTP 응답을
보내오는 것을 확인할 수 있다.

만약 여기서 서버에 대한 요청이 많아져서 추가로 서버를 늘려야 한다면, nginx 서버 설정파일의 upstream 부분에 새로 추가하는 서버의 IP만 추가해주면 된다.
이때, nginx를 재시작하면 서버가 종료됬다고 다시 시작되므로, 이제는 restart가 아닌 systemctl reload nginx 명령어를 사용하면 서버가 종료되지 않고 변경된 설정이 반영되게 된다.
🐵 리눅스에서 인증서 발급하기 실습
그동안 내 서버는 항상 인증을 받지 못해서 http 프로토콜로만 접속을 하였는데, 이제는 인증을 받아서 https 로 접속토록 설정을 해줘보겠다.
💻 nginx 서버에서 인증서 발급받는 법
1) 내 도메인 한국( https://xn--220b31d95hq8o.xn--3e0b707e/ ) 에서 사용 할 도메인을
등록한다. ( 등록한 도메인 : www.myspring.kro.kr )
➡ 이때 도메인 등록 시 ip 주소는 내 컴퓨터의 공인 IP 주소로 설정해줘야 한다.
➡ 그런다음, 내 컴퓨터의 사설 IP에 대해 포트번호 80번, 443번에 대해 포트포워딩
설정을 해준다.

➡ 마지막으로, VMWare 가상머신의 nginx 서버에 대해서도 포트번호 80번, 443번에
대해 포트포워딩 설정을 해준다.

1) 인증서 발급을 위한 EPEL 저장소 설치 : yum install –y epel-release
2) 무료로 인증서를 발급해주는 "certbot" 설치
➡ yum install -y certbot python3-certbot-nginx
: "python3-certbot-nginx" 는 certbot을 nginx와 쉽게 통합해주는 명령어,
다시말해 nginx의 설정 파일을 자동으로 바꿔주는 옵션이다.
3) 인증서 발급 : certbot -nginx -d [도메인 주소]
➡ 이메일 주소 입력 질문 : [실제 자신의 이메일 주소 입력]
➡ 라이센스 동의 여부 질문 : yes 입력
➡ 마케팅 동의 여부 질문 : no 입력
4) 정상적으로 발급이 완료됬다면 아래와 같이 출력된다.
5) 테스트 해보기
➡ nginx 서버 IP 주소로 접속해보기 : 77.77.77.113/product/1
➡ 내 PC 사설 IP 주소로 접속해보기 : 사설 IP 주소/product/1
➡ 내 PC 공인 IP 주소로 접속해보기 : 공인 IP 주소/product/1
여기까지 테스트해보면 결과는 동일하나 인증을 받지 않아서 아래와 같이 "주의 요함" 이라고 떠있을 것이다.

➡ 이제 마지막으로 도메인 주소로 접속해본다 : www.myspring.kro.kr/product/1
그러면 도메인 주소는 인증서를 발급받았기 때문에 아래와 같이 "안전하다" 고 나오는 것을 확인할 수 있다.



🐼 ASW 클라우드를 이용하여 스프링 서버 배포하기
EC2 를 검색하여 새로운 인스턴스(가상의 컴퓨터)를 생성한다.
1) 생성하기 전 지역이 "서울" 로 선택되어 있는지 확인
2) 인스턴스 시작 클릭 후 인스턴스 이름을 입력해 준다. 
3) "Quick Start" 에서 Ubuntu를 선택하고 버전은 "20.04" 로 선택한다.

4) "인스턴스 유형"은 기본 설정된 것으로 하고, "키 페어(로그인)" 에서 새 키 페어
생성을 클릭한다.

➡ 키 페어 유형은 RSA, 형식은 .ppk 로 생성한다. ( putty에서 사용 예정 )
➡ 생성한 키 파일은 접속할 때 사용되기 때문에 중요하다.
5) 설정을 마치고 "인스턴스 시작하기" 를 클릭한다.
6) "putty" 를 이용하여 생성한 가상의 컴퓨터로 접속을 시도한다.
➡ IP 주소는 생성한 인스턴스의 "퍼블릭 IPv4 주소" 를 입력한다.
➡ 여기서 중요한 것은 인스턴스 시작 시 생성해줬던 키를 넣어줘야되는데, 그것은
아래 사진을 참고하면 된다.

➡ 그런다음 "Saved Sessions" 로 저장해두면, 다음 접속 시에는 바로 클릭해서
접속이 가능하다.

➡ 사용자 이름 : ubuntu 로 접속하면 접속이 될 것이다.
➡ 작업을 위해 관리자 권한으로 변경해준다 : sudo su - root
➡ 방화벽을 꺼준다 : sudo ufw disable
➡ EC2 인스턴스의 인바운드 규칙을 설정해준다.
1) 인스턴스를 클릭하여 들어간 뒤 "보안탭" 클릭 - "보안 그룹" 클릭

2) "인바운드 규칙 편집" 클릭
3) 80번 포트와 443번 포트에 대한 규칙을 추가해준 뒤 저장

✅ 다음으로 AWS 에서 데이터베이스를 생성하는 "RDS" 를 검색한다. ✅
1) 데이터베이스 생성하기를 클릭한다.
2) 데이터베이스 생성 방식은 기본으로 선택된 "표준 생성" 을 그대로 하고,
엔진 옵션은 "MySQL" 을 선택한다.
3) 엔진 버전은 "MySQL 8.0.33" 을 선택한다.
4) 템플릿은 무료로 사용할 것이기 때문에 "프리 티어" 로 선택한다.
5) DB 인스턴스 식별자를 입력해 준다.
6) 마스터 암호도 사용할 비밀번호를 적절하게 입력해 준다.
7) 스토리지 자동 조정 활성화는 해제시켜준다.

8) 퍼블릭 액세스는 "예" 로 선택해준다.

9) 추가 구성의 데이터베이스 옵션에서 DB명을 입력해 준다.
10) 자동 백업 활성화, 암호화 활성화, 마이너 버전 자동 업그레이드 사용 모두 다
해제시켜준뒤 데이터베이스 생성을 클릭한다..

11) 생성되는데는 시간이 조금 소요된다.
12) 보안 그룹의 3306 포트에 대한 인바운드 규칙을 허용시켜준다.
(기본적으로 허용이 되있긴 하다.)
13) MySQL Workbench에서 접속 테스트 해본다.
➡ Hostname: RDS 의 엔드포인트
➡ Username: admin
application.yml 파일에 DB 연결정보 수정 ✅spring:
datasource:
master:
hikari:
username: admin
password: [비밀번호 입력]
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://myspring.ca6ypamwuvpr.ap-northeast-2.rds.amazonaws.com/web
slave:
hikari:
username: admin
password: [비밀번호 입력]
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://myspring.ca6ypamwuvpr.ap-northeast-2.rds.amazonaws.com/web
➡ 여기서 jdbc-url 주소는 RDS 생성이 끝나면 클릭했을때 "연결 및 보안" 의
엔드포인트이고, / 뒤는 DB 이름 이다.
➡ 원래는 Master - Slave 2개를 생성해야 하나, 테스트 목적이기 때문에, 같게 설정해줬다.

jar 파일을 생성해 준 뒤 EC2의 Ubuntu 컴퓨터로 파일을 배포해야 한다. ✅
다양한 방법이 있겠지만 "FileZilla" 프로그램을 사용해서 처리했다.
1) "FileZilla" 프로그램 클라이언트 버전 다운로드 ( https://filezilla-project.org/ )
2) 사이트 관리자 클릭

3) 새 사이트 클릭 - 프로토콜 : SSH File Transfer Protocol 클릭
호스트 : 인스턴스의 퍼블릭 IPv4 주소 입력
4) 로그온 유형 : 키 파일 / 사용자 : ubuntu / 키 파일 : 인스턴스 생성 시 생성한 키 파일
5) 연결 클릭 후 정상적으로 연결이 됬는지 확인

6) 생성한 jar 파일 경로에서 jar 파일을 선택 후 오른쪽으로 드래그

7) Ubuntu 서버에서 해당 경로를 확인해보면 jar 파일이 옮겨진 것을 볼 수 있다.

✅ OpenJdk 11 설치하는 방법 ✅
1) apt 업데이트 : sudo apt update
2) java 설치 : sudo apt install openjdk-11-jdk
➡ 설치 확인 : java -version
3) JAVA_HOME 설정 : sudo vi /etc/environment
➡ 자바경로 입력 후 저장 : JAVA_HOME="/usr/lib/jvm/java-11-openjdk-arm64"
4) 변경사항 저장 후 확인 : source /etc/environment / echo $JAVA_HOME
5) jar 파일 실행 : java -jar [jar 파일명]
✅ nginx 서버 설치 및 스프링 서버 연동하기 ✅
1) nginx 서버 설치 : sudo apt-get install nginx
2) nginx 설정 파일 수정 : sudo vi /etc/nginx/sites-available/default
➡ location / { } 에 아래의 내용 추가
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
# try_files $uri $uri/ =404;
proxy_set_header HOST $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://localhost:8080;
proxy_redirect off;
charset utf-8;
}
3) 설정사항 저장 후 nginx 리로드 : sudo nginx -t / sudo service nginx reload
4) 스프링 서버 연동이 정상적으로 됬는지 인스턴스 IP 주소로 접속 테스트

✅ AWS에서 인증서 받기 ✅
1) "Certificate manager" 검색 ➡ "인증서 요청" 클릭
2) 도메인 이름 입력 ( 위에서 생성해 준 도메인 myspring.kro.kr 입력 ) 후 요청
➡ 도메인 주소 입력 시 www 는 뺀것과 www를 포함한것 2개를 인증 받아본다.
( 반영되는데 시간이 걸리는데 몬가 좀 애매한 부분이 있는 것 같기 때문... )
3) 검증을 위한 절차
➡ 인증서 클릭 시 "CNAME 이름" 과 "CNAME 값" 이 있을 것이다.
➡ 내 도메인 한국에서 해당 값들을 아래와 같이 설정해 준다.
➡ 이때 "CNAME 이름" 은 도메인 주소 전까지만 입력하고,
"CNAME 값" 은 제일 뒤에 . 을 빼준다.

4) 검증이 성공됬다고 뜨면 된것이며, 아래와 같이 여러종류의 주소를 한번에 받을 수도
있다.

✅ AWS 로드밸런싱 설정하기 ✅
1) EC2 왼쪽 메뉴탭 ➡ 로드 밸런싱 ➡ 대상 그룹 선택
➡ 대상 유형 선택: 인스턴스
➡ 대상 그룹 이름: [이름 설정]
➡ 프로토콜: HTTP
➡ 포트: 80
➡ VPC: 기본
➡ 프로토콜 버전: HTTP/1
➡ 상태 검사 프로토콜: HTTP
➡ 상태 검사 경로: /
➡ 고급 상태 검사 설정: 기본
➡ 태그: X
➡ 사용 가능한 인스턴스 포트 80으로 등록 (아래에 보류 중인 것으로 포함)
➡ 대상 그룹 생성

2) 로드 밸런서 생성(EC2 왼쪽 메뉴탭 ➡ 로드 밸런싱 ➡ 로드밸런서) 하기 클릭
➡ 로드 밸런서 유형 : Application Load Balancer
➡ 로드 밸런서 이름 입력
➡ 체계 : 인터넷 경계
➡ IP 주소 유형 : IPv4
➡ 네트워크 매핑: ap-northeast-2a 와 ap-northeast-2c
➡ 보안 그룹 : 모든 보안그룹 선택
➡ 리스너 및 라우팅 :
HTTP 80번 포트 입력 후 생성한 대상그룹 선택
HTTPS 443번 포트 입력 후 생성한 대상그룹 선택
➡ 보안 리스너 설정 : 기본 SSL/TLS 서버 인증서에서 인증받은 인증서 선택
➡ 로드 밸런서 생성
➡ 리스너 추가 후 80번 포트로 들어오면 HTTPS 443번 포트로 리다이렉트 되도록
"URL로 리디렉션 설정해주기 : 리스너 편집 클릭 후 설정"

여기서 중요한 것은 보안그룹에 대한 "인바운드 규칙" 을 잘 지정해줘야된다는 것이다.
포트번호 80번과 443번에 대해서 모든 보안그룹에 인바운드 규칙을 허용시켜줘야 된다.
이제 마지막으로 내 도메인 한국 에서 내 도메인의 설정에 로드 밸런서의 주소를 입력해주면 된다. 로드 밸런서가 활성화 되는 것도 반드시 확인하자 (시간이 좀 걸림)

도메인 주소를 입력해서 접속해보면 인증처리가 됬고, 스프링 서버에도 이상없이 요청이 가는 것을 확인할 수 있다.
또한 http://www.myspring.kro.kr 로 접속하면 자동으로 리다이렉트되어 https 프로토콜로 접속되는 것도 확인할 수 있다.
