서버 하나에 여러가지 웹사이트 혹은 웹앱을 호스팅 하고 싶은 경우엔 버츄얼 호스트를 만들어주면 된다.

www.test.com 이라는 도메인과 www.example.com 이라는 도메인을 한 서버 (같은 IP)에 있는 각기 다른 서비스에 연결 하고 싶을 경우, 아파치에서 어떻게 설명하는지에 대해 알아보았다.


#아파치 설정파일

우선 아파치의 설정파일은 서버에 따라 이름과 위치가 다르다. 자신의 서버에 아파치 설정파일이 어디에 있는지는 아래 커맨드를 사용하면 된다.

httpd -V 혹은 apache2ctl -V

이 커맨드를 터미널에서 실행하면 여러정보가 나오는데, 그 중에 -D SERVER_CONFIG_FILE 이란 섹션을 참조하면 된다. 일반적으로는 설정파일의 이름이 httpd.conf 혹은 apache2.conf 이런식으로 되어있는데, 서버에 OS를 올리고 직접 아파치를 설치한게 아니라, 이미 설정이 어느정도 되어있는 서버 이미지를 설치한 경우엔 해당 서버 이미지의 메뉴얼을 참조해야한다.

나 같은 경우는 AWS EC2에 Bitnami에서 만든 이미지 파일을 설치해서 사용했는데, 아파치 설정파일의 이름은 bitnami.conf 였다. 이 또한 이미지 파일에 따라 다르기 때문에, 자신이 설치한 서버 이미지의 메뉴얼을 봐야한다. 위치부터 이름까지 보통 다 잘 나와있다.


#버츄얼호스트 설정

아파치 설정파일을 찾았다면 버츄얼 호스트를 추가해주면 된다. 이 때 정적 파일들을 호스팅하는 웹사이트인지, 아니면 웹앱을 돌리고 있는지에 따라 조금씩 설정하는 방법이 다르다.

우선 www.test.com 이 정적 파일들을 호스팅 하는 웹사이트의 경우

<VirtualHost *:80>
    ServerName www.test.com
    DocumentRoot "<웹사이트 파일들이 있는 경로>"
</VirtualHost>

기본적으로는 이걸로 끝. HTTP 통신의 기본 포트는 80인데 *:80 이건 해당 서버에 접속하려고 하는 모든 HTTP 통신에 대한 설정을 말한다.

HTTP 통신이 서버에 리퀘스트를 보내는 경우, Header에 어떤 주소 이름으로 리퀘스트를 보냈는지에 대한 정보 또한 같이 오기 때문에, 서버에서는 우선 Header에 있는 정보를 분석한다.

이 때 ServerName에 어느 주소로 리퀘스트를 보냈는지에 대한 정보가 있고, 이번 경우 www.test.com 이라는 주소로 리퀘스트를 보냈을 경우에 대한 설정을 한 것.

DocumentRoot는 웹사이트 관련 정적 파일들이 서버 안에 어느 경로에 있나, 즉 index.html 파일이 있는 경로를 적어주면 된다. 일반적으로는 "www/var/index/" 이런 식으로 기본 경로가 정해져있다.

그럼 이제 www.example.com 으로 서버에 접속을 시도 한 경우에는 서버의 3000번 포트에서 돌리고 있는 웹앱을 보여준다는 설정은 다음과 같다.

<VirtualHost *:80>
    ServerName www.example.com
    
    ProxyRequest off
    
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    
    <Location />
        ProxyPass http://localhost:3000/
        ProxyPassReverse http://localhost:3000/
    </Location>
</VirtualHost>

가장 중요한 건 역시 ServerName이다. 이 줄이 가장 먼저 와야, 리퀘스트가 온 주소에 따라 뭘 보여줄지에 대한 설정을 할 수 있다.

앱이 3000번 포트에서 돌아가고 있기 때문에 www.example.com:3000 처럼 포트번호를 치고 접속하는게 아니고 www.example.com 으로 접속했을 때 해당 통신을 3000번 포트로 중계 시켜주는 설정이 <Location /> 태그 안에 있는 설정이다.

<Location />의 마지막 /는 루트로 접속했을 때 어떻게 할건지 설정하는 것. 만약 www.example.com/hello 로 접속했을 때 다른 걸 보여주고 싶다면 <Location /hello> 라고 한 다음 원하는 설정을 해주면 된다. 이럴 경우 <Location /hello> 태그를 <Location /> 보다 위에 적어주는 것이 좋다. 물론 이러한 설계는 좋지 않은 설계. 어디까지나 예를 든 것.

모든 설정이 끝난 후엔 아파치를 다시 시작해줘야한다.