Node.js로 가상호스트 이용하기

한 서버에서 여러 웹 서비스를 운용해야 하는 경우가 있습니다.

단순히 도메인이 여러개라서 한 도메인으로 사용자를 전달한다거나, 사용자 페이지와 백 오피스를 함께 운용할 수도 있지요.


이런 경우 Apache나 Nginx를 이용한다면 설정 파일을 이용해서 VirtualHost를 활용하곤 합니다.

만약 모든 서비스가 Node.js로 운용되고 있다면 굳이 Apache나 Nginx를 찾지 않고도 VirtualHost를 사용할 수 있습니다.



사전 준비: hosts 파일 편집

hosts 파일은 로컬에 보관하는 일종의 전화번호부입니다.

DNS 동작에서의 hosts 파일 역할에 대한 자세한 설명은 다음 링크에서 확인하실 수 있습니다: hosts 파일 - 생활코딩


hosts 파일은 아래 위치에서 찾을 수 있습니다.

- Windows: %SystemRoot%\system32\drivers\etc\hosts

(예. Windows가 C드라이브에 설치된 경우는 C:\windows\system32\drivers\etc\hosts)

- *nix: /etc/hosts


hosts 파일 하단에 아래 3줄을 추가하고 저장합니다. 이 때 관리자 권한이 필요할 수 있습니다.

아래 세 줄은 오른쪽의 도메인을 왼쪽의 IP, 즉 현재 PC, 다시 말하자면 localhost로 연결한다는 의미입니다.

127.0.0.1	e2j.jetalab.internal
127.0.0.1	mail.jetalab.internal
127.0.0.1	jetalab.internal


아래는 터미널을 이용해서 hosts 파일을 편집하는 예시입니다.


1. vim, nano 등의 에디터로 hosts 파일을 엽니다.


2. 하단에 앞서 기록된 3줄을 입력합니다.





사전 준비: 의존성

1. 아래 명령어를 입력하여 필요한 패키지를 설치합니다.

npm i --save express vhost



실습

1. 이전 예제들을 활용할 수 있도록 일부 변경합니다.

- 이전 예제들은 모두 3000 포트를 이용하도록 지정되어 있었습니다. 지정된 포트를 다른 포트로 변경하거나, 서버 실행 코드를 삭제합니다.

- 이전 예제들의 app.js 파일 하단에 아래 코드를 추가하여 모듈로 내보냅니다.

module.export = app;


2. Sample Code: 아래 코드를 app.js로 저장합니다.

const express = require('express');
const vhost = require('vhost');

const excel_to_json = require('../excel-to-json/app');
const mailer = require('../mailer/app');

const app = express();

app.use(vhost('e2j.jetalab.internal', excel_to_json));
app.use(vhost('mail.jetalab.internal', mailer));

app.use(express.static('static'));

app.use((req, res) => {
    res.status(404).send('Page Not Found!')
});

app.listen(3000, () => {
    console.log('HostManager listening on port 3000');
});

app.js:9: e2j.jetalab.internal로 접속한 경우 excel-to-json app을 연결합니다.

app.js:10: mail.jetalab.internal로 접속한 경우 mailer app을 연결합니다.

app.js:12: 이외의 요청인 경우 static 폴더의 정적 파일을 서비스합니다.

app.js:14~16: 어떤 서비스로도 처리되지 않는 경우 'Page Not Found!' 메시지를 전송합니다.



3. 터미널에서 아래 명령어를 입력하면 서버가 실행됩니다.

node app.js

excel-to-json과 mailer 서버가 실행된 것을 볼 수 있습니다.



4. http://e2j.jetalab.internal:3000 도메인으로 접속하면 excel-to-json 화면이 표시됩니다.



5. 마찬가지로 http://mail.jetalab.internal:3000 도메인으로 접속하면 메일 발송 화면이 표시됩니다.



6. http://jetalab.internal:3000 으로 접속한 경우 static 디렉토리 내부의 정적 파일을 서비스 합니다.

/static/index.html 파일을 추가하고 접속한 화면입니다.





GitHub

본 강의에 사용한 코드는 GitHub에 공개되어 있습니다.

https://github.com/jETA-Kor/examples



참고 문서

- hosts 파일 - 생활코딩: https://opentutorials.org/course/228/1457

- vhost - npm: https://www.npmjs.com/package/vhost