맥에서 macOS Server로 L2TP VPN 구축

보급형 공유기(ex. iptime)에서 제공하는 VPN은 보통 보안이 취약한 PP2P 프로토콜을 사용한다. 하지만, iOS 10 및 macOS Sierra 에서는 더이상 PP2P 프로토콜을 사용한 VPN 을 접속할 수 없게 되었다. 그렇다고 L2TP VPN 을 지원하는 공유기로 바꾸자니 아깝다. 만일 맥과 macOS Server 앱이 있다면, 손쉽게 L2TP/IPSec 을 이용한 VPN 을 구축할 수 있다.

VPN 설정하기


좌측 메뉴에서 서비스>VPN 을 선택하고, 우측 상단에서 앱을 켠다. 그리고 VPN 호스트 이름과 공유 보안을 채워 넣는다.

VPN 호스트 이름: ‘외부 접속시 사용할 주소’, IP나 DNS를 이용한다.
공유 보안: ‘외부 접속시 사용할 VPN 비밀번호’
클라이언트 주소: 외부 접속한 기기가 사용할 내부 IP
DNS 설정: VPN 에 접속한 기기가 주소검색시 사용할 DNS 서버 주소, macOS Server 앱에 있는 내부 DNS 를 이용해도 상관없다.

공유 보안 키는 특수문자와 대소문자를 포함하여 최대한 복잡하게 설정해야 한다.

VPN 설정은 이것으로 끝이다.

User 만들기


좌측 메뉴에서 계정>사용자 를 선택하고, 하단에서 + 를 누른다.
전체 이름: 안 넣어도 된다.
계정 이름(*중요): VPN 접속시 사용할 ID 이다.
이메일 주소: 생략
암호: VPN 접속시 사용할 암호이다.
확인: 위에서 넣은 암호를 한번 더 입력
홈 폴더: 단순히 VPN 에 접속하기 위한 계정을 만들고 싶은 거라면 “없음 – 서비스전용”을 선택하자. 로그인 창이 지저분해지지 않는다.

생성을 누르면, VPN 접속을 위한 계정 생성이 완료 된다.

공유기 설정

공유기에서 macOS Server 앱이 있는 맥 기기로 포트포워딩을 해준다. L2TP VPN 이 사용하는 포트는 3개이다. UDP1701, UDP500, UDP4500. 포트포워딩 방법은 공유기마다 천차만별이므로 생략한다.

iOS 에서 VPN 접속 테스트

설정한 VPN이 잘 작동하나 간단히 확인해보자.

설정(Settings) 앱에서 일반(General) > VPN 을 선택한 뒤 VPN을 추가(Add VPN Configuration…)한다.

Type : L2TP를 선택한다.
Description: iOS에서 보게 될 공유기 이름이다. 아무거나 넣어도 상관없음.
Server: ‘VPN 설정하기’에서 입력한 ‘VPN 호스트 이름’을 넣는다.
Account: ‘User 만들기’에서 입력한 ‘계정 이름’을 넣는다.
Password: ‘User 만들기’에서 입력한 ‘암호’를 넣는다.
Secret: ‘VPN 설정하기’에서 입력한 ‘공유 보안’을 넣는다.

입력을 마쳤으면 완료를 클릭하고, 연결해본다.

접속이 안될 시

어떤 공유기(ex. netis)들은 L2TP 프로토콜을 차단하는 메뉴를 갖고있다. 공유기가 L2TP 프로토콜을 이용한 VPN 서버를 제공할 수 있는 지와는 전혀 관련이 없다. 그런 공유기라면 차단을 해제해준다.

VPN 서버(맥)를 공유기 자체로 활용하고 있는 게 아닌 이상, Windows 7 이나 Windows 10 에서 공유기 하단에 물린 VPN 서버에 접속하는 게 잘 안될 것이다. 다음 글을 참조한다.

라즈베리파이 node.js로 웹에서 LED 제어

