서버와 배포

김도현·2023년 4월 26일

AWS에 관심이 있다면 "AWS는 어렵고 비싸다"라는 말을 많이 들었을 것이다. 하지만 AWS 라이트세일로 AWS를 쉽고 저렴하게 사용할 수 있다. 여기서는 AWS 라이트세일을 어떻게 사용하는지 알아보자.

AWS 라이트세일이란?

AWS 라이트세일은 아마존에서 운영하는 웹 서비스에 특화된 클라우든 서비스이다. AWS를 처음 시작하려면 공부할 내용이 무척 많다. 하지만 AWS 라이트세일은 웹 서비스 운영에 꼭 필요한 기능만 준비되어 있어 비교적 공부할 내용이 적다. 또한 AWS와 비교하면 AWS 라이트세일은 정말 가성비가 좋다.

AWS 라이트세일 이용하기

  1. AWS 공식 홈페이지 접속
  2. AWS 계정 생성
  3. AWS 라이트세일 접속
  4. AWS 라이트세일 로그인
  5. 인스턴스 생성
  6. 인스턴스 이미지 선택 -> <Linux/Unix>
  7. 블루프린트 선택 -> OS 전용 -> Ubuntu 20.04 LTS를 선택, 운영체제는 아주 다양한데 가장 안정되고 많은 사람이 사용하는 우분투를 설치함
  8. 이렇게 설정하고 결제를 하면 나의 서버가 생성됨

서버 접속 설정

  1. 고정 IP 설정
  • AWS 서버에 접속하려면 고정 IP가 필요하다. 고정 IP는 말 그대로 IP가 변하지 않고 고정된다는 말이다.
  • AWS 라이트세일의 메인 화면에서 고정 IP 생성 서비스로 고정 IP명만 설정하면 고정 IP를 생성해줌
  1. 방화벽 설정
  • SBB 서비스의 기본 포트 번호는 8080이다. 그래서 외부에서 8080번 포트로 접속하려면 "방화벽 해제 작업"을 해야 한다.
  • HTTP 기본 포트인 80번 포트와 SSH 기본 포트인 22번 포트는 AWS에서 디폴트로 방화벽이 해제되어 있으므로 방화벽 해제 작업이 필요 없다.
  • AWS 라이트세일에서 네트워킹 탭에서 IPv4 방화벽 개방하는 규칙 추가 기능에서 8080를 입력하고 생성버튼을 누르면 방화벽 설정이 가능

서버 접속 프로그램

SBB 서비스를 서버에 적응하기 위해서는 서버에 접속하여 프로그램을 설치하고 환경 설정을 진행해야 한다. 이번 장에서는 서버 작업을 위해 필요한 SSH, SFTP 도구를 설치하고 사용해보자.

  • SSH - 네트워크 상의 다른 컴퓨터에 로그인하거나 원격 시스템의 명령을 수행하기 위한 프로토콜 (기본포트: 22)
  • SFTP - SSH의 파일 전송을 담당하는 역할, 서버에 파일을 업로드하거나 할 수 있는 프로토콜 (기본포트: 22번)

프라이빗 키

SSH 또는 SFTP 프로그램으로 서버에 접속하기 위해서는 AWS의 계정 프라이빗 키가 필요하다. 프라이빗 키는 AWS 라이트세일 계정에서 .pem 파일로 키를 다운받을 수 있다.

SSH 클라이언트

SSH 클라이언트는 서버에 접속하는 단말기 역할을 하므로 터미널 프로그램이라고도 한다.

윈도우용 SSH 터미널 프로그램

프라이빗 키가 준비되었으므로 이제 SSH 터미널 프로그램을 다운로드 받고 설치하자. 좋은 SSH 터미널 프로그램이 많지만 여기서는 무료로 사용할 수 있고 많은 사람들이 추천하는 MobaXterm을 사용해보자

MobaXterm 설정

  1. SSH 누르기
  2. 서버의 고정 IP 주소 입력 (AWS 라이트세일에서 아까 부여받은 고정 IP주소 입력)
  3. 체크하고 ubuntu 입력
  4. 체크하고 입력 창 오른쪽에 있는 서류 모양 아이콘을 눌러 로컬 컴퓨터에 있는 프라이빗 키 파일(아까 다운 받은 .pem 파일) 선택
  5. OK 누르기

