EC2 NGINX PM2 [devops 1]

moongq·2021년 1월 14일
0
post-thumbnail

#devops
NOW: 1. 아주 기초적인 배포해보기: EC2 NGINX PM2
2. NGINX와 PM2를 좀더 봐보죠.
2. 배포를 자동화시켜보죠. CICD "github action"
3. 배포를 또 자동화시켜보죠. "jenkins"


"배포를 해봅시다. 정말 최소한의 코드로 말이죠."

Node.js 서버를 배포할 때의 기본적인 세트로 보통 NGINX와 PM2를 붙입니다. 붙이는 이유는 아주 간단히 설명 드린다면,
NGINX는 "reverse proxy를 위해"
PM2는 "multi process를 위해"입니다.

reverse proxy
를 이용하면 사용자/클라이언트의 요청을 node 서버가 직접 받지 않고 NGINX에서 대신 받게 됩니다. (proxy의 뜻이 "대신"입니다.) proxy를 이용하는 이유는 대표적으로 보안과 캐시입니다.
1. 보안: 사용자가 직접적을 서버에 접근하면 위험에 너무 쉽게 노출되는 것이므로 한단계의 보안 계층을 두면 보안이 한결 나아지죠.
2. 캐시: proxy 서버는 사용자 요청을 저장해둡니다. 같은 결과를 주는 요청에 대해 여러번이나 모든 과정을 거치지 않아도 되므로 속도가 빨라집니다.

multi process
노드를 이용하시면 맨날 듣고 보게 되는 것이 아마 "노드는 싱글스래드이다" 이말 일 것입니다. 그것을 극복하기 위해(복수개의 core를 사용하기 위해) 이용합니다. Node.js 자체적으로도 cluster module를 통해 멀티 코어를 이용할 수도 있지만 pm2가 더 편하다고 합니다.


이제 바로 배포를 해봅시다. EC2에 배포할 것이고 과정은 이렇습니다.
1. 아주 기본적인 hello world 서버를 준비합시다.
2. EC2 instance를 만듭니다. 그리고 연결합니다.
3. hello world 서버를 가져옵니다.
4. nginx를 설치하고 기초적인 구성을 합시다.
5. pm2를 설치하고 기초적인 구성을 합시다.

1. hello world 서버를 준비합시다.

https://github.com/moongq/start_express
위 링크에 아주아주아주~ 기초적인 express 서버를 만들어뒀으니 ec2에서 clone하시면 됩니다.

2. EC2인스턴스를 만듭시다.


인스턴스를 클릭하시고


특별히 20.04 를 고른 이유는 없습니다. amazon linux를 안써봐서 골랐습니다.


프리티어로 선택하시고.


보안 그룹을 설정하셔야 합니다.


SSH는 우리가 EC2에 접근하기 위한 포트입니다.
HTTP 프로토콜을 이용할 것이므로 당연히 추가해주시고.
HTTPS도 쓸수 있으니 추가합니다.
그리고 3000 포트는 node.js 서버의 포트 번호입니다.
아주 기초적이죠 !


키를 생성하시고 잘 보관하셔야 합니다. 키 페어가 없으면 인스턴스에 접근이 불가능해집니다.!

잠시 기다리시면 인스턴스가 초기화됩니다.
다시 인스턴스 처음 화면으로 돌아가시면 생성된걸 보실수 있습니다.
인스턴스 ID를 클릭해서 들어갑니다.

들어오면 아래 화면이 나옵니다.

연결을 클릭하세요.

그리고 SSH 클라이언트로 가시면 EC2 접근 방법이 나옵니다. 같이 해보죠.

  1. 아까 만든 키페어가 있는 곳으로 가야합니다.
    cmd에서 키가 있는 곳으로 가보죠. 제 키 이름은 "q_private"로 지었습니다.

키가 있는 위치로 가셨으면 인스턴스 연결 화면의 4번 설명대로 명령어를 입력하세요. 제 경우에는
ssh -i "q_private.pem" ubuntu@ec2-54-180-94-58.ap-northeast-2.compute.amazonaws.com를 입력하라고 하네요

입력하고 yes를 입력하세요.