라즈베리파이 에서 node.js 를 활용하여 웹에서 LED 를 제어해보자. Form 태그를 이용해 POST 요청을 받아서 원하는 GPIO 를 ON/OFF 해볼 것이다.

사전준비

웹앱의 구조를 손쉽게 만들기 위해서 express 프레임웍을 활용하자.
$ sudo npm install -g express
$ sudo npm install -g express-generator

코드를 수정한 뒤 서버를 껐다켜기 귀찮으므로, nodemon도 설치하자.
$ sudo npm install -g nodemon

기본설정

설치가 끝나면 express로 프로젝트를 생성한다. --view 옵션을 빼먹는다면 html을 jade로 작성해야 해서 대략 난감할 것이다.
$ express gpio_onoff --view=ejs

$ cd gpio_onoff
$ npm install

LED를 제어하기 위해 필요한 모듈도 설치하자.
$ npm install onoff

nodemon으로 웹서버를 실행하자
$ nodemon

/views/index.ejs 수정

처음 express 프로젝트를 접하면 도대체 무슨 파일을 수정해야 html을 고칠 수 있을까 혼란스러운데, .ejs 파일이 html파일이 된다고 생각하면 된다. 즉, index.ejs가 index.html로 변환되는 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1><%= title %></h1>
    <p>Welcome to <%= title %></p>
<!-- 추가할 부분 (5줄) -->
    <form action="/onoff" method="POST">
    	ON:<input type="radio" name="LED" value="on">
    	OFF:<input type="radio" name="LED" value="off"></br>
    	<button type="submit">Submit</button>
    </form>
  </body>
</html>

코드를 간단히 설명하면, Submit 버튼을 누르면 localhost:3000/onoff 주소로 POST 요청이 이루어진다. LED라는 이름을 갖는 변수는 웹에서 선택한 2개의 라디오 버튼에 따라서 on이나 off값을 갖게 된다.

localhost:3000/ 에 접속하여

와 같은 그림이 나오는지 확인해보자. 아직, Submit 버튼은 제대로 동작하지 않는다.

/routes/index.js 수정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var express = require('express');
var router = express.Router();
 
//추가할 부분 (3줄)
var bodyParser = require('body-parser'); // Form 값을 읽어오기 위해 필요
var Gpio = require('onoff').Gpio,
	gpio21 = new Gpio(21, 'out'); // GPIO 21번 사용
 
/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});
 
//추가할 부분 (8줄)
router.use(bodyParser.urlencoded({extended:true}));
router.post('/onoff', function(req, res, next){
	if (req.body.LED === "on") {
		gpio21.writeSync(1);
	} else {
		gpio21.writeSync(0);
	}
})
 
module.exports = router;

참고로 $ gpio readall 을 통해 GPIO 핀 값들을 읽었을 때 BCM 번호가 onoff 모듈이 사용하는 번호이다. 예제에서 사용한 21번 GPIO는 라즈베리파이 3 버전에서 제일 우측 하단에 위치해 있고, 이름은 GPIO.29 이다.

코드를 간단히 설명하면, /onoff 주소로 POST 요청이 오게되면, 조건문을 실행한다. Form 에서 입력받은 LED 값이 on 이라면 GPIO 21을 켜고, 입력받은 LED 값이 off라면 GPIO 21을 끄는 것이다.

다 되었다.

결과 확인

http://localhost:3000 을 새로고침하여 확인해보자.

이걸 반복하면 다음과 같은 웹페이지도 만들 수 있다.

Rasbian 에서 node 깔끔하게 삭제하고 재설치하기

라즈베리파이의 운영체제인 라즈비안(Rasbian)에서 node를 깔끔하게 삭제하고 재설치 해보자. node를 지우기 위해서 find 명령어를 통해 일일이 모든 폴더를 찾아다니면서 node와 npm을 삭제할 수도 있지만 매우 귀찮다. 또한 마구마구 지우다가 잘못 지워버리지 않을지 걱정이 되기도 한다. 하지만, 라즈비안에서는 apt-get 을 이용하면 간단하게 재설치할 수 있다. (맥에서 역시 homebrew가 아닌 apt-get을 이용해서 설치했었다면, 같은 방법으로 적용할 수 있다.)