위와 같이 설정하면 MobaXterm으로 서버에 접속할 수 있다. 이제 MobaXterm을 이용하여 서버작업을 할 수 있다.

SFTP 클라이언트

SBB서비스는 jar 형태로 서버에 배포할 것이다. 이 때 배포파일로 만든 jar 파일을 서버에 전송해야 한다. 이렇게 파일을 서버에 전송하기 위해서는 SFTP 클라이언트 프로그램이 필요하다.

SFTP

좋은 SFTP 프로그램이 많지만 여기서는 무료로 사용할 수 있는 파워질라를 사용함

파워질라 사용 방법

  1. 화면 좌측 상단의 아이콘을 누름
  2. New Site 버튼을 누름
  3. sbb라는 이름으로 변경
  4. 프로토콜은 SFTP를 선택
  5. 호스트에서 서버의 고정 IP주소를 입력
  6. 사용자에 ubuntu를 입력
  7. 키파일에는 이전에 저장한 .pem 파일을 "찾아보기"로 찾아서 선택

이와 같이 설정값을 모두 입력하고 "연결" 버튼을 누르면 서버에 접속할 수 있음

좌측 "로컬 사이트"는 내 컴퓨터를 의미하고 우측의 "리모트 사이트"는 서버를 의미함 드래그 앤 드롭이나 파일 우측 마우스버튼을 클릭하여 "업로드" 또는 "다운로드" 할 수 있음

SBB 오픈

  1. 서버에 자바를 설치하고 환경설정을 한다.
  2. 서버에 적용할 SBB 배포파일을 생성한다.
  3. SFTP를 통해 SBB 배포파일을 전송한다
  4. SBB 배포파일을 실행한다.
  5. 웹 브라우저로 SBB 서비스를 테스트한다.

서버 환경설정

먼저 터미널(mobaXterm)을 사용하여 서버에 접속하자.

  1. hostname 변경하기
    image
  2. 서버 시간 설정하기
    image
  3. 자바 설치
  • 스프링 부트를 사용하려면 자바가 반드시 설치되어 있어야 한다.
    image
  1. 프로젝트 디렉터리 생성
    image

SBB 배포파일(.jar) 생성

인텔리제이에서 밑의 링크처럼 .jar 파일 생성하기
https://chunghyup.tistory.com/79

SFTP로 SBB 배포파일 전송하기

이제 생성한 .jar 파일을 파일질라를 통해 서버에 전송해보자

그냥 로컬에 있는 .jar파일을 드래그 앤 드롭해서 아까 만든 서버의 sbb 파일에 업로드 한다.

SBB 배포파일 실행

image

다음과 같이 서버에서 배포 파일을 실행하고 웹 브라우저에서 앞서 설정한 고정 IP에 포트 번호를 붙여 접속하면 서비스가 보여지는 것을 볼 수 있다.

서버 스크립트

위와 같이 같이 단순하게 실행하면 서버에 접속한 터미널이 종료하면 서비스도 중단된다. 따라서 이를 방지하기 위해서는 백그라운드로 서비스를 실행해야 한다.

개발과 서버 환경 분리

SBB는 데이터베이스로 H2 데이터베이스를 사용한다. 그리고 개발 편의상 H2 데이터베이스의 사용자명은 sa 비밀번호는 빈값으로 설정하였다. 하지만 서버환경에서도 이처럼 사용하는 것은 위험하다.

왜냐하면 누구나 서버의 H2 데이터베이스 콘솔에 로그인할 수 있기 때문이다.

H2 데이터베이스에 비밀번호를 설정하는 방법은 매우 간단하다. application.properties 파일에 다음과 같은 항목에 다음처럼 비밀번호만 설정하면 된다.

"spring.datasource.password=1234"

하지만 우리는 개발 편의를 위해 로컬 환경은 여전히 비밀번호 없이 사용하고 서버 환경에만 비밀번호를 설정하고자 한다.

image

빌드 버전 변경하여 배포파일 생성하기

image

이렇게 새로 생성한 배포파일을 파일질라를 이용해 서버의 sbb 디렉토리에 업로드하자

변경내용 서버에 적용하기

데이터베이스에 비밀번호를 설정했기 때문에 기존에 있던 데이터베이스 파일들을 모두 지워야 한다.

