웹 서버를 운영하다 보면, 여러 서비스들을 한 물리적 서버에서 운영해야 하는 경우가 생길 것이다.

모든 서비스마다 각자 배정된 서버가 있다면 좋겠지만.. 현실은 회사는 돈이 없다 ^.^

 

예를 통해 살펴보자.

co-no.intranet.co.kr <- co-no라는 회사의 인트라넷 홈페이지 URL 이라고 하자.

co-no.hrd.co.kr <- co-no라는 회사의 인사 정보를 조회할 수 있는 웹사이트의 URL 이라고 하자.

 

co-no.intranet.co.kr 로 접속하면 /deployment/INTRANET/intranet.war 와 같은 서버 내의 배포 파일에서 인트라넷 서비스를 불러와서 유저에게 제공한다.

co-no.hrd.co.kr 로 접속하면 /deployment/HRD/hrd.war 와 같은 서버 내의 배포 파일에서 인사 정보 서비스를 불러와서 유저에게 제공한다.

 

이렇게 말로만 써보면 간단한데, 컴퓨터(서버)는 이 간단한 것도 일일히 일러줘야 처리할 수 있다. 

co-no.intranet.co.kr 로 접속하든, co-no.hrd.co.kr 로 접속하든 어쨋든 하나의 웹 서버에 두 서비스가 올라와 있다면, 컴퓨터 입장에서는 자신의 IP와 80포트 하나로 들어오는 요청일 뿐이다. 즉, 같은 요청으로 인식하기 때문에 컴퓨터가 알아서 인트라넷 서비스와 인사 정보 서비스를 구분해서 띄워주지 못한다.

이 구분해서 띄워주는 설정을 우리는 Virtualhost(가상호스트) 기능을 통해 알아볼 것이다!


Q1. 하나의 IP 주소여러 도메인 네임 기반 웹사이트를 운영하고 싶은데 어떻게 해야 할까?

A)

위에서 언급한 예시를 그대로 적용시켜 보자.

우선 DNS 상에 co-no.intranet.co.kr 이라는 URL과 co-no.hrd.co.kr 이라는 URL이 등록되어 있다는 가정하에 아래 아파치 설정을 진행한다.

# Virtualhost.conf 파일의 설정
# httpd.conf 파일에서 Include 구문을 사용하여 Virtualhost.conf 설정을 읽어들일 수 있도록 설정하였다고 가정한다.
# 꼭 conf 파일의 이름을 Virtualhost.conf 로 할 필요는 없다. Vhost.conf, vhost.conf 처럼 사용해도 상관없다.


# 아파치가 포트 80을 리슨하고 있겠다. (기다리고 있겠다.)
Listen 80

# 모든 IP 주소에서 가상 호스트 요청을 리슨하고 있겠다.
# 여기서 *는 모든 IP 주소를 의미하며, 지금 운영되고 있는 서버의 IP가 바뀔 수 있으므로, 웬만하면 *로 설정한다.
NameVirtualHost *:80

# co-no.intranet.co.kr로 접속하면 /deployment/INTRANET 디렉토리의 파일을 읽어서 응답해주겠다.
# VirtualHost 태그의 *도 IP를 의미하고, 위 NameVirtualHost 에서 설정해준 IP와 동일하게 설정해야 한다.
<VirtualHost *:80>
    DocumentRoot /deployment/INTRANET
    ServerName co-no.intranet.co.kr
</VirtualHost>

# co-no.hrd.co.kr로 접속하면 /deployment/HRD 디렉토리의 파일을 읽어서 응답해주겠다.
<VirtualHost *:80>
    DocumentRoot /deployment/HRD
    ServerName co-no.hrd.co.kr
</VirtualHost>

 여기서 유의할 것이 있는데, 아파치의 conf 파일은 가장 처음으로 나오는 내용이 가장 높은 우선순위를 가지게 된다.

즉, 어떤 ServerName 지시어에도 해당되지 않는 요청(설정되지 않은 별도의 URL로 접속한다면)은 첫번째 VirtualHost(위 설정에서는 co-no.intranet.co.kr)가 서비스하게 된다.

이러한 특성을 이용하여 아래 Q2 도 설정할 수 있게 된다.


Q2. 여러 IP 주소에서 네임기반 호스팅을 하고 싶은데 어떻게 하죠?

A)

172.20.30.40 이라는 IP에서 "주" 서버 co-no.intranet.co.kr 을 서비스하고, 다른 하나의 IP(172.20.30.50)에서 여러 가상 호스트를 서비스 한다고 가정하자. 

# Virtualhost.conf 설정
# 이 conf 파일은 172.20.30.40 에 존재한다고 가정한다.


Listen 80

# 172.20.30.40 에서 실행하는 "주" 서버임을 설정(가장 상위에 쓴다.)하는 구문
ServerName co-no.intranet.co.kr
DocumentRoot /deployment/INTRANET

# 172.20.30.50 에서 여러 가상 호스트를 서비스하도록 설정하는 구문
NameVirtualHost 172.20.30.50

<VirtualHost 172.20.30.50>
    DocumentRoot /deployment/HRD
    ServerName co-no.hrd.co.kr
</VirtualHost>

<VirtualHost 172.20.30.50>
    DocumentRoot /deployment/TRADE
    ServerName co-no.trade.co.kr
</VirtualHost>

위와 같이 설정하면, 172.20.30.50 이 아닌 다른 주소에 대한 요청은 주서버(172.20.30.40)가 서비스하게 된다. 

또한 호스트명 없이 172.20.30.50 으로 요청하게 되면, co.-no.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/INTRANET
    ServerName co-no.intranet.co.kr
    
    # DNS 서버에 intranet과 위 IP로 등록되어 있다고 가정하자.
    # ServerAlias 설정을 통해 'intranet'만 입력해도, co-no.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 co-no.intranet.co.kr
    DocumentRoot /deployment/INTRANET-80
</VirtualHost>

# intranet 사이트로 접속해서 8080 포트로 리다이렉션 된다면, 'INTRANET-8080' 도메인을 서비스.
<VirtualHost 172.20.30.40:8080>
    ServerName co-no.intranet.co.kr
    DocumentRoot /deployment/INTRANET-8080
</VirtualHost>

# hrd 사이트로 접속해서 80 포트로 리다이렉션 된다면, 'HRD-80' 도메인을 서비스.
<VirtualHost 172.20.30.40:80>
    ServerName co-no.hrd.co.kr
    DocumentRoot /deployment/HRD-80
</VirtualHost>

# hrd 사이트로 접속해서 8080 포트로 리다이렉션 된다면, 'HRD-8080' 도메인을 서비스.
<VirtualHost 172.20.30.40:8080>
    ServerName co-no.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>

참고

https://httpd.apache.org/docs/2.4/ko/vhosts/examples.html

 

가상호스트 예 - Apache HTTP Server Version 2.4

가상호스트 예 이 문서는 최신판 번역이 아닙니다. 최근에 변경된 내용은 영어 문서를 참고하세요. 이 문서는 자주 문의되는 가상호스트 질문에 답을 하려고 쓰여졌다. 상황은 이름기반이나 IP

httpd.apache.org

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기