먼저 https://nodejs.org/ 에 접속해서 최신 버전을 확인 한 뒤, 설치되어 있는 최신 버전을 확인한다.

$ node -v

최신버전이 아니라면, 먼저 apt-get 앱을 최신버전으로 업데이트 해준다.

$sudo apt-get update
$sudo apt-get upgrade

설치되어있는 nodejs 관련 파일을 모두 삭제한다.
$ sudo apt-get purge nodejs*

만일 잘 삭제되었는지 확인하고 싶다면 다음 명령어를 치고 오류가 나는지 확인한다.
$ node
bash: /usr/bin/node: No such file or directory

curl 명령어를 통해 node의 최신 버전을 받아온 뒤(2017년 12월 현재 9버전, 만일 버전이 바뀌었거나, 구 버전을 설치하고 싶다면 숫자만 바꾸면 된다.)
$ curl -sL https://deb.nodesource.com/setup_9.x | sudo -E bash –

다운이 완료되면 친절하게 다음 명령어를 알려준다.
$ sudo apt-get install -y nodejs

설치가 완료되면 버전을 확인해보자.
$ node -v
$ npm -v

참고로, node 의 최신버전이 9라고 해서 npm 도 9가 최신인 것은 아니다.

그런데, rasbian 에서 node를 설치했을 경우, npm 에서 전역(global) 설치가 안먹는 경우가 있다.

$ sudo npm install -g express

와 같이 설치했을 경우, Error: EACCES: permission denied 와 함께 수십줄의 에러메세지가 나타난다면

Rasbian 에서 npm Error: EACCES: permission denied를 참조한다.

Rasbian 에서 npm Error: EACCES: permission denied

라즈베리파이의 운영체제인 라즈비안(rasbian)에서 전역 옵션(-g)을 통해 모듈을 설치했을 때, Error: EACCES: permission denied 메세지와 함께 수십줄의 에러코드가 뜨면서 제대로 설치가 되지 않을 때가 있다.

예를들어

$ sudo npm install -g onoff

와 같이 전역으로 설치했을 때, 각종 권한문제로 설치가 되지 않는 것이다. 이 문제는 전역 옵션으로 모듈이 설치될 폴더의 권한을 갖고 있지 못했기 때문에 발생한다. 우선, rasbian 에서 node 깔끔하게 삭제하고 재설치하기를 참조하여 재설치해보는 것을 추천하고 그래도 되지 않을 경우 아래와 같은 순서로 진행해본다.

먼저 npm 의 설정파일을 확인한다.
$ npm config get prefix

아마 /usr 라고 뜰 것이다. /usr라고 뜰 경우, 새 폴더를 생성해서 $PATH도 설정해주고 npm 의 설정파일도 변경하여 해결해야하는 것으로 알려져 있는데, 딱히 그렇게 하지 않아도 되는 것 같다. /usr 라고 뜰 경우에, 전역 옵션의 모듈이 설치되는 곳은

/usr/lib/node_modules/.. 이다.

그러므로 이 폴더에 권한을 부여한다.

$ sudo chown -R 아이디 /usr/lib/node_modules

만일 이 폴더가 없다면

$ cd /usr/lib
$ mkdir node_modules

를 통해 폴더를 생성한 뒤에 chown 명령을 진행한다. 권한을 부여한 뒤 다시 한번 전역 설치를 실행해본다.

$ sudo npm install -g 모듈이름

만일 에러 없이 잘 깔렸다면, 다음의 명령어로 확인해본다.

$ npm ls -g --depth=0

/usr/lib
├── express@4.16.2
├── express-generator@4.15.5
├── npm@5.5.1
└── onoff@1.1.8

와 같이 뜨면 잘 설치된 것이다.

macOS Server에서 웹사이트 만들기

