[CentOS 7] Apache 2.4 웹서버에 VirtualHost(가상호스트) 설정하기

2019. 7. 30. 18:36Web Server/CentOS 7

반응형
  • 9090에 설정되어있던 젠킨스 웹 페이지
  • 8080에 설정되어있던 jiniworld 웹페이지
  • 추가로 구성할 html문서 웹페이지

이 세가지 url을 하나의 도메인을 이용하여 표현하고 싶다면 어떻게 설정하면될까요.

이전의 방식에서는 아마
http://jiniworld.me:9090
http://jiniworld.me:8080
http://jiniworld.me:8778
이렇게 뒤에 포트를 붙여서 구현했을 것입니다.

그러나, 우리는 웹사이트 구축할 때 뒤에 붙어있는 못생긴 포트를 제거하고 싶은데
ip도 하나이고, 도메인도 'jiniworld.me' 하나 뿐이라면 어떻게 해야할까요?

이럴 때 사용하는 것이 바로 가상호스트 입니다.


  1. 가상호스트란?
  2. Apache HTTP Server 설치
  3. VirtualHost 작성방법
    3-1) Proxy를 이용하여 포트 포워딩
    3-2) 정적파일이 위치한 경로 설정
  4. 가상 호스트 설정 추가하기
    4-1) httpd.conf 파일에 직접 설정
    4-2) 가상호스트에 관련된 설정을 외부 파일에 정의하고, 그 파일을 Include

++ tip 1. 방화벽 설정
++ tip 2. DNS 설정


1. 가상호스트란?

가상호스트를 이용하면 한 서버에서 여러 웹사이트를 서비스 할 수 있도록 할 수 있습니다.

가상호스트를 설정하는 방식은 이름기반, 주소기반, 포트기반이 있는데 보통 IP주소는 한정적이기 때문에 이름기반이나 포트기반을 주소 사용합니다.
이 포스트에서 설명하는 것은 이름기반 가상호스트 입니다.


가상호스트를 처음으로 접할 때, 이 개념이 헷갈릴 수 있다.
가상호스트의 개념이 헷깔리는 이들을 위해 보다 쉽게 표현해 보겠다.

서브도메인으로 각각 80포트로 접속할 수 있도록 변경합니다.

젠킨스는 ci
api및 웹페이지는 api
간단한 html이 위치한 테스트 페이지는 test

즉,
http://jiniworld.me:9090http://ci.jiniworld.me
http://jiniworld.me:8080http://api.jiniworld.me

※ 참고로, html 정적페이지만 들어있는 웹Document로 이번 가상호스트를 이용하여 웹서버에 올릴 예정입니다. ( http://test.jiniworld.me )


2. Apache HTTP Server 설치

sudo yum install httpd

yum 명령어를 이용하여 Apache HTTP Server를 설치합니다.

sudo systemctl enable httpd
sudo systemctl start httpd

서버 재부팅시 자동으로 켜지도록 하기 위해 enable 하고, Apache 웹서버를 시작합니다.

※ OS는 CentOS 7.8 버전입니다.


3. VirtualHost 작성방법

아파치 웹서버 설정파일인 httpd.conf을 수정함으로써 아파치 웹서버에 가상호스트 설정을 추가할 수 있습니다.
CentOS 7에서의 아파치 웹서버 설정파일 위치는 아래와 같습니다.

sudo vim /etc/httpd/conf/httpd.conf

httpd.conf 설정파일에 <VirtualHost> 태그를 직접 추가하거나, 가상 호스트에 대한 설정을 정의한 파일을 include하면 됩니다.


VirtualHost에 설정할 기본 속성
  • ServerName: 서버 도메인
  • ServerAlias: 서버도메인 별명
  • ErrorLog: 에러 로그 경로
  • CustomLog: 접속 로그 경로

ReverseProxy 관련 속성
  • ProxyPass, ProxyPassReverse: 리버스 프록시 설정을 위해 설정하는 값, 원격서버를 로컬서버와 연결합니다.
  • ProxyRequests: 리버스 프록시를 이용한다면 Off, (포워드 프록시를 이용한다면 On)
  • ProxyPreserveHost: Http Requet Header 유지 여부

※ 가상호스트 설정에 관한 상세한 정보는 여기를 참고하세요.


3-1) Proxy를 이용하여 포트 포워딩

