Nginx에서 Virtual Host 설정하기

날씨는 맑음·2022년 12월 22일
0

Nginx

목록 보기
2/3

1. 가상호스트?

1.1. 웹 호스팅

가상 호스트의 개념을 이해하기 전에 웹 호스팅에 대한 개념을 알아야한다. 웹 호스팅이 생기기 이전에는 직접 웹 서비스를 하기 위해서 서버를 구매하고 관리했어야 한다. 이런 이유로 초기에 시간과 비용이 많이 들기 때문에 이런 부분을 대신 해주는 웹 호스팅이 생겨났다.

웹 호스팅은 공급 업체에서 직접 서버를 관리하기 때문에 사용자는 서비스에만 집중할 수 있게된다. 이외에도 성능, 신뢰성, 기술 지원, 보안 같은 다양한 이점도 있다.

1.2. 전용 호스팅

웹 호스팅의 초기에는 물리적인 서버 단위로 전용 웹 서버를 임대해주는 형식이였다. 하지만 서버 단위로 호스팅되기 때문에 비용적인 측면에서 효율적이지 못했다. 이런 문제를 해결하기 위해 가상 호스팅이 생겨났다.

1.3. 가상 호스팅

가상 호스팅은 서버 한 대를 여러 고객이 공유하게 해서 웹 호스팅 서비스를 저렴하게 사용할 수 있도록 했다.

초창기의 HTTP 프로토콜 명세에는 가상 호스팅을 고려하지 않고 만들어졌다. 이를 해결하기 위해 다양한 기술이 만들어졌다.

  • URL 경로를 통한 구분
  • 포트번호를 통한 구분
  • IP 주소를 통한 구분
  • Host 헤더를 통한 구분

이번 글에서는 Nginx에서 Host 헤더를 통해 구분하는 방법을 알아보겠다.

2. 설정하기

2.1. Configuration 파일의 구조

설정하기에 앞서 먼저 설정 파일의 간단한 구조부터 알아보겠다. nginx의 config 파일은 directive에 의해서 module 형식으로 구성된다. directive에는 2가지 형식이 있다.

  • Simple Directive: 공백으로 구분된 nameparameter 형식으로 세미콜론(;)으로 끝난다.

  • Block Directive: Simple Directive와 같이 공백으로 구분된 nameparameter 형식이지만 중괄호({})로 둘러싸인 추가적인 명령어들의 집합으로 끝난다. 중괄호 내부에는 다른 Block Directive를 포함할 수 있는데 이를 Context(ex: events, http, server, location)라고 부른다.

설정 파일 자체는 main context라고 부른다.

2.2. 설정파일 초기화

설정 파일은 이전 nginx 설치 글에서 설정한 /etc/nginx/nginx.conf 파일을 수정하면 된다. 일단 해당 파일에 있는 내용은 모두 지우고 아래 Block Directive만 남겨둔다. Directive 내부의 다른 요소들도 모두 지원준다.

events{

}

http{
	
}

2.3. Virtual Host 생성하기

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 명령으로 프로세스 재시작하자.

3. 테스트

위와 같이 설정하고 브라우저에서 테스트하면 Host 헤더를 제어하지 못하기 때문에 제대로 된 테스트가 어렵다. 실제로 도메인을 구매하거나 OS에 설정하는 방법도 있겠지만 POSTMAN 같은 HTTP API 테스트 툴을 이용해서 테스트해보자.

3.1. POSTMAN 설치

POSTMAN은 공식 사이트에서 자신의 OS에 맞는 버전을 선택해서 다운받고 설치하자.

3.2. 요청 만들고 Host 헤더 추가하기

다운받고 설치를 완료 했다면 API 테스트를 위한 요청을 만들어야한다.

  • 1) + 버튼을 눌러서 새로운 요청을 생성
  • 2) HTTP 요청 Method를 GET으로 설정
  • 3) 요청 URL을 지정. 지금은 http://localhost:80으로 입력
  • 4) 추가로 만들 HTTP Header의 Key. 지금은 Host 헤더를 추가해야 하기 때문에 Host 입력
  • 5) 추가로 만들 HTTP Header의 Value. nginx.conf 파일에서 설정한 a.host.com, b.host.com. c.host.com 중 선택해서 입력

3.3. Host 헤더의 Value 변경해가며 테스트

이제 추가한 Host 헤더의 Value를 변경해가며 API 테스트를 진행해보자. a.host.com를 입력하면 Host A가 나오고 b.host.com를 입력하면 Host B가 나오는 것을 확인 할 수 있다.

4. 참고

0개의 댓글