macOS Server 앱(구 OS X Server앱)에서 웹 사이트를 만들어 봅시다. 보통은 웹 서버를 구축하고서 그 웹 서버에 웹 사이트를 올리는 순서로 진행해야 하지만, macOS Server 앱을 설치할 때 이미 다 구축이 되었습니다. 그러므로 클릭 한번으로 웹 서버를 작동시킬 수 있습니다.

한글 버전은 발번역의 문제나 인터넷 상에서 정보를 얻기 어려운 문제가 있어 영어버전을 사용하는 것이 조금 더 편하지만, 한글 버전을 쓰는 분들을 위해 메뉴를 한/영 병기하겠습니다. macOS Server 앱에서 따옴표에 묶인 부분들을 찾을 수 있을 거에요.

웹 서버 작동시키기

좌측 “서비스(Services)” 메뉴에서 “웹 사이트(Website)”를 누른 뒤, 우측에서 버튼을 눌러 서비스를 켜세요. 몇 초 걸리기도 하니 인내심을 갖고 기다려주세요. 초록색 불이 들어오면 서비스가 켜진 것입니다. 이제 웹 서버가 작동하기 시작했습니다. 간단하죠?

워드프레스 등 PHP를 사용할 거라면, “웹 응용 프로그램: PHP 활성화(Web Applications: Enable PHP)”에 체크합니다.

웹 사이트 만들기

하단의 +버튼을 눌러 “새로운 웹 사이트(New Web Site)”를 만듭니다.

웹 사이트 기본 설정

도메인 이름(Domain Name): 실제로 사용할 주소
중요:자신이 사용할 도메인 네임 주소를 정확히 입력해야 합니다.
도메인 네임 naver.com 을 소유하고 있을 경우, 대부분의 웹 사이트에서 가장 기본이 되는 사이트는 관습적으로 www.naver.com 주소를 사용하기 때문에, 만일 test.co.kr 도메인을 구입하셨다면, 여기에다가 www.test.co.kr이라고 입력하면 됩니다.

만일 www.test.co.kr 은 다른 데다 쓰고, blog.test.co.kr을 쓰고 싶다면 그렇게 입력하면 돼요. 한마디로, 웹브라우저에서 입력할 주소를 이 칸에 쓰는겁니다.

IP 주소(IP Address): IP로 접속시 보일 사이트
기본값인 “모두(Any)”로 놔두세요. 이걸 자신의 IP주소로 바꾸면, 주소창에 자신의 IP주소를 직접 넣었을 때, 이 웹사이트가 뜨게 됩니다. 만일 컴퓨터의 IP가 1.2.3.4 라면, 원래는 1.2.3.4:80에서는 1개의 웹사이트 밖에 구축이 안됩니다. 그러나 apache에서는 특별한 방법을 통해 한 컴퓨터에서 여러 웹사이트를 구축할 수 있죠.

만일 “도메인 이름(Domain Name)”과 “IP 주소(IP Address)”에 대하여 좀 더 알고싶거나 개념이 헷갈린다면 다음 글을 참조해보세요. 아파치 웹서버에서 컴퓨터 하나로 여러 도메인 주소를 쓰는 원리

SSL 인증서(SSL Certificate): 블로그라면 필요없음
[방송통신위원회 고시 제2012-50호] 때문에 회원가입을 받고, 회원정보를 수집하는 대한민국 내의 모든 사이트(심지어 이메일 한개만일지라도)는 SSL 인증서를 필수로 설치해야 합니다. 그런데 개인 홈페이지를 구축하는 선에서는 비용이 매우 아깝죠. com 도메인을 유지하는 비용보다도 비싸요!

2016년 이전까지만 하더라도 StartSSL 등에서 기관이 인증한 무료 SSL을 사용할 수 있었는데, 보안상의 이유로 크롬 등에서 차단되었습니다. 그래서 macOS Server에서 클릭 몇번으로 자체 발급 가능한 SSL인증서를 사용하는 것과, StartSSL에서 무료 인증서를 받아서 사용하는 것 사이에는 아무 차이가 없어요. 둘 중 무엇을 사용하든, https로 웹 사이트에 접속하는 사용자는, 위험한 사이트라며 경고 화면을 보게될 것입니다.

