개요

리버스 프록시를 이해하고, nginx 를 이용한 무중단 배포를 이해하기 위한 글.

 

 

무중단 배포란?

서비스를 정지시키지 않고 배포를 하는 것. ( = 무중단배포 )

 

 

무중단 배포를 위한 구조

  • 서버 가장 앞단에는 nginx 는 80(http), 443(https) 포트 할당
  • 그리고 nginx 뒷단에는 부트 서버가 두 개가 띄어진 상황 (8081 및 8082 포트)

 Client → [ nginx → boot(8081), boot(8082) ]

 

빨간색 괄호로 묶여진 부분이 서버 내에 구성된 구조이다. 

 

 

운영과정

  • 클라이언트는 서비스의 주소로 접근 (80 또는 443포트)
  • nginx 에서 클라이언트의 요청을 받아 현재 연결된 스프링부트로 요청을 전달.
    • 이 때, nginx 는 8081 포트로만 해당 요청을 보내준다.
    • 8082 포트에는 해당 요청을 보내지 않는다.
  • 만약, 신규적으로 배포가 필요하다고 하면 현재 클라이언트의 요청이 가지않는 8082 포트에 배포를 수행하고 버전을 업데이트 한다. 이 때, 배포하는 그 순간에도 서비스는 끝나지 않는다. 이후에 nginx reload 를 통해 현재 웹서버가 8082 포트를 바라볼 수 있도록 해준다.
  • nginx reload 는 1초 이내에 실행 및 완료가 된다.
  • 만약에 새로운 신규버전의 배포가 필요하다고 한다면, 이번에는 8081 포트를 가진 곳에 배포를 실시한다. 왜냐하면 8082 가 모든 클라이언트의 요청을 받고있기 때문이다.

 

리버스 프록시

위의 운영과정에서 말했던 nginx 를 리버스 프록시라고 지칭한다. 리버스 프록시란, 클라이언트가 example.com 웹서비스에 데이터를 요청하면 외부의 요청을 내부의 서버에 요청한다. 이후 해당 반환 값을 받은 후 다시 데이터를 클라이언트에게 전달하는 역할을 맡고 있다.

 

내부 서버가 직접적인 서비스를 제공하여도 무방하지만, 이렇게 하는 이유는 보안적인 이슈가 크다. 보통 기업의 네트워크 환경은 DMZ 라고 하는 내부 네트워크와 외부 네트워크 사이에 위치하는 구간이 존재한다. 웹서버가 DB 서버와 연결되어 있기 때문에 최전방에 웹서버를 두고, 웹서버가 해킹당하면 디비서버까지 해킹당할 수 있기때문에 실제 서버는 내부망에 위치시키고 프록시 서버만 내부에 있는 서비스 서버와 통신할 수 있도록 하는 것이다.

 

리버스 프록시는 클라이언트의 엔드포인트가 프록시서버까지로 한정되어 있다.

 

 

PM2

PM2 는 Process Manager 의 약자로, 노드 프로세스를 관리해주는 역할을 한다.

 

일반적으로 서버에 데몬 형태의 application 을 개발하게 되면, 신경쓸 것이 많다고 한다.

  • application 에서 남기는 로그 처리
  • application 이 죽었을 때 처리
  • 리눅스 서버 부팅 시 처리 
  • ETC

위의 신경쓸것들이 많은 작업을 한번에 처리해주는 프로세스가 필요해서 PM2 가 나왔다. 설치는 아래의 명령어를 이용한다. -g 옵션은 어느 디렉토리에서나 글로벌하게 pm2 명령어를 사용할 수 있음을 나타낸다.

sudo npm install -g pm2

 

nginx 설치

 

sudo agt-get update && sudo apt-get install nginx
  • 위의 내용을 치게되면 엔진엑스를 설치할 수 있다. 이후에 ifconfig (linux) 상에서 현재 본인 컴퓨터의 ip 주소를 파악하여 브라우저로 접근하면 엔진엑스 초기 화면이 나타난다.
  • nginx 프록시 서버 만들기 ( /etc/nginx 이동 )
    • /etc/nginx
      nginx 를 설정하는 디렉토리. 모든 설정은 해당 디렉토리 내에서 한다.
    • /etc/nginx/nginx.conf
      nginx 메인 설정 파일로 nginx 의 글로벌 설정을 수정할 수 있다.
    • /etc/nginx/sites-available
      프록시 설정 및 어떻게 요청을 처리하는지에 대해 설정할 수 있다.
    • /etc/nginx/sites-enabled
      sites-available 디렉토리에서 연결된 파일들이 존재하는 곳이다. 여기서 디렉토리와 연결되어 있어야만 nginx 가 프록시가 설정을 적용한다.
server {
	listen 80;
    server_name XXX.XXX.XXX.XXX;
    location / {
    	proxy_pass http://127.0.0.1:3000;
    }
}

 

위의 내용으로 XXX.XXX.XXX.XXX IP의 80 포트로 들어오는 클라이언트 요청에 대해서 proxy_pass 설정으로 현재 실행되는 서버로 프록시하겠다는 의미이다. 그래서 80 포트로 들어와서 3000 포트로 클라이언트의 요청이 넘어간다.

 

reference

https://velog.io/@jeff0720/2018-11-18-2111-%EC%9E%91%EC%84%B1%EB%90%A8-iojomvsf0n

https://jojoldu.tistory.com/267

https://www.lesstif.com/pages/viewpage.action?pageId=21430345

https://itdexter.tistory.com/304

https://jybaek.tistory.com/716

Posted by doubler
,