그러면 cmd가 바뀝니다.!


이렇게 말이죠. EC2에 연결된 것입니다!

남의 컴퓨터에 연결된것입니다. ! 이제 이 남의 컴퓨터에 node 서버를 옮기고, 몇가지 구성을 한뒤 작동시키면 됩니다 !

3. hello world 서버를 가져옵니다.

EC2에 들어왔으니 업데이트를 한번 해줍시다.
sudo apt-get update를 입력하세요.

그다음 nvm을 깝시다.
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.1/install.sh | bash
을 입력합니다.

nvm이 깔렸는지 확인해봅시다.

nvm not found가 나온다면

exit 한뒤 다시 ec2에 접속하면 깔려있을 것입니다.

nvm이 깔려있다면 node를 다운 받습니다.

node가 다운되었고.

4. nginx를 설치하고 기초적인 구성을 합시다.

이번엔 nginx를 설치합니다.

잘깔렸는지 확인해봅니다.

잘깔렸죠!

다음은 root 디렉토리로 이동할 것입니다. nginx가 설치된 곳입니다.

cd /etc/nginx/ 를 입력하여 이동합니다.

그런뒤
sudo service nginx start
를 입력하여 nginx를 실행합니다.!


퍼블릭 주소를 브라우저에 입력해보세요 !

!!

이 화면이 나온다면 nginx가 잘 실행되고 있다는 것입니다 !

다음으로는 cd /etc/nginx/sites-available을 입력하여 이동합니다.

sudo vim 원하는이름 // ex_ sudo vim q_reverse_proxy
를 입력하여 아래 코드대로 입력해주세요

server {
	listem 80;
    
    location / {
    	proxy_pass http://127.0.0.1:3000/;
	}
}

:wq를 입력하면 저장 후 나가집니다.

다음은 cd /etc/nginx/sites-enabled를 입력합니다.
이동 한뒤

sudo ln -s ../sites-available/파일이름(sites-available에 만들어놓은 파일) 심볼릭 링크이름
// ex) sudo ln -s ../sites-available/q_reverse_proxy slb_q

입력해주세요.

프로젝트 가져오기.

root 디렉토리로 이동합니다.
파일 구조 맨 밑까지 내려간다음에 ls를 치시면 root이 보이실 겁니다.
cd root

제경우에는 -bash: cd: root: Permission denied가 나오네요.
로그인이 안되어 있어서 나타나는 현상입니다.

로그인이 되면 cmd 맨 앞이 바뀐걸 확인하실수 있습니다.
ubuntu2ip-172-31-37-236 에서 root@ip-172-31-37-236:/#으로 바뀌었네요.

이것도 안먹히면,

password를 초기화하고 다시 해보세요. 위 이미지 처럼 해보시면 될겁니다.

root 디렉토리로 이동한후 node 프로젝트를 clone합니다.

제 깃헙에서 가져오시면 됩니다. clone이 되면 다운 받은 파일로 이동하신뒤
cd start_express

npm install 을 입력하셔서 프로젝트의 의존성을 다운받습니다.

제 경우에는 npm이 작동안해서 다시 다운로드를 해서 진행했습니다.


npm install이 완료되었습니다.

제 아주 기초적인 hello world 노드 프로젝트입니다.

// index.js
const express = require('express')
const app = express()
const port = 3000

app.get('/1', (req, res) => {
  res.send('Hello World!')
})

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`)
})

5. pm2를 설치하고 기초적인 구성을 합시다.


추가적으로 포트를 설정해주시고.
export PORT=3000

pm2 start index.js를 입력하시면 프로젝트가 실행됩니다.

다시 퍼블릭 ip로 입력하시면 프로젝트에 접근할수 있습니다.

nvm install 10.16.3dmf

  1. EC2 instance를 만듭니다. 그리고 연결합니다.
  2. hello world 서버를 가져옵니다.
  3. nginx를 설치하고 기초적인 구성을 합시다.
  4. Git에서 프로젝트 가져오기.
  5. pm2를 설치하고 기초적인 구성을 합시다.
profile
https://medium.com/nodejs-server

0개의 댓글