🐻 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 프로토콜로 접속되는 것도 확인할 수 있다.