Server/Ubuntu

[apache2] virtualhost로 여러 사이트 배포하기

dalpang.e 2020. 1. 31. 12:08

spring framework가 올라가있는 소스를 배포할 때 보통 Tomcat을 올려 Maven을 통해 배포하는데 최근에 서버를 이전하면서 나누어져있던 어플리케이션들을 통합하는 작업이 있었습니다. 각 어플리케이션들의 도메인이 전부 달랐지만 한 서버에 어떻게 해야할지 고민이 될텐데 이럴 때 Tomcat 앞에 Apache를 두어 가상호스트(VirtualHost)를 통해서 iptables 설정 없이 라우팅을 해주면 됩니다.

 


해당 작업은 root 권한으로 수행해주기 위해서 root 사용자로 변경해줍니다.

 

$ su root

 

apache 설치

우선 apache를 설치해줍니다.

# apt-get update
# apt-get install apache2

 

정상적으로 설치되었다면 서버 ip로 접속해보면 아파치기본화면이 보입니다.

자주 사용되는 Apache 설정 파일들이 어디에 위치해있는지 그리고 로그, 기본적인 시작, 종료 명령어를 정리해둡니다.

 

# 아파치 설정 디렉토리
/etc/apache2

# 아파치 기본 설정 파일
/etc/apache2/apache2.conf

# 아파치 포트 설정 파일
/etc/apache2/ports.conf

# virtual host 관리 디렉토리
/etc/apache2/sites-available/

# virtual host를 이용하기 위한 설정 디렉토리
/etc/apache2/sites-enabled/

# 모듈 설정 디렉토리
/etc/apache2/mods-available/
/etc/apache2/mods-enabled/

# 로그
/var/log/apache2

-- apache2 시작 (root권한)
# service apache2 start

-- apache2 중지 (root권한)
# service apache2 stop

-- 버전 확인
# apachectl -version

-- 모듈 사용 설정 확인
# apachectl -M

 

우리가 설정해야할 VirtualHost작업은 proxy를 사용하기 때문에 a2enmod 명령어를 통해 몇가지 모듈을 활성화해주어야 합니다. (root 권한)

 

# a2enmod rewrite
# a2enmod proxy
# a2enmod proxy_http

 

그리고 위에서 정리했던 virtual host 관리 디렉토리에 들어가서 default 파일을 수정해줍니다.

(버전에 따라서 default 파일이 다를 수 있습니다. 현재는 000-default.conf)

 

000-default-conf 파일을 열면 기본적으로 VirtualHost가 하나 있을텐데 그 아래에 추가해주시거나 기본 설정은 무의미하다면 저처럼 다 지우고 설정해주시면 됩니다.

 

아래와 같이 VirtualHost는 3가지 상황이 있습니다.

  • apache 내부 경로 설정
  • 내부 WAS 연동 (여기서는 Tomcat)
  • 내부 WAS 연동 + SSL

순서대로 정리해봅니다.

 

apache 내부 경로 설정

<!-- 값 설명 -->
<VirtualHost *:80>
	ServerName 서버이름(요청받을 도메인)
    ServerAlias 서버별칭(추가도메인 : 생략가능)
	DocumentRoot root경로
	<Directory root경로></Directory>
 </VirtualHost>
 
 <!-- 예제 -->
 <VirtualHost *:80>
	ServerName test.co.kr
    ServerAlias www.test.co.kr
	DocumentRoot /var/www/html/test
	<Directory /var/www/html/test></Directory>
 </VirtualHost>

내부 경로로 연결해주는건 프록시도 사용하지 않고 그저 Directory만 설정해주면 됩니다. 제일 간단하죠.

 

기본 연동

<!-- 값 설명 -->
<VirtualHost *:80>
	ServerName 서버이름(요청 받을 도메인)
    ServerAlias 서버별칭(추가도메인:생략가능)
	ProxyRequests 프록시요청여부 (On, Off)

	<Proxy *>
		Order deny,allow
		Allow from all
	</Proxy>

	ProxyPass 요청root경로 proxy로 전달할 경로(도메인 및 포트)
	ProxyPassReverse 요청root경로 revers proxy로 전달할 경로(도메인 및 포트)
</VirtualHost>
 
<!-- 예제 -->
<VirtualHost *:80>
	ServerName test.co.kr
	ProxyRequests Off

	<Proxy *>
		Order deny,allow
		Allow from all
	</Proxy>

	ProxyPass / http://test.co.kr:18080/
	ProxyPassReverse / http://test.co.kr:18080/
</VirtualHost>

tomcat을 18080으로 띄워두고 위와같이 설정해주면됩니다.

 

SSL 연동

<!-- 값 설명 -->
<VirtualHost *:443>
        ServerName 서버이름(요청받을 도메인)
        ServerAlias 서버별칭(추가도메인 : 생략가능)

        SSLEngine SSL엔진 설정여부(On, Off)
        SSLCertificateKeyFile   key.pem 파일 경로
        SSLCertificateFile      perm 파일 경로
        SSLCACertificateFile    crt.pem 파일 경로

        ProxyRequests 프록시 요청 여부(On, Off)

        <Proxy *>
            Order deny,allow
            Allow from all
        </Proxy>

        ProxyPass 요청root경로 proxy로 전달할 경로(도메인 및 포트)
		ProxyPassReverse 요청root경로 revers proxy로 전달할 경로(도메인 및 포트)
</VirtualHost>
<VirtualHost *:80>
        ServerName 서버이름(요청받을 도메인)
        ServerAlias 서버별칭(추가도메인 : 생략가능)
        Redirect permanent 요청root경로 리다이렉팅할 root경로
</VirtualHost>
 
<!-- 예제 -->
<VirtualHost *:443>
        ServerName test.co.kr
        ServerAlias www.test.co.kr

        SSLEngine on
        SSLCertificateKeyFile   /etc/apache2/ssl/test.key.pem
        SSLCertificateFile      /etc/apache2/ssl/test.perm
        SSLCACertificateFile    /etc/apache2/ssl/test.crt.pem

        ProxyRequests Off

        <Proxy *>
            Order deny,allow
            Allow from all
        </Proxy>

        ProxyPass / http://www.test.co.kr:9080/
        ProxyPassReverse / http://www.test.co.kr:9080/
</VirtualHost>
<VirtualHost *:80>
        ServerName test.co.kr
        ServerAlias www.test.co.kr
        Redirect permanent / https://www.test.co.kr/
</VirtualHost>

SSL 인증서를 붙인 경우에는 80포트로 들어오는 경우 433포트로 리다이렉팅해주는 로직과 SSL 엔진 작동여부 및 SSL과 관련된 파일들의 경로를 추가해주면 됩니다.