Apache httpd Virutalhost 설정
최근에 리눅스를 가상 머신에 설치해서 아파치를 설정하는 작업을 했다. 아파치를 설정하는 작업은 httpd.conf 파일을 수정한다.
그 중에서 가상호스트 설정하는 것에 대해 다뤄보려 한다.
설정 파일 경로는 다음과 같다.
/etc/httpd/conf/httpd.conf
가상 호스트
웹 서버를 운영하면, 여러 서비스들을 한 물리적인 서버에서 운영해야 하는 경우가 있다.
예를 들어,
company.intranet.co.kr - company라는 회사의 인트라넷 홈페이지 URL.
company.hrd.co.kr - company라는 회사의 인사 정보를 조회할 수 있는 URL.
company.intranet.co.kr로 접속하면 /deployment/intranet/intrnet.war와 같은 서버 내의 배포 파일에서 인트라넷 서비스를 불러와서 유저에게 제공한다.
company.hrd.co.kr로 접속하면 /deployment/hrd/hrd.war와 같은 서버 내의 배포 파일에서 인사 정보 서비스를 불러와서 유저에게 제공한다.
하나의 웹 서버에 두 서비스가 올라와 있다면, 서버 입장에서는 자신의 IP와 80 포트 하나로 들어오는 요청으로 판단한다. 즉 같은 요청으로 신식하기 때문에 컴퓨터가 알아서 인트라넷 서비스와 인사 정보 서비스르 구분해서 처리하지 못한다.
이러한 처리를 해주는 것이 Virtualhost(가상호스트) 기능이다.
Q1. 하나의 IP 주소에 여러 도메인 네임 기반 웹 사이트를 운영하려면 어떻게 해야 할까?
A) 우선 DNS 상에 company.intranet.co.kr, company.hrd.co.kr 두 URL이 등록되어 있다는 가정 하에 아래 아파치 설정을 진행한다.
# Virtualhost.conf 파일의 설정
# httpd.conf 파일에서 Include 구문을 사용하여 Virtualhost.conf 설정을 읽어들일 수 있도록 설정하였다고 가정한다.
# Include conf/extra/httpd-vhosts.conf(vhost설정파일)
# 꼭 conf 파일의 이름을 Virtualhost.conf 로 할 필요는 없다. Vhost.conf, vhost.conf 처럼 사용해도 상관없다.
# 아파치가 포트 80로 들어오는 요청을 기다린다.
Listen 80
# 모든 IP 주소에서 가상 호스트 요청을 리슨하고 있겠다.
# 여기서 *는 모든 IP 주소를 의미하며, 지금 운영되고 있는 서버의 IP가 바뀔 수 있으므로, 웬만하면 *로 설정한다.
NameVirtualHost *:80
# company.intranet.co.kr로 접속하면 /deployment/intranet 디렉토리의 파일을 읽어서 응답해주겠다.
# VirtualHost 태그의 *는 모든 IP를 의미하고, 위 NameVirtualHost 에서 설정해준 IP와 동일하게 설정해야 한다.
<VirtualHost *:80>
DocumentRoot /deployment/intranet
ServerName company.intranet.co.kr
</VirtualHost>
# company.hrd.co.kr로 접속하면 /deployment/hrd 디렉토리의 파일을 읽어서 응답해주겠다.
<VirtualHost *:80>
DocumentRoot /deployment/hrd
ServerName company.hrd.co.kr
</VirtualHost>
여기서 유의할 것은 아차피의 conf 파일은 가장 처음으로 나오는 내용이 가장 높은 우선 순위를 가지게 된다.
즉, 어떤 ServerName 지시어에도 해당되지 요청(설정되지 않은 별도의 URL로 접속한다면)은 첫번째 VirtualHost(위 설정에서는 company.intranet.co.kr)로 서비스하게 된다.
Q2. 여러 IP 주소에서 네임기반 호스팅하려면 어떻게 하는가?
A) 172.20.30.40이라는 IP에서 "주" 서버 company.intranet.co.kr을 서비스하고, 다른 하나의 IP(172.20.30.50)에서 여러 가상 호스트를 서비스한다고 가정한다.
# Virtualhost.conf 설정
# 이 conf 파일은 172.20.30.40 에 존재한다고 가정한다.
Listen 80
# 172.20.30.40 에서 실행하는 "주" 서버임을 설정(가장 상위에 쓴다.)하는 구문
ServerName company.intranet.co.kr
DocumentRoot /deployment/intranet
# 172.20.30.50 에서 여러 가상 호스트를 서비스하도록 설정하는 구문
NameVirtualHost 172.20.30.50
<VirtualHost 172.20.30.50>
DocumentRoot /deployment/hrd
ServerName company.hrd.co.kr
</VirtualHost>
<VirtualHost 172.20.30.50>
DocumentRoot /deployment/trade
ServerName company.trade.co.kr
</VirtualHost>
위와 같이 설정하면, 172.20.30.50이 아닌 다른 주소에 대한 요청은 주서버(172.20.30.40)가 서비스하게 된다.
또한 호스트명이 없이 172.20.30.50으로 요청하게 되면, company.hrd.co.kr을 서비스하게 된다. (철저히 디폴트가 설정 파일에 기재된 순으로 우선순위가 부여되어 서비스하게 된다는 의미)
Q3. 내부 IP 주소와 외부 IP 주소가 따로 설정되어 있을 때는 어떻게 해야 할까?
A)
내부 IP 주소 : 192.168.1.1
외부 IP 주소 : 172.20.30.40
위처럼 IP 주소가 설정되어 있다고 가정한다. 이때 서버는 내부 네트워크와 외부 네트워크 사이(DMZ)에 있다고 가정하자. 즉, 외부 네트워에서는 172.20.30.40으로 서버를 인식하고, 내부 네트워크에서는 192.168.1.1로 이 서버를 인식한다.
# Virtualhost.conf 설정
NameVirtualHost 192.168.1.1
NameVirtualHost 172.20.30.40
<VirtualHost 192.168.1.1 172.20.30.40>
DocumentRoot /deployment/intrent
ServerName company.intranet.co.kr
# DNS 서버에 intranet과 위 IP로 등록되어 있다고 가정하자.
# ServerAlias 설정을 통해 'intranet'만 입력해도, company.intranet.co.kr 서비스로 리다이렉션하게 된다.
# 서브 도메인을 활용할 때 주로 설정한다.
ServerAlias intranet
</VirtualHost>
Q4. 한 서버에 여러 사이트를 운영하는데, 각 사이트마다 포트도 여러 포트를 이용하려면 어떻게 하는가?
A)
# VirtualHost.conf 설정
# 같은 IP의 여러 포트에서 서로 다른 도메인을 서비스 하려고 한다면,
# 반드시 Listen 지시어와 NameVirtualHost 지시어를 모두 사용해야 한다.
Listen 80
Listen 8080 # 각 사이트마다 8080 포트를 추가한다고 가정.
NameVirtualHost 172.20.30.40:80
NameVirtualHost 172.20.30.40:8080
# intranet 사이트로 접속해서 80 포트로 리다이렉션 된다면, 'intranet-80' 도메인을 서비스.
<VirtualHost 172.20.30.40:80>
ServerName company.intranet.co.kr
DocumentRoot /deployment/intranet-80
</VirtualHost>
# intranet 사이트로 접속해서 8080 포트로 리다이렉션 된다면, 'intranet-8080' 도메인을 서비스.
<VirtualHost 172.20.30.40:8080>
ServerName company.intranet.co.kr
DocumentRoot /deployment/intranet-8080
</VirtualHost>
# hrd 사이트로 접속해서 80 포트로 리다이렉션 된다면, 'hrd-80' 도메인을 서비스.
<VirtualHost 172.20.30.40:80>
ServerName company.hrd.co.kr
DocumentRoot /deployment/hrd-80
</VirtualHost>
# hrd 사이트로 접속해서 8080 포트로 리다이렉션 된다면, 'hrd-8080' 도메인을 서비스.
<VirtualHost 172.20.30.40:8080>
ServerName company.hrd.co.kr
DocumentRoot /deployment/hrd-8080
</VirtualHost>
Q5. 어떤 가상 호스트에도 해당하지 않는 IP 주소와 포트에 대한 모든 요청을 별도로 처리하려면 어떻게 해야 하는가?
A)
# VirtualHost.conf 설정
# 모든 포트에 대한 _default_ 가상 호스트 설정
<VirtualHost _default_:*>
DocumentRoot /deployment/default
</VirtualHost>
# 80 포트에 대한 _default_ 가상 호스트 설정
<VirtualHost _default_:80>
DocumentRoot /deployment/default-80
</VirtualHost>
ref
[httpd] Apache httpd Virtualhost 설정 - 한 서버에서 여러 웹사이트 서비스하기
웹 서버를 운영하다 보면, 여러 서비스들을 한 물리적 서버에서 운영해야 하는 경우가 생길 것이다. 모든 서비스마다 각자 배정된 서버가 있다면 좋겠지만.. 현실은 회사는 돈이 없다 ^.^ 예를 통
co-no.tistory.com