들어가며

Photo by Vladislav Klapin on Unsplash

서버에 뭐라도 올려놔야 서버가 잘 작동하는지 알 수 있으니 테스트 프로젝트를 하나 올리기로 한다.

테스트 프로젝트를 올리는 것도 잘 정리해놔야 나중에 신생 프로젝트를 올릴 때 도움이 될 것이다.

코드를 서버에 직접 작성하기보다는 Github을 이용해서 확장성을 높인다.

 

프로젝트 만들기

node.js로 간단한 Hello World 프로젝트를 작성한다.

node가 설치되어 있지 않다면 nvm을 이용해 설치하도록 한다. 여기서는 작성일 기준 최신 버전인 18.2.0 버전을 사용했다.

$ node -v
v18.2.0
$ npm init

npm init 명령어를 이용해 node 프로젝트에 필요한 package.json을 생성한다. 생성 과정에서 입력한 파일 명(기본 index.js)을 기억해야 한다.

 

express 서버 생성하기

웹 서버를 만들기 위해 express를 이용한다. 우선 express를 설치한다. - [1]

$ npm i express

위 명령어를 이용해 express를 설치할 수 있다. i는 install의 줄임말이며, --save를 생략하더라도 저장된다.

이제 express starter를 참고하여 index.js에 Hello World 예제를 작성한다. - [2]

const express = require('express');
const app = express();
const port = 3000;

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

app.listen(port, () => {
  console.log(`Example app listening on port ${port}`);
})

3000 포트에서 루트에 요청이 들어오면 Hello World!를 반환하는 예제이다.

다음 명령어를 이용하여 서버를 실행해볼 수 있다.

$ node index.js
Example app listening on port 3000

실행중인 서버는 localhost:3000으로 접속해서 확인해 볼 수 있다.

 

추가로 Git 세팅 전에 빌드 파일들을 제외하기 위해 .gitignore파일을 생성한다.

node_modules/

위와 같이 작성하면 node_modules 폴더를 git에서 추적하지 않는다.

 

Github 연결하기

코드를 만들었으니 Github에 연결할 차례다. 다른 git 서비스들을 사용할 수도 있다.

 

GitHub: Where the world builds software

GitHub is where over 83 million developers shape the future of software, together. Contribute to the open source community, manage your Git repositories, review code like a pro, track bugs and feat...

github.com

Github에 로그인해서 레포지토리를 생성한다.

아무것도 없이 레포지토리를 생성하면 새 깃을 설정하는 방법이 나온다. 참고해서 명령어를 입력한다.

$ git init
$ git add .
$ git commit -m "first commit"
$ git branch -M main
$ git remote add origin git@github.com:xivnick/node-hello-world.git
$ git push -u origin main

위 명령어를 순차적으로 입력하면 모든 파일을 추가해서 커밋하고, 커밋한 내용을 origin에 Push 할 수 있다.

 

서버에 Git 연결하기

이제 github에 업로드한 코드들을 서버에서 다운받아야 한다. 저번 글에서처럼 ssh를 이용해 서버에 접속한다.

$ ssh <username>@<server-ip>
<username>@<server-ip>'s password: <password>

저번 게시글을 따라 user를 생성했다면 user home에 위치해 있을 것이다. 여기서 프로젝트마다 폴더를 만들어 관리하도록 한다.

이제 git에서 클론하려고하면.. git이 없다고 뜬다. 서버에도 git을 설치해준다.

$ sudo yum install git

추가로 ssh 연결을 위해서는 ssh 설정을 해주어야 한다. (http로 연결할 것이라면 넘어가도 좋다.)

아래 명령어를 통해 개인키-공개키 쌍을 만든 후 공개키를 복사한다. - [3]

$ ssh-keygen -t ed25519 -C "sample@email.com"
$ cat ~/.ssh/id_ed25519.pub

이때 sample@email.com 부분을 본인의 이메일로 설정하면 된다. 생성 시에 비밀번호를 물어보는데, 비워둘 수도 있고 적당한 비밀번호를 설정할 수도 있다.

