가상 호스트의 개념을 이해하기 전에 웹 호스팅에 대한 개념을 알아야한다. 웹 호스팅이 생기기 이전에는 직접 웹 서비스를 하기 위해서 서버를 구매하고 관리했어야 한다. 이런 이유로 초기에 시간과 비용이 많이 들기 때문에 이런 부분을 대신 해주는 웹 호스팅이 생겨났다.
웹 호스팅은 공급 업체에서 직접 서버를 관리하기 때문에 사용자는 서비스에만 집중할 수 있게된다. 이외에도 성능, 신뢰성, 기술 지원, 보안 같은 다양한 이점도 있다.
웹 호스팅의 초기에는 물리적인 서버 단위로 전용 웹 서버를 임대해주는 형식이였다. 하지만 서버 단위로 호스팅되기 때문에 비용적인 측면에서 효율적이지 못했다. 이런 문제를 해결하기 위해 가상 호스팅이 생겨났다.
가상 호스팅은 서버 한 대를 여러 고객이 공유하게 해서 웹 호스팅 서비스를 저렴하게 사용할 수 있도록 했다.
초창기의 HTTP 프로토콜 명세에는 가상 호스팅을 고려하지 않고 만들어졌다. 이를 해결하기 위해 다양한 기술이 만들어졌다.
이번 글에서는 Nginx에서 Host 헤더를 통해 구분하는 방법을 알아보겠다.
설정하기에 앞서 먼저 설정 파일의 간단한 구조부터 알아보겠다. nginx의 config 파일은 directive에 의해서 module 형식으로 구성된다. directive에는 2가지 형식이 있다.
Simple Directive
: 공백으로 구분된 name
과 parameter
형식으로 세미콜론(;)
으로 끝난다.
Block Directive
: Simple Directive와 같이 공백으로 구분된 name
과 parameter
형식이지만 중괄호({})
로 둘러싸인 추가적인 명령어들의 집합으로 끝난다. 중괄호 내부에는 다른 Block Directive를 포함할 수 있는데 이를 Context(ex: events, http, server, location)
라고 부른다.
설정 파일 자체는 main context라고 부른다.
설정 파일은 이전 nginx 설치 글에서 설정한 /etc/nginx/nginx.conf
파일을 수정하면 된다. 일단 해당 파일에 있는 내용은 모두 지우고 아래 Block Directive만 남겨둔다. Directive 내부의 다른 요소들도 모두 지원준다.
events{
}
http{
}
Virtual Host는 http
directive 내부에 server
directive를 이용해서 생성할 수 있다.
http {
server {
listen 80;
server_name a.host.com;
location / {
return 200 "Hello, Nginx! This is Host A!";
}
}
}
listen 80
: 해당 Virtual Host가 listen할 포트를 지정server_name a.host.com
: HTTP 요청에서 Host 헤더와 비교할 값을 지정localhost / { ... }
: Virtual Host가 요청을 처리할 때 해당 요청의 경로가 /
하위에 포함될 경우 요청에 대한 처리를 지시한다.위와 같이 설정파일을 구성하고 nginx -s reload
명령으로 프로세스 재시작 후 브라우저 검색창에 http://localhost:80
를 검색하면 아래와 같은 문구가 브라우저 창에 표시된다.
이제 여러 호스트를 테스트 해보기 위해 Virtual Host를 생성한다.
http {
server {
listen 80;
server_name a.host.com;
location / {
return 200 "Hello, Nginx! This is Host A!";
}
}
server {
listen 80;
server_name b.host.com;
location / {
return 200 "Hello, Nginx! This is Host B!";
}
}
server {
listen 80;
server_name c.host.com;
location / {
return 200 "Hello, Nginx! This is Host C!";
}
}
}
위와 같이 설정 파일을 구성하고 다시 nginx -s reload
명령으로 프로세스 재시작하자.
위와 같이 설정하고 브라우저에서 테스트하면 Host 헤더를 제어하지 못하기 때문에 제대로 된 테스트가 어렵다. 실제로 도메인을 구매하거나 OS에 설정하는 방법도 있겠지만 POSTMAN 같은 HTTP API 테스트 툴을 이용해서 테스트해보자.
POSTMAN은 공식 사이트에서 자신의 OS에 맞는 버전을 선택해서 다운받고 설치하자.
다운받고 설치를 완료 했다면 API 테스트를 위한 요청을 만들어야한다.
+
버튼을 눌러서 새로운 요청을 생성GET
으로 설정http://localhost:80
으로 입력Host
입력a.host.com
, b.host.com
. c.host.com
중 선택해서 입력이제 추가한 Host 헤더의 Value를 변경해가며 API 테스트를 진행해보자. a.host.com
를 입력하면 Host A가 나오고 b.host.com
를 입력하면 Host B가 나오는 것을 확인 할 수 있다.