api 웹 애플리케이션과 젠킨스는 웹서비스로 돌아가고 있는 애플리케이션입니다.
api.jiniworld.me:80 -> 아파치 웹서버 도착 -> 내부 8080 포트에 서비스 중인 웹에 접속

<VirtualHost *:80>
 ServerName api.jiniworld.me
 ErrorLog "/var/log/httpd/api/api-error_log"
 CustomLog "/var/log/httpd/api/api-access_log" common
 RewriteEngine On

 ProxyPass / http://127.0.0.1:8080/ nocanon
 ProxyPassReverse / http://127.0.0.1:8080/
 ProxyRequests Off
 AllowEncodedSlashes NoDecode

 <Proxy http://127.0.0.1:8080/*>
    Order deny,allow
    Allow from all
 </Proxy>
</VirtualHost>
<VirtualHost *:80>
 ServerName ci.jiniworld.me
 ErrorLog "/var/log/httpd/ci/ci-error_log"
 CustomLog "/var/log/httpd/ci/ci-access_log" common
 RewriteEngine On

 ProxyPass / http://127.0.0.1:9090/ nocanon
 ProxyPassReverse / http://127.0.0.1:9090/
 ProxyRequests Off
 AllowEncodedSlashes NoDecode

 <Proxy http://127.0.0.1:9090/*>
    Order deny,allow
    Allow from all
 </Proxy>
</VirtualHost>

api 웹애플리케이션은 서버 내부에서 8080포트로 동작하고 있고,
젠킨스 앱은 9090포트로 동작하고 있는데, 이것을 가상호스트로 연결해주었습니다.

만일, 특정 ip에서만 접근할수 있도록 설정하고 싶다면

<Location />
   Require ip ip1 ip2 ip3
</Location>

<VirtualHost> 태그 내에 위의 코드를 넣어주면 됩니다.
Require ip 에 접근을 허용할 ip 목록을 나열하면 되며, ip는 띄어쓰기로 구분합니다.


3-2) 정적파일이 위치한 경로 설정

정적파일만 포함된 프로젝트의 홈 디렉토리를 DocumentRoot로 설정하면 해당 경로에 들어있는 파일들을 가상호스팅된 주소로 열어볼 수 있습니다.

<VirtualHost *:80>
 ServerName test.jiniworld.me
 DocumentRoot /var/www/test
 ErrorLog "/var/log/httpd/api/test-error_log"
 CustomLog "/var/log/httpd/api/test-access_log" common
</VirtualHost>

기본적으로 루트 접근할 경우에는 홈 디렉토리 내의 index.html가 열립니다.
http://test.jiniworld.me 로 접속할 경우, /var/www/test/index.html 페이지를 열어볼 수 있습니다.


05

index.html이 없을 경우 위와 같은 페이지가 출력됩니다.


4. 가상 호스트 설정 추가하기

2번에서 설정한 가상 호스트 설정을 추가하는 방법을 알아봅시다.


4-1) httpd.conf 파일에 직접 설정

httpd.conf 파일의 맨 하단에 가상호스트 관련 설정을 붙여넣은 후 아파치 웹서버를 재시작(sudo systemctl restart httpd)합니다.


4-2) 가상호스트에 관련된 설정을 외부 파일에 정의하고, 그 파일을 Include

cd /etc/httpd
sudo mkdir sites-available sites-enabled
cd sites-available
sudo touch api.jiniworld.me.conf ci.jiniworld.me.conf test.jiniworld.me.conf

sites-available 폴더를 만들어, 각 가상호스트별 설정파일을 생성하고 2번에서 작성했던 가상호스트 설정을 넣어줍니다.

sudo ln -s /etc/httpd/sites-available/api.jiniworld.me.conf /etc/httpd/sites-enabled/api.jiniworld.me.conf
sudo ln -s /etc/httpd/sites-available/ci.jiniworld.me.conf /etc/httpd/sites-enabled/ci.jiniworld.me.conf
sudo ln -s /etc/httpd/sites-available/test.jiniworld.me.conf /etc/httpd/sites-enabled/test.jiniworld.me.conf

그리고, 그 가상호스트 중에 웹서버 서비스를 할 사이트만 sites-enabled 폴더에 링크를 생성해줍니다.

