Day_50 ( 스프링 - 15 )

HD.Y·2024년 1월 9일
0

한화시스템 BEYOND SW

목록 보기
43/58
post-thumbnail

🐻 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대를 추가로 설치하여 로드밸런싱으로 연동하는 것을 실습해보겠다.
    ➡ 준비사항 : 스프링 서버 1대 추가 설치 및 실행 ( IP : 77.77.77.112 )
  • 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-2aap-northeast-2c
      ➡ 보안 그룹 : 모든 보안그룹 선택
      ➡ 리스너 및 라우팅 :
        HTTP 80번 포트 입력 후 생성한 대상그룹 선택
        HTTPS 443번 포트 입력 후 생성한 대상그룹 선택

      ➡ 보안 리스너 설정 : 기본 SSL/TLS 서버 인증서에서 인증받은 인증서 선택
      ➡ 로드 밸런서 생성
      ➡ 리스너 추가 후 80번 포트로 들어오면 HTTPS 443번 포트로 리다이렉트 되도록
        "URL로 리디렉션 설정해주기 : 리스너 편집 클릭 후 설정"


  • 여기서 중요한 것은 보안그룹에 대한 "인바운드 규칙" 을 잘 지정해줘야된다는 것이다.

  • 포트번호 80번과 443번에 대해서 모든 보안그룹에 인바운드 규칙을 허용시켜줘야 된다.

  • 이제 마지막으로 내 도메인 한국 에서 내 도메인의 설정에 로드 밸런서의 주소를 입력해주면 된다. 로드 밸런서가 활성화 되는 것도 반드시 확인하자 (시간이 좀 걸림)

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

profile
Backend Developer

0개의 댓글