들어가며

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

들어가며

Photo by Wilhelm Gunkel on Unsplash

초기화를 몇 번째 하는지 모르겠다. 그런데 원래 공부는 이름 쌓기처럼 A-AB-ABC-ABCD-... 순서로 해야 하는 걸지도 모른다.

그래서 다시 시작하는 A 파트는 초기화 및 기본 세팅입니다.

 

VULTR 서버 초기화

서버는 VULTR 서비스를 사용한다.

 

SSD VPS Servers, Cloud Servers and Cloud Hosting by Vultr

Vultr Global Cloud Hosting - Brilliantly Fast SSD VPS Cloud Servers. 100% KVM Virtualization

www.vultr.com

회사에서는 주로 AWS를 사용하는 만큼 AWS와 VULTR 중 고민을 많이 했는데, 좀 더 순수한 서버를 하나 다뤄보는 것이 나을 것 같아 VULTR를 계속 사용하기로 했다.

1 vCPU, 1GB Memory, 25GB SSD 옵션의 서버에 CentOS9를 얹어 사용하고 있다.

* 수정 : certbot 설치를 위해 CentOS8로 변경하였다.

 

서버 호스트명 변경

개인 서버로 쓰기 위해서 기존에 사용하던 호스트명을 xiv-server로 변경하기로 했다.

서버 호스트명을 바꾸면 Reinstall도 자동으로 진행되니 따로 초기화할 필요는 없어 보인다.

VULTR : Settings - Change Hostname

변경할 Hostname을 입력하고 Reinstall 버튼을 누르면 경고문이 뜨고, 동의 후 진행하면 재설치가 진행된다.

VULTR 내의 서버 라벨이 바뀌지는 않기 때문에 서버 라벨을 눌러 라벨도 변경해 주었다.

 

서버 접속 및 SSH 설정

VULTR에서 콘솔 창을 제공하긴 하지만 Terminal 상에서 작업하는 것이 편하기 때문에 ssh 설정을 해준다.

VULTR : Overview

Overview 화면에서 IP주소와 username, password를 확인할 수 있다. 아마 username은 root일 것이다.

터미널에 아래 명령어를 입력하여 접속해 준다.

$ ssh root@<Server-IP>
root@<Server-IP>'s password: <password>

비밀번호를 입력하라고 하면 Overview화면에서 복사해온 password를 이용한다.

 

Trouble Shooting : 

여기서 나는 기존에 있던 서버에 연결했던 기록이 남아 있어 RSA 공유키 충돌이 일어나 Warning이 발생했다.

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!

아래 코드를 이용하여 기존에 있던 기록을 초기화할 수 있다 - [1]

$ ssh-keygen -R <Server-IP>

이후 다시 접속해보면 정상적으로 접속되는 것을 확인할 수 있다.

 

관리자 계정 생성

root를 그대로 사용하는 것은 비밀번호를 외우기도 어려울 뿐더러 보안적인 문제가 발생할 수 있다.

서버 관리에 사용할 새 계정을 생성한다.

# useradd <username>
# passwd <username>
Changing password for user <username>.
New password: <password>
Retype new password: <password>

위 명령어를 이용해 새로운 계정을 생성하고 비밀번호를 설정한다. - [2]

 

관리자 그룹 등록

생성한 계정을 관리자로 등록해야 sudo를 사용할 수 있다.

visudo로 직접 관리자 등록을 해 주는 방법과, 관리자 그룹인 wheel에 추가하는 방법이 있는데 여기서는 후자를 이용한다.

# usermod -a -G wheel <username>

위 명령어로 해당 계정을 관리자 그룹에 추가할 수 있다. - [3]

 

SSH 접속 테스트

생성한 관리자 계정으로 SSH 접속을 테스트해보자.

Ctrl + D를 눌러 연결을 끊거나 새로운 Terminal 창을 열어 다시 연결한다.

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

정상적으로 연결되는 것을 확인할 수 있다.

 

Reference

[1] https://cpuu.postype.com/post/30065

[2] https://ksr930.tistory.com/119

[3] https://jjig810906.tistory.com/61

들어가며

Photo by  Aubrey Odom-Mabey  on  Unsplash

내 서버 마련의 꿈 카테고리를 신설했다. 사실 별건 아니고 그냥 개인 서버 관리하는 글을 게시할 공간이다.

기본 설정 하는 부분들을 기록하여 추후에 찾아볼 수 있도록 하려고 한다.

 

P.S. 언젠가는 다들 자기 집이나 자기 PC처럼 자기 서버를 하나씩 가지게 되지 않을까?

 

 

+ Recent posts