본문 바로가기
더이상 하지 않는 Backend - NodeJS/Node-Express 개론(완)

[O'REILLY] Node & Express - 12장 : 실무 환경

by VictorMeredith 2023. 4. 5.

1. 실행 환경

- 실행환경이란 ? : 애플리케이션을 실무, 개발, 테스트 모드로 실행하는 방법.

- 개발, 실무, 테스트 세가지가 '표준' 환경이며, 스테이징, 연습환경도 만들 수는 있다.

- 익스프레스는 실행환경을 지원한다.

- app.set('env', 'production') 을 호출해서 실행 환경을 지정할 수 있지만 권장하지 않는다.

- 실행환경을 지정할 경우에는 NODE_ENV를 사용하는 것이 더 좋다.

- app.get('env')를 호출해서 현재 실행 중인 모드를 보고하게 만든다.

요로코롬 설정한다.
그러면 이렇게 development mode 라고 뜬다.

- 실무 모드로 바꾸는 방법: 터미널에 이렇게 친다.

$ export NODE_ENV=production
$ node 파일명

- node 파일명으로 서버를 실행시키면 'Express started in production mode at local:3000' 이라고 뜬다.

- 익스프레스를 실무모드로 실행하면 적합하지 않은 구성 요소에 대한 경고가 표시된다. ex) 이전에 봤던 메모리 저장소 등

 

2. 환경별 설정

- 실행 환경만 바꿔서 달라지는 건 없다. (기부니가 좀 다름)

- 실무 모드에서는 뷰 캐싱이 기본으로 활성화된다. (뷰 템플릿을 미리 메모리에 캐싱해서 I/O 코스트를 줄인다.)

- 세 가지 환경 사이의 차이를 최소화하는 것이 좋다.

 

서버에 로그 기능을 추가해보자.

- morgan 미들웨어를 사용한다(npm i morgan)

챗지피티한테 설명하랬더니 설명 자세한거 보소

- 이제 서버를 시작하고 사이트를 방문하면 콘솔에 로그가 시작된다.

- NODE_ENV를 production으로 설정하면 터미널에는 기록되지 않지만, 활동 내용이 아파치의로그 형식으로 저장된다.

- 모건에는 여러가지 옵션이 있다. 구글링 해보셈

 

3. 노드 프로세스 실행

- 현재는 계속 node 어쩌고 이렇게 서버를 실행했을건데, 앱이 충돌하거나 예기치 못한 종료 상황에서 복구할 방법이 없어서 사업이 망할 수 있다.

- 그래서 Process Manager를 사용한다.

- 호스팅의 서비스에 따라서 제공을 하기도 한다. (AWS EC2는 제공하지 않으니 그냥 배워서 쓰자)

- Forever 라는 게 있고(간단)

- PM2라는 게 있다. (국룰, 취업용)

- cf) nodemon 이라는 애도 있는데, 개발할 때 수정사항을 저장할때마다 계속 서버를 알아서 재시작 해주는 개발환경 매니저도 있다.

 

forever 사용해보자

 

설치

npm install -g forever

 

시작

forever start 서버이름.js

 

- 재시작은 start 자리에 restart, 종료는 stop을 넣으면 된다.

- 뭐 포스팅 할 껀덕지도 없다 넘어가자

 

4. 웹사이트 확장 (지루하지만 좋은 얘기들)

- 수직적확장 : 더 빠른 CPU, 더 좋은 OS, 더 많은 코어, 메모리를 사용해서 서버 자체의 성능을 올리는 것

- 수평적확장 : 서버 숫자를 졸라게 늘리는 것

- 클라우드컴퓨팅이 늘어나게 되면서, 가상화가 국룰이 된 요즘에는 수평적 확장이 가성비가 높은 선택이 되었다.

- 노드 개발에서는, 항상 수평적 확장을 염두에 둬야 한다.

- 노드는 수평적 확장을 아주 잘 지원하고, 따로 고민하지 않아도 앱에 적용하기가 쉽다.

- 웹사이트 설계에서 중요한 것은 지속성이다. 파일 기반 스토리지로 지속성을 구현하려고 한다면 그것은 언젠가 지옥의 프로젝트가 된다

- 하지만, 로그나 백업같은 읽기전용 데이터는 괜찮다. DB연결 실패에 대비해서 폼 제출 데이터를 파일에 백업하는 경우도 괜찮다.

 

5. 앱 클러스터를 통한 스케일 아웃

- 노드는 자체적으로 앱 클러스터(app cluster)라는 수평적 확장 방법을 지원한다. 

- 앱 클러스터를 사용하면 시스템에 설치된 코어(CPU) 하나마다 독립적인 서버 운영이 가능하다.

- 장점 : 서버의 성능을 최대한 끌어낼 수 있다.(가상머신도)

- 장점2 : 병렬 서버 운영상황을 최소한의 비용으로 테스트 할 수 있다.

 

클러스터 지원을 추가해보자 (내장된 cluster 모듈을 이용한다)

- 일반적으로 하나의 마스터프로세스와 여러개의 워커프로세스가 있다.

- 마스터프로세스 : 워커프로세스를 생성 및 관리하는 프로세스. 워커프로세스 간의 통신을 조정하며, 워커프로세스가 종료될 경우 필요에 따라 새 워커프로세스를 생성한다.

- 워커프로세스 : 클러스터 모듈을 사용하는 node앱에서 병렬로 실행되는 자식 프로세스. 각 워커 프로세스는 독립된 실행 환경을 가지며, 자체 메모리 공간을 사용한다. 앱 로직을 처리하고, 요청을 처리한다.

간단한 예제. 실제로는 더 복잡하다.

- 오라클의 버추얼박스같은 가상화를 사용하고 있다면, VM에서 CPU 여러 개를 사용하도록 설정한다. 기본적으로 가상 머신은 대개 CPU 하나만 사용한다.

- 다음 미들웨어를 라우트 앞단에 두어 각 요청마다 다른 워커가 요청을 처리하는 것을 확인할 수 있다.

새로고침같은 하찮은 걸로 부하를 주지 못해서 확인이 어려울 수도 있다.

 

댓글