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_로 해결하는 문제가 아니라 가상호스트 선언 순서를 통해 기본 처리 대상을 정해야 하는 상황이었습니다.