그리고, httpd.conf 파일의 맨 하단에 sites-enabled 폴더 하위 파일을 포함시키는 코드를 추가해줍니다.

IncludeOptional sites-enabled/*.conf

모든 설정을 마친 후, 아파치 웹서버를 재시작(sudo systemctl restart httpd)하면 끝입니다.


test.jiniworld.me

api.jiniworld.me

ci.jiniworld.me

아주 깔끔하다!


++ tip 1. 방화벽 설정

그런데 여기서, 한가지 이상한 점이 있습니다.

http://test.jiniworld.me:9090/ → 젠킨스 접속
http://api.jiniworld.me:9090/ → 젠킨스 접속
http://ci.jiniworld.me:9090/ → 젠킨스 접속

http://test.jiniworld.me:8080/ → jiniworld 웹사이트 접속
http://api.jiniworld.me:8080/ → jiniworld 웹사이트 접속
http://ci.jiniworld.me:8080/ → jiniworld 웹사이트 접속


젠킨스가 설정되어있는 9090포트를 명시적으로 넣고 접속할 경우에는 맨앞에 서브도메인이 무엇이 오건 젠킨스로 접속이 되고,
지니월드 웹사이트가 설정되어있는 8080포트를 명시적으로 넣고 url접속할 경우 서브도메인이 무엇이 오건 지니월드 웹사이트로 접속이 됩니다.

이건, 우리가 가상호스트를 80포트로 접속했을 경우에 대해서 설정했기 때문에 발생되는 현상입니다.

가상호스트로 사이트를 분리했기 때문에 이제는 80포트로 웹애플리케이션 접속을 할 것이다. 따라서 9090과 8080 포트는 외부 접속을 막아줘도 됩니다.

방화벽 상세정보를 조회합니다.

sudo firewall-cmd --list-all
apple (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client http jenkins mysql ssh
  ports: 8080/tcp 8989/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

8080포트와 jenkins서비스(9090포트)를 제거하도록 합시다.

sudo firewall-cmd --permanent --remove-port=8080/tcp
sudo firewall-cmd --permanent --remove-service=jenkins
sudo firewall-cmd --reload

--permanent 속성을 붙여 영구 제거하고, --reload로 방화벽 수정사항을 적용하니다.

firewall-cmd --list-all
apple (active)
 target: default
 icmp-block-inversion: no
 interfaces: eth0
 sources:
 services: dhcpv6-client http mysql ssh
 ports: 8989/tcp
 protocols:
 masquerade: no
 forward-ports:
 source-ports:
 icmp-blocks:
 rich rules:

다시 방화벽 상세조회를 해봅니다.
8080포트 및 jenkins 서비스가 제거되었습니다.

이제는 http://ci.jiniworld.me, http://api.jiniworld.me 와 같이 포트를 생략하고 접속하도록 합시다.


++ tip 2. DNS 설정

가상 호스팅 설정을 모두 완료하고, 방화벽 설정도 완료하였으나 여전히 api.jiniworld.meci.jiniworld.me 와 같은 서브 도메인으로 접속이 안된다면 DNS 설정을 했는지 확인해봐야 합니다.

도메인을 구입한 호스팅 업체의 설정창에서 네임서버를 확인해봅니다.
호스팅 업체에서 제공해주는 기본 네임서버를 설정했을 경우, 호스팅 업체의 설정창에서 DNS 설정을 찾아 서브도메인 설정을 추가해야 합니다.

만일, 네임서버를 호스팅 업체가 아닌 다른 서버의 네임서버로 변경했을 경우에는, 해당 서버에서 DNS 설정을 추가해야 합니다.

서브도메인을 설정하기 위한 방법에는 A 레코드와 CNAME 설정 방법이 있습니다.
연결하고자 하는 서버의 ip를 값으로 사용할 때에는 A레코드를 사용해야 하고, 도메인을 값으로 사용할 때에는 CNAME을 사용하면 됩니다.

※ CNAME은 .으로 끝나야 합니다 (api.jiniworld.me.)


++ 키워드

  1. 웹서버를 이용한 서브도메인 설정
  2. httpd.conf 에 VirtualHost 설정
  3. 이름기반의 가상호스트 설정
  4. CentOS 7 Apache 2.4를 이용한 VirtualHost(가상호스트) 설정
728x90
반응형