image

Nginx

SBB 서비스는 현재 8080번 포트로 서비스를 하고 있다. 하지만 대부분의 인터넷 서비스는 8080번 포트 대신 80번 포트로 서스를 한다. 80번 포트를 사용하면 고정아이피:80 과 같이 사용해도 되고 고정아이피 처럼 80번 포트르르 생략하여 사용할 수 있다. 왜냐하면 80번 포트가 HTTP 프로토콜의 기본 포트이기 떄문이다.

Nginx는 높은 성능을 위해서 개발된 웹 서버로 설정이 무척 간단하여 쉽게 사용할수 있다.

로깅

스프링부트는 기본적으로 logback이라는 로깅 툴을 사용하여 로그를 출력한다. STS의 콘솔에 출력되는 문자열과 서버에서 sbb.log 파일에 출력되는 문자열이 모두 logback에 의해 출력되는 로그이다.

서버 로그의 문제점

하지만 현재 서버에 생성되는 로그 파일에는 다음과 같은 몇가지 문제가 있다.

  • SBB 서비스를 재 실행할 경우 이전 로그가 삭제됨
  • 로그 파일이 쌓일수록 로그파일의 사이즈가 커지며 무한대로 증가할 수 있음
  • 로그의 시간이 시스템 시간이 아닌 UTC시간으로 출력됨

서버 로그 분리

위에서 말한 서버 로그의 문제점을 해결하려면 다음과 같이 application-prod.properties 파일을 수정해야 한다.

image

도메인

현재 SBB 서비스에 접속하기 위해서는 브라우저 주소창에 고정 IP를 입력해야 한다. 하지만 대부분의 웹 사이트는 이런 식으로 접근하지 않고 기억하기 쉬운 도메인을 사용함

  1. 도메인 업체를 선택하고 그곳에서 원하는 도메인을 구입하자. 예) pybo.kr
  2. 고정 IP와 도메인 연결
  • 도메인을 구입했다면 이제 도메인과 AWS에 등록된 고정 IP를 연결해야 한다.
  • 아마존의 라이트세일 홈페이지에서 로그인 후 네트워킹 탭에서 DNS 영역 생성을 누른 후 구매한 도메인을 입력하여 등록하고 DNS 영역 생성을 함 그러면 AWS 라이트세일이 네임서버를 제공함 이 네임 서버주소는 도메인 네임서버 주소로 등록해야 하므로 기억해 두어야 한다.
  1. 네임 서버 설정
  • 이제 AWS 라이트세일의 네임서버 주소가 생성되었으므로 도메인 업체에 접속하여 구매한 도메인과 연결된 네임서버 주소를 변경해야 함

도메인 적용

image

SSL

이제 브라우저에 고정 IP 대신 도메인을 입력하여 서버에 접속할 수 있게 되었다. 하지만 브라우저의 주소창을 보면 다음과 같이 "주의 요함"이라는 경고 메시지가 표시됨

이러한 경고메시지가 보이는 이유는 https://pybo.kr 이 아닌 http://pybo.kr 처럼 https가 아닌 http 프로토콜을 사용했기 때문이다. 브라우저는 HTTPS가 아닌 HTTP 사용시 항상 이러한 경고 메시지를 보여준다.

HTTPS가 필요한 이유

HTTPS가 아닌 HTTP 프로토콜을 사용하면 브라우저(클아이언트)와 SBB 서비스(서버) 사이에 주고 받는 데이터가 암호화 되지 않는다. 클라이언트와 서버가 데이터를 주고 받는 네트워크 경로는 매우 복잡한데 이 과정에서 누군가가 데이터를 훔쳐보는 일은 어렵지 않다. 따라서 네트워크 구간에서 주고받는 데이터는 반드시 암호화 하여 데이터가 노출되더라도 무슨 내용인지 알 수 없게 해야 한다.

이러한 역할을 하는 것이 바로 HTTP에 SSL(Secured Socket Layer) 기능을 더한 HTTPS 프로토콜이다. 우리가 만든 SBB 서비스에 HTTTPS 프로토콜을 제공하기 위해서는 SSL 인증서가 필요하다.
SSL 인증서를 발급받아 Nginx에 적용하면 HTTPS 프로토콜로 서비스를 할수 있다.

profile
Just do it

0개의 댓글