Apache HTTP Server

아파치 웹 서버 가상호스트(VirtualHost)의 _default_ 사용시 주의 점

sstdio.h·2015년 1월 18일·조회 5,987

1. 배경

  • aaa.service.com
  • bbb.service.com
  • ccc.service.com

아파치 웹 서버 하나로 위 3개 사이트를 이름 기반 가상호스트로 운영하고 있습니다. 그런데 VIP 주소를 직접 입력해 들어오거나, 위 호스트명과 매치되지 않는 요청을 처리할 별도의 가상호스트를 만들어 달라는 요구사항이 있었습니다.

http://httpd.apache.org/docs/2.2/ko/vhosts/examples.html를 참고하여 _default_ 가상호스트로 처리하려고 했는데, 기대한 대로 동작하지 않아 한동안 삽질을 했습니다.

default 가상호스트는 절대로 이름기반 가상호스트가 사용하는 주소/포트로의 요청을 서비스하지 않는다. 알 수 없거나 Host: 헤더가 생략된 요청은 항상 최초의 이름기반 가상호스트(설정파일에서 주소/포트가 처음으로 나온 가상호스트)가 서비스한다.

핵심은 위 문장입니다. 이름 기반 가상호스트가 이미 같은 주소와 포트에서 동작하고 있다면, _default_ 가상호스트가 “매치되지 않는 Host 요청”을 대신 받아 주는 구조가 아닙니다. 알 수 없는 Host 헤더가 들어오거나 Host 헤더가 생략된 요청은 해당 주소/포트에 대해 가장 먼저 정의된 이름 기반 가상호스트가 처리합니다.

2. 정리

따라서 이름 기반 가상호스트 환경에서 기본 처리용 사이트를 두고 싶다면, 별도의 _default_ 가상호스트를 기대하기보다 “가장 먼저 선언되는 가상호스트”를 기본 응답용으로 구성하는 방식으로 접근해야 합니다. 예를 들면 의도적으로 기본 가상호스트를 먼저 두고, 그 뒤에 실제 서비스용 가상호스트를 나열하는 식입니다.

<VirtualHost *:80>
    ServerName default.service.com
    # 매치되지 않는 Host 요청을 처리할 기본 설정
</VirtualHost>

<VirtualHost *:80>
    ServerName aaa.service.com
    # aaa 서비스 설정
</VirtualHost>

<VirtualHost *:80>
    ServerName bbb.service.com
    # bbb 서비스 설정
</VirtualHost>

<VirtualHost *:80>
    ServerName ccc.service.com
    # ccc 서비스 설정
</VirtualHost>

실제로 어떤 가상호스트가 기본으로 잡히는지는 설정을 반영한 뒤, 의도하지 않은 호스트명을 넣어 요청해 보면 확인할 수 있습니다. 예를 들어 임의의 Host 헤더로 요청했을 때 가장 먼저 선언한 가상호스트의 응답이 내려오는지 보면 됩니다.

curl -H 'Host: unknown.service.com' http://서버IP/

여기까지가 제가 확인한 내용입니다. 결론적으로, 제가 사용하던 이름 기반 가상호스트 구성에서는 _default_로 해결하는 문제가 아니라 가상호스트 선언 순서를 통해 기본 처리 대상을 정해야 하는 상황이었습니다.

댓글 1

로그인 후 댓글을 남길 수 있습니다.

  • appsrootappsroot· 2015년 1월 24일
    이름 기반 가상호스트에서는 매치되는 가상호스트가 없을 경우 첫 가상호스트 설정이 적용됩니다. 즉 default 로 적용시키고자 하는 설정을 가상호스트 설정 중 가장 앞에 위치시키고 ServerName 에 default 라고 적어서 실제로 매치되는 이름(URL) 이 없게 하면 되겠습니다.