남들이 봐달라고 웹 사이트를 만들었는데, 보안 경고가 뜨면 사람들이 안들어오겠죠? 그러므로, 혼자 사이트를 쓸거라면(블로그처럼), 회원가입을 막고 인증서는 “없음(None)”을 선택할 것을 추천합니다.

다음에 사이트 파일 저장(Store Site Files In): 사이트 파일을 저장할 내 컴퓨터 내 폴더
기본적으로 ‘/Library/Server/Web/Data/Sites/도메인 이름(Domain Name)에 입력한 주소’에 파일을 저장하게 되어있습니다. 만일 좌측에서 제일 상단에 자신의 컴퓨터 이름으로 되어있는 메뉴의 “설정(Settings)” 탭에서 “서비스 데이터(Service Data)”의 위치를 바꾸었다면 그 위치로 ‘/그 위치/Library/Server/Web/Data/Sites/도메인 이름(Domain Name)에 입력한 주소’에 파일을 저장합니다.
물론 여기서 수동으로 아무 폴더에 파일을 저장할 수도 있습니다.

접근할 수 있는 사람(Who Can Access):공개 사이트인 경우 필요없음
“모두(Anyone)”으로 해두지 않는다면, 웹사이트에 접속했을 때 아무 글씨도 없는 하얀 화면에 아이디와 비번을 넣는 창이 열립니다. 여기서 아이디와 비번은 맥에 로그인할 때 사용하는 계정의 아이디/비번이에요. 서버 앱에서는 좌측의 “사용자(Users)” 메뉴에서 평상시 컴퓨터를 쓸 때는 로그인 화면에 보이지 않는 “서비스 전용(Services Only)”사용자를 만들 수 있습니다. 이를 이용하면, 맥 자체에 등록된 제한된 사용자만 웹사이트를 볼 수 있게 됩니다.

추가 도메인(Additional Domains):
인터넷 주소창에 naver.com을 쳐보세요. 주소가 www.naver.com로 바뀌어 접속되는 것을 확인하실 수 있습니다. 도메인 naver.com을 소유하고 있을 경우, naver.com은 사용하지 않는 상위 주소로 놔두고, www.naver.com 에서 기본 웹사이트를, blog.naver.com 등에서 다른 웹사이트들을 서비스합니다. 이 메뉴가 바로 이러한 기능을 구현하는 부분입니다. 예를 들어, “도메인 이름(Domain Name)”에서는 www.naver.com을 입력해두고, 여기에서는 naver.com을 입력해두시면 됩니다.
혹은 아예 다른 도메인도 한 주소로 운영할 수가 있습니다. 만일 www.naver.co.kr도 같은 페이지를 보이게 해주고 싶다면, 여기에 www.naver.co.kr도 추가해두시면 됩니다.

리다이렉트(Redirects):
리다이렉트는 웹에서 손쉽게 검색할 수 있는 부분이고 설정이 딱히 어려운 것도 아닙니다.

가상본(Aliases):
가상본도 딱히 신경쓰실 필요 없습니다.

인덱스 파일(Index Files):
원래, www.naver.com은 폴더명 같은 것일 뿐이고, www.naver.com이라고 치더라도 실제로는 www.naver.com/index.html 같은 html파일을 보여주게 됩니다. 여기서 지정하는 인덱스 파일이란, 도메인네임주소로 접속했을 시, 기본적으로 보여주게 될 html이나 php파일을 지정해주는 것입니다. 보편적으로 쓰이는 index.html, index.php, 워드프레스를 사용할 때에는 딱히 건드리지 않아도 무방합니다.

고급 설정

“고급 설정 편집(Edit Advanced Setting)”눌러 안쪽에 들어가면 다음과 같은 체크박스들이 있습니다.

