[Daily Contents] 공통 프로젝트 배포


학습 목표

AWS 배포를 위해 필요한 구조를 학습해본다.
웹서버를 운영하기 위한 기술 스택들을 알아본다.
자주 하는 실수에 대해서 알아본다.
배운 것들을 우리 팀 서버 배포 시에 활용해 본다.

배포 구조

** 브라우저로부터 요청이 들어옴 -> NginX가 받음 -> 요청이 FE와 BE로 나누어져 감 **

  • 80(http) or 443(https) 포트로 요청
  • /와 /api 로 나누어져 감
  • Docker 사용. FE의 정적인 파일들은 Nginix를 넣어주기도 함. -V(볼륨) 사용.

NGINX

High performance load balancer, web server, API gateway & reverse proxy
비동기 방식이기 때문에 매우 높은 성능
정적인 파일(주로 프론트엔드 파일들)을 서비스할 때 뛰어난 성능(vs 톰캣)
load balancer나 API gateway 용도로도 사용 가능
DDOS 공격 방어도 가능

FE와 BE의 분기

/로 들어오는 모든 연결은 FE로
/api 들어오는 요청은 BE로
Webserver로서의 역할
API gateway로서의 역할
Q. API 분기는 내부에서도 API 분기로만 가야 하는가?
A. 선택. /api로 써도 되고, rewrite 기능을 사용하여 재설정도 가능.

CORS

FE BE 각각 naver.com:8080 naver.com:3000 이렇게 하면 안 되는가?
-> 오류 발생

- Cross-Origin Resource Sharing(CORS)
- 도메인(naver -> google), 포트(3000 -> 8080), 프로토콜(http, https)이 다를 때 발생
- NGINX의 설정을 기억해 보자
- https://domain-a.com의 FE JS 코드가 XMLHttpRequest를 사용하여 https://domain-b.com/data.json을 요청하는 경우

우리는 왜 도커를 쓰는가?

빠르게 필요한 서버를 증설할 수 있다.
기존에는 VM을 증설하는 방식을 사용 -> VM이 부팅되는 1분이면 서비스 전체가 중지되기에 충분한 시간
운영체제를 부팅해야 하는 기존의 방식보다 빠름
이미지를 만들어두면 찍어내기만 하면 되는 배포의 편의성(w/k8s(쿠버네티스)) -> 버전을 잘못 설치해서 발생하는 문제 해결

어디까지 도커화 해야 할까?

- FE/BE는 필수적
- 배포의 효율성/편의성을 생각해보자
- DB/Jenkins/Nginx는 선택적
(선택) DB를 이미지화해서 새로 배포할 일이 많이 있을까? 옮긴다면 데이터는?
(선택) 빌드 서버를 병렬적으로 추가 증설하는 경우는?

임의의 포트를 쓰면 안 되는 이유?

놀랍게도 멀티캠퍼스에서는 투썸플레이스를 들어갈 수 없다! -> 커피 쿠폰이 스타벅스인 이유? ㅋㅋ
ISP(SKT, KT, LGU 등등)에 따라서 닫혀있는 포트가 존재

** 장소에 따라 되고 안 되고 바뀌는 서비스라면? **
** 고객은 그냥 이탈해 버림… **

Gitlab -> Jenkins

개발자가 Gitlab의 특정 브랜치에 머지를 하면 이벤트가 트리거되어 Jenkins에서 빌드를 시작
빌드가 완료되면 도커 이미지가 제작되어 배포
동일한 도커 이미지로 제작, 배포되기 때문에 동일성(서버)가 보장

SSL( -> TLS)

- 회원 가입 시에 비밀 번호 등의 개인 정보가 전송되고, 수시로 유출되어서는 안 되는 정보들이 오가기 때문에 암호화가 필요
- 매번 데이터를 암호화해서 전송하기 어렵기 때문에 TLS(Transport Layer Security)를 사용
- 이론적으로는 TLS을 활용한 통신은 안전하다고 볼 수 있다.
- WebRTC를 위해서는 SSL 인증서 설치가 필요!!

Cert Bot

- https 확산을 위해서 시작된 비영리 프로젝트(Let's encrypt)
- 상용 프로그램을 제작할 때는 보통 신뢰할 수 있는 ROOT 인증서 발급자로부터 SSL 인증서를 구매해서 사용
- SSAFY 프로젝트의 경우에는 Cert Bot을 이용해서 무료 인증서를 발급받아 사용하면 좋음
- Cert Bot은 Nginx에 자동으로 설정을 추가해 준다!!

사용자 계정 만들기

- 각 프로그램들을 실행할 때는 프로그램에 맞는 권한을 가진 사용자 계정을 만들어서 실행
- Ubuntu 계정이나 심지어 Root 계정으로 실행(sudo)하는 경우에는 해커의 공격 명령이 그 계정의 권한으로 실행되기 때문에 매우 위험
- 사용자 계정으로 실행하는 경우 해커의 공격을 받더라도 피해를 최소화할 수 있음

댓글남기기