어떻게 배포했는지 코드나 명령어를 알고 싶으시면 2장으로 가주세용!
https://velog.io/@ks0689/nginx2
최근에 캡스톤 프로젝트를 진행했다. 음 어떤 프로젝트를 했는지는 나중에 따로 작성하겠다.
일단 AWS를 이용했다. 도메인 have-bin.com을 구매하고....
EC2는 T2.Medium, 로드벨런서를 이용해 Https, 3000포트(리엑트), 8080포트(Spring), 5000포트(플라스크)를 설정해주고 배포를 했었지만.....
가격이 장난아니였다.
14일에 결제한게 도메인 구매 -> 이건 이해하는데
3일에 결제한 사용비용이 장난 아니였다.
이게 한달치 비용이 아니라 캡스톤 발표할 때 사용할려고 한 2주인가 열어놓은건데 가격이 저러네;;;
(7/2은 내가 깜박하고 로드벨런서랑 Route53을 안껐더니....)
물론 한달 다 사용하면 한 8만원정도 나올거같은데 대학생이고 소득이 없는 나에게는 큰 돈이였다
그래서! 그냥 켜놓고 싶어서 홈서버를 구성했다.
그냥 당근에서 이런 구형 노트북 구매를 일단 했다.
CPU: i5 M560
GPU: 뭐였지...
RAM: DDR3 4GB
배터리는 폭발 위험이 있어서 빼고 그냥 AC를 연결해줬다.
그래서! 지금부터 어떻게 배포를 설정해놨는지 포스팅할려고 한다.
일단 원래 배포는 어렇게 되어있다.
그냥 간단하게 모든 서버나 파일들을 EC2 인스턴스에 올려놓고 바로 실행되게 해놨다.
현재 당근에서 구매한 노트북에 OS는 Ubuntu Server CLI만 설치해놓은 상태다.
CPU도 너무 구형이고, RAM은 적고, HDD 320GB를 박혀있는 상태다.
뭐... 이게 서버 돌리기에는 무리가 있는 사양은 아니다. T2 Medium 인스턴스 보다는 넉넉하다.
엥? 그럼 그냥 전에처럼 똑같이 돌리면 되는거 아니야...?
뭔 시스템 아키텍처를 바꿀 정도로 이렇게 난리 부루스를 하는거야!
자 문제는 Https다. AWS에 올려놨을때는 거기서 인증서를 받고
이걸 80번 포트로 들어올때는 443으로 Redirect하게 설정해놓으면 된다.
근데 홈서버로 하면 ELB가 안된다 ㅠㅠㅠㅠㅠㅠㅠ
그래서 알아본게 Nginx다.
NGINX는 https 인증서를 받고, 리다이렉트하게 할 수 있는 방식이 있다. (무료)!
Web Server
웹 서버는 클라이언트 요청에 따라 HTML, CSS, JS 이미지 파일과 같은 정적 파일을 응답하여 제공하는 SW다.
당연히 HTTP 프로토콜을 사용하여 클라이언트랑 통신한다.
대표적인 서버로는 Nginx, Apache 등이 있다.
정확한 개념을 처음 알았다. 전에는 리엑트는 npm run start 해서 리엑트 오픈하고, java -jar "파일명.jar" 으로 스프링 오픈하고... 이런식으로 진행했다.
근데 이건!
WAS (Web Application Server)
WAS는 클라이언트 요청에 대해 동적인 처리를 담당하는 영역이다.
웹 서버랑 달리 애플리케이션 로직을 실행할 수 있도록 구성되어 있다.
예) 로그인, 회원가입, 인공지능 이용하기 등등
WAS다. 스프링은 Tomcat으로 리엑트는 Node.js로 작동이 된다.
근데 우린 보통 그냥 WAS나 Web Server 다 그냥 서버라고 한번에 부른다.
그럼 왜 Web server가 필요할까.....?
이유가 여러가지가 있는데...
1. 캐싱 및 압축
웹 서버는 정적 리소스에 대한 요청을 캐시하고 압축하여 서비스 속도를 높이고 네트워크 대역폭 사용을 줄일 수 있다.
2. 로드 밸런싱
AWS에서는 로드 밸런스(ELB)를 설정할 수 있다. 지금부터 로드 밸런싱을 LB라고 부르겠다.
LB의 본래 목적은 서버에 가해지는 부하(=LOAD)를 분산(=Balance) 해주는 역할이다.
위 사진처럼 갑자기 접속자가 폭주하면 저렇게 분산시키기 위해 설정하는 것인데...
예를 들면 Spring Boot을 8080포트에 한개, 8081에 한개 이렇게 켜놓고 반반씩 분산하면 한 프로세스에 부담은 반이 된다.
물론 이렇게 사용을 해도 되지만, 다른 방식으로 필자처럼 3000포트에 React, 8080에 Spring Boot, 5000에 FLASK 이런 용도로 사용해도 된다.
이걸 WAS에서 지원해준다. Https를 설정할려면 로드밸런싱이 필수다.
3. 보안
웹서버는 리버스 프록시 또는 DMZ 역할을 하여 외부와 내부 네트워크를 격리 시킬 수 있다.
(바보같은 난 이걸 나중에 알았고, 몇시간 동안 삽질을 했다. 멍청한 놈....)
무슨 소리인지는 아키텍처에서 설명을 해주겠다.
자 그래서, 프로젝트를 새롭게 구성했다!
사용자가 80(http)로 접속하게 되면 443(https)로 Redirect 하게 된다.
https로 정상 접속하게 되면, NGINX 서버가 빌드된 리엑트를 보여준다. (443 로드벨런스)
리엑트는 Axios로 데이터를 요청하게 되면 "내도메인/api/~" 를 붙인 주소로 요청하게 된다.
NGINX 설정에 /api를 통해 접속하게 되면 localhost:8080 으로 접속되게 해놨다. (8080 로드벨런스)
하... 그래서 내가 삽질을 몇시간이나 한게...
지금 구성도를 보면 NGINX가 서버를 만들어놨다.
그러니까 NGINX 안에 들어가야만 저 스프링 서버를 접속할 수 있다는 소리인데, NGINX를 구성을 다 해놓고 내가 내도메인:8080으로 접속할려고 하니까 자꾸 안되어서 난 내가 구성을 잘못 해놓은줄 알았다.
이게 아까 위에서 말한 3. 보안 항목이다.
외부에서 직접 다이렉트로 Spring 서버에 접속이 안돼 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
나도 접속을 못하자나....ㅋㅋㅋㅋㅋㅋㅋㅋㅋ
물론 아예 못들어가는건 아니다. 도커의 8080 포트와 내 당근 노트북의 8080 포트를 포트포워딩 해주면 http 방식으로 접속이 가능하다.
다음 글에서는 어떻게 설정하고, 뭘 적었는지 자세하게 포스트 하겠다.