서버측 포함 활성화(Enable Server Side Includes)
.htaccess 파일을 사용한 덮어쓰기 허용(Allow overrides using .htaccess files)
폴더 목록 생성 허용(Allow folder listing)
CGI 실행 허용(Allow CGI execution)
사용자 설정 오류 페이지 사용(Use custom error page):

워드프레스를 사용할 거라면 “.htaccess 파일을 사용한 덮어쓰기 허용(Allow overrides using .htaccess files)” 부분만 체크하면 됩니다. 보통 아파치 서버에서 한글로 된 주소를 사용하려면 Mod_url을 설치해야 하는데, macOS Server에서는 다국어 관련 인코딩 모듈이 이미 설치되어 있습니다. 이 체크 하나만으로 한글 고유 주소(Permalink)를 사용할 수 있게 됩니다.

또한 “사용자 설정 오류 페이지 사용(Use custom error page)” 기능은, 허용되지 않는 주소로 요청이 들어올 경우 원하는 html이 보이도록 하는 기능으로, 워드프레스 사용자는 굳이 이렇게 하지 않아도 오류 페이지가 따로 존재하기 때문에 신경쓰실 필요가 없습니다.

워드프레스 블로그 설정에 관한 내용만 보고싶으시다면, macOS Server로 맥에서 워드프레스 블로그 만드는 법을 참조하시기 바랍니다.

아파치 웹서버에서 컴퓨터 하나로 여러 도메인네임주소를 쓰는 원리

아파치 웹 서버에서 컴퓨터 하나로 여러 도메인네임주소를 사용하는 원리를 이해해 봅시다. 어떻게 www.example.com, blog.example.com 은 물론 아예 다른 도메인네임주소인 www.test.com 등을 모두 한대의 컴퓨터에서 서비스할 수 있는 걸까요.

웹 서버는 80포트를 사용한다.

웹사이트는 기본적으로 80포트를 통해 통신이 이루어집니다. 구글컴퓨터의 IP인 172.217.24.196에 접속을 하더라도, 172.217.24.196:80으로 접속하게 되는 것입니다. 이 포트는 기본포트이므로 주소창에 따로 나타나지도 않습니다.

이는 www.google.com과 같은 도메인네임주소를 사용할 때에도 마찬가지입니다. 주소창에 www.google.com 을 입력하면, 도메인네임서버와의 통신을 통해 172.217.24.196을 반환받습니다. 실제로는 172.217.24.196:80에 접속을 하게 되지만, 주소창에는 www.google.com만 뜨게 됩니다.

즉, www.google.com을 입력하면, 무조건 80번 포트로 운영중인 웹 사이트에만 접속할 수 있습니다. 물론 ISP 업체에서 80번 포트를 막아놨을 경우 우회하는 방법들이 있기는 하지만, 기본적으로는 80번 포트를 제외한 나머지 포트는 꼭 포트번호까지 써줘야 합니다.

하나의 포트번호는 하나의 사이트만 서비스 가능하다.

만일 다른 웹 사이트를 만들고 싶다면, 172.217.24.196:8080과 같이 다른 포트번호를 사용해야 합니다. 그런데 이 주소를 직접 도메인네임주소와 연결시킬 방법이 없습니다. www.google.com:8080과 같이 포트번호를 꼭 써준 주소를 써야하죠. 숫자주소가 싫어서 도메인네임서버를 사용하는 건데, 다시 숫자가 주소를 써야한다니 달가울 리가 없습니다.

도메인네임서버(DNS)에는 포트번호를 넣을 수 없다.

예를들어 1.2.3.4:80 에게는 www.example.com 이라는 문자 주소를 부여하고, 1.2.3.4:81에게는 www.test.com이라는 문자주소를 부여하고 싶다고 해봅시다. 간단히 생각해보면, 도메인네임서버(DNS)에게 www.test.com이 들어오면 1.2.3.4:81로 가라고 A레코드를 주면 될 것 같습니다. 하지만 포트번호를 끼고 레코드를 작성할 수가 없습니다. 그렇기 때문에, 1.2.3.4 에 www.example.com과 www.test.com을 모두 연결해야 합니다. 그리고 1.2.3.4:81 로 접속하고 싶다면, www.test.com:81로 접속해야만 합니다.