복사한 공개키를 github에 등록한다.

github : settings - ssh keys - add new

원하는 이름을 입력하고 key 부분에 공개키를 붙여 넣은 뒤 add ssh key버튼을 이용하여 등록한다.

이제 git clone을 할 준비가 완료되었다.

$ git clone git@github.com:<username>/<repository-name>.git

위 명령어를 통해 git clone을 진행한다. git 주소는 github에서 복사해오면 된다.

$ cd <repository-name>
$ ls
index.js  package.json  package-lock.json

파일이 잘 복사된 것을 확인할 수 있다.

 

서버에 node 설치 및 실행

서버에는 node가 없기 때문에 nvm을 이용해 설치해 준다. nvm을 설치하고, node를 설치한다. - [4]

$ wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.2/install.sh | bash
$ source ~/.bashrc

$ nvm install 18.2.0
$ node -v
v18.2.0

로컬과 맞추기 위해 18.2.0 버전을 설치했다. node -v를 통해 확인해준다.

$ npm install
$ node index.js
Example app listening on port 3000

npm install으로 필요한 모듈을 설치하고 로컬에서와 같이 node index.js를 실행하면 서버가 실행된다. - 하지만 접속되지는 않는다. CentOS가 방화벽으로 막아놓았기 때문이다.

 

방화벽에서 포트 허용하기

firewall-cmd를 이용하여 방화벽에 3000포트를 열어준다. - [5]

$ sudo firewall-cmd --permanent --add-port=3000/tcp
$ sudo firewall-cmd --reload

reload를 이용해 재시작해주면 설정이 적용된다. 다시 서버를 실행해본다.

$ node index.js
Example app listening on port 3000

이제 <server-ip>:3000으로 접속하면 Hello World! 페이지를 볼 수 있다.

 

서비스 등록하기

위처럼 node를 실행하면 연결을 끊었을 때 서버도 종료되게 된다. 항시 연결을 유지하고 있을 수는 없으므로 백그라운드에서 실행할 방법이 필요하다. nohup이나 pm2등의 방법이 있지만, 여기서는 system service를 이용해 실행하려고 한다.

$ which node
~/.nvm/versions/node/v18.2.0/bin/node

첫 번째로, 사용하는 노드의 위치를 확인한다. nvm으로 설치하였기 때문에 위와 같이 위치하고 있다.

위 정보를 활용하여 node-hello-world.service 파일을 작성한다.

[Unit]
Description=Node.js Hello World App

[Service]
ExecStart=/home/xivnick/.nvm/versions/node/v18.2.0/bin/node index.js
Restart=always
User=xivnick
WorkingDirectory=/home/xivnick/node-hello-world/

[Install]
WantedBy=multi-user.target

위 서비스로는 User가 WorkingDirectory에서 ExecStart를 실행하는 것과 같은 효과를 준다.

만든 서비스 파일을 systemctl에 등록한다.

$ sudo systemctl link /home/xivnick/node-hello-world.service

 

CentOS에는 SELinux가 켜져 있어서 보안적으로 막혀있는 파일들이 있어 에러가 난다.

아래 명령어를 이용해 SELinux를 종료해 준다. - [7]

$ sudo setenforce 0

이제 start를 이용하여 백그라운드에서 실행할 수 있다.

$ sudo systemctl start node-hello-world

이제 터미널을 종료해도 서버가 돌아가게 된다.

 

Reference

[1] https://expressjs.com/ko/starter/installing.html

[2] https://expressjs.com/ko/starter/hello-world.html

[3] https://www.lainyzine.com/ko/article/creating-ssh-key-for-github/

[4] https://firework-ham.tistory.com/35

[5] https://uxgjs.tistory.com/162

[6] https://fred16157.github.io/node.js/nodejs-linux-add-systemd-service/

[7] https://www.oss.kr/info_install/show/b0d63b55-ec8f-4038-bf38-3d9602f062b1

+ Recent posts