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과 관련된 파일들의 경로를 추가해주면 됩니다.