이 방법은, www.example.com과 www.test.com은 모두 1.2.3.4:80으로 연결되고, www.example.com:81과 www.test.com:81 모두 1.2.3.4:81로 연결됩니다. 전혀 원하는 방향이 아니죠. 그래서 Virtual Host 기능을 사용하게 됩니다.

1단계: 도메인네임서버(DNS)에서 A레코드 작성하기

일단, 도메인네임서버(DNS)에서 할 일은 간단합니다. www.example.com이든 www.test.com이든 blog.example.com이든 모두 자신의 아이피(여기서는 1.2.3.4)로 연결하는 A 레코드를 작성합니다.

이 단계까지 올바로 마쳤다면, www.test.com을 입력하든 www.example.com을 입력하든, 결국 숫자주소 1.2.3.4:80에 해당하는 www.example.com 사이트가 나타나야 합니다. 아직은 이상해 보이지만, 이상하게 생각할 필요 없습니다. 저도 처음에 설정하면서 이 부분이 가장 헷갈렸습니다.

아파치 웹 서버에서 가상호스트(Virtual Host)로 관리

도메인네임서버(DNS)에서 올바로 설정을 마쳤다면, 이제는 아파치 웹 서버의 모듈인 가상호스트(Virtual Host)를 알맞게 설정해주면 됩니다. 가상호스트(Virtual Host)의 기능은, 도메인네임서버(DNS)에게 1.2.3.4를 소개받아 접속한 사람이 www.example.com 을 치고 소개를 받은건지, www.test.com을 치고 소개를 받은건지를 구분해서 각각 알맞은 폴더를 보여주게 됩니다.

만일 www.example.com을 치고 온 사람이라면, 자동적으로 1.2.3.4으로 보내주고, www.test.com을 치고 온 사람은 자동적으로 1.2.3.4:81로 보내주고서 포트번호를 숨겨줍니다. 이것이 바로 한 컴퓨터로 80번 포트를 갖는 여러 주소의 사이트를 운영하는 법입니다.

여전히 www.example.com:81 로도, www.test.com에 해당하는 1.2.3.4:81에 접속할 수는 있습니다. 그렇기 때문에 가상호스트(Virtual Host)를 사용할 때에는 81처럼 손쉽게 넣을 수 있는 포트가 아닌 만번대 이상의 찍어서 맞추기는 힘든 포트를 사용하는 것이 좋습니다. 기본적으로 macOS Server에서는 이 작업을 알아서 해줍니다.

정리하자면 다음과 같습니다.

  • 1.2.3.4를 입력하면 1.2.3.4가 열림
  • www.example.com을 입력하면 1.2.3.4:80이 열림,
    주소창에는 www.example.com이 보임
  • www.test.com을 입력하면 1.2.3.4:81이 열림,
    주소창에는 www.test.com이 보임

사용법만 알면 쉬운 macOS Server

웹 검색을 해보면 아파치 웹 서버 자체에 대한 정보는 많고, macOS Server에 대한 정보는 별로 없기 때문에, 오히려 아파치의 config 파일을 직접 수정하는 게 쉬울 수도 있습니다. 저도 그랬어요. macOS Server를 어떻게 설정해야 가상호스트(Virtual Host)를 사용할 수 있는지 한참 헤맸습니다. 분명 가상호스트(Virtual Host) 기능이지만, 앱의 UI에서 그런 단어는 전혀 찾을 수 없으니까요.

macOS Server에서는 다음 링크와 같이 설정하면 손쉽게 Virtual Host를 이용해서 컴퓨터 한대로 80번 포트로 운영되는 여러 도메인네임주소를 사용할 수 있습니다.