예전에는 jsp 등과 같은 서블릿를 이용한 웹 서비스를 할때 보통 was 앞단에 httpd 서버를 두고 서비스를 했다.
물론 어디까지내 내 생각이긴 하지만 오래전 우리나라에서는 apache + tomcat, webtoB + jeus 조합이 가장 널이 사용되는 조합이었다.
지금은 톰캣의 성능이 많이 좋아져서, 사실 apache 등과 같은 httpd 를 두지 않아도 된다.
예를들어 xml, json 과 같은 동적 문서만을 서비스하는 경우 굳이 httpd를 사용할 필요는 없다.
httpd를 연동 할것인가 아닌가는 서비스의 목적, 시스템 구성에 따라 고려해야 하는게 맞다.
개인적인 소견으로는 맹신적인 httpd + 서블릿 컨테이너의 조합은 옳지 않다.
그럼에도 불구하고 내가 apache와 tomcat을 실제 서비스에서 연동하여 사용하는 이유는 크게 다음과 같다.
1. 80 포트의 사용권한 - 리눅스에서 ~1024 포트까지는 root 계정만 사용이 가능하므로, tomcat을 80 포트로 운영하기에는 문제가 있다.
2. 정적 데이터 처리 - 톰캣의 성능이 아무리 좋아졌다고 해도, image/css 등과 같은 정적 데이터는 httpd에서 처리하는게 더 믿음직 하다. 또한 압축등과 같은 정적 데이터를 처리하는 다양한 옵션등이 존재한다.(물론 압축 전송 옵션은 톰캣7에도 있다)
3. 로드 밸런싱 - 동일 서버내에서 한 서비스를 여러 tomcat에서 서비스하고자 할때 사용한다. apache를 연동하는 가장 큰 목적이다. |
자. 그러면 apache + tomcat 연동을 하나씩 해보자.
아래 설정방법은 apache2.2 와 tomcat7을 이용한 설정방법이다.
tomcat의 버전은 6 이상이면 큰 상관은 없지만, apache의 경우 2.4 는 조금 다를 수 있다.
1. 톰캣 커넥터 설치
[root@tourWeb1 ~]# cd /usr/local/src [root@tourWeb1 ~]# wget http://www.apache.org/dist/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.40-src.tar.gz [root@tourWeb1 ~]# tar zxvf tomcat-connectors-1.2.40-src.tar.gz [root@tourWeb1 ~]# cd tomcat-connectors-1.2.40-src/native [root@tourWeb1 ~]# ./configure --with-apxs=/usr/local/apache2/bin/apxs [root@tourWeb1 ~]# make [root@tourWeb1 ~]# make install |
apxs의 경로는 본인의 apache가 설치되어 있는곳으로 지정하면 된다.
커넥터는 apache 사이트에 가면 최신버전을 다운받을 수 있다 : http://tomcat.apache.org/connectors-doc/
2. 모듈 설치확인
[root@tourWeb1 ~]# cd /usr/local/apache2/module [root@tourWeb1 ~]# ll | grep mod_jk.so -rwxr-xr-x 1 root root 905398 7월 1 13:56 mod_jk.so [root@tourWeb1 ~]# |
3. httpd.conf에 mod_jk 추가
[root@tourWeb1 ~]# cd /usr/local/apache2/conf [root@tourWeb1 ~]# vi httpd.conf
httpd.conf 제일 하단에 아래 내용 추가
LoadModule jk_module modules/mod_jk.so <IfModule mod_jk.c> JkWorkersFile conf/workers.properties JkLogFile logs/mod_jk.log JkLogLevel info </IfModule> |
4. workers.properties 작성
[root@tourWeb1 ~]# cd /usr/local/apache2/conf [root@tourWeb1 ~]# vi workers.properties
worker.list=worker1, worker2 worker.worker1.port=8009 worker.worker1.host=localhost worker.worker1.type=ajp13 worker.worker1.lbfactor=1
worker.worker2.port=18009 worker.worker2.host=localhost worker.worker2.type=ajp13 worker.worker2.lbfactor=1 |
* 연동시키는 톰캣 서비스 추가시 worker.list에 worker 이름을 추가하고 밑으로 계속 작성하면 된다.
5. virtualhost 설정
[root@tourWeb1 ~]# cd /usr/local/apache2/conf [root@tourWeb1 ~]# vi httpd.conf
NameVirtualHost *:80
# http://www.test.com 으로 들어오는 URL 처리
<VirtualHost *:80> ServerAdmin webmaster@test.com ServerName test.com ServerAlias www.test.com DocumentRoot /home/tour/test/doc/WebContent # 정적 데이터 처리를 위한 서비스 경로 <Directory "/home/tour/test/doc/WebContent"> Options -Indexes MultiViews AllowOverride None Order allow,deny Allow from all </Directory> DirectoryIndex index.jsp
<LocationMatch "/WEB-INF"> deny from all </LocationMatch>
<LocationMatch "/META-INF"> deny from all </LocationMatch>
TransferLog "|/usr/local/apache2/bin/rotatelogs /usr/local/apache/logs/test.com-Transfer_log_%y%m 86400" ErrorLog /usr/local/apache/logs/test.com-error_log
JkMount /*.jsp worker1 # 확장자가 jsp 인 호출을 worker가 처리하게 함.
</VirtualHost>
# http://m.test.com 으로 들어오는 URL 처리
<VirtualHost *:80> ServerAdmin webmaster@test.com ServerName m.test.com ServerAlias m.test.com DocumentRoot /home/tour/test/m/doc/WebContent # 정적 데이터 처리를 위한 서비스 경로 <Directory "/home/tour/test/m/doc/WebContent"> Options -Indexes MultiViews AllowOverride None Order allow,deny Allow from all </Directory> DirectoryIndex index.jsp
<LocationMatch "/WEB-INF"> deny from all </LocationMatch>
<LocationMatch "/META-INF"> deny from all </LocationMatch>
TransferLog "|/usr/local/apache2/bin/rotatelogs /usr/local/apache/logs/m.test.com-Transfer_log_%y%m 86400" ErrorLog /usr/local/apache/logs/m.test.com-error_log
JkMount /*.jsp worker2 # 확장자가 jsp 인 호출을 worker가 처리하게 함.
</VirtualHost> |
5. apache 재시작(stop, start)
1개의 도메인에 대하여 톰캣 2개로 서비스하는 방법이다. 각각의 톰캣은 포트만 달리하고 동일한 설정을 유지하는게 좋다.
1. workers.properties 수정
[root@tourWeb1 ~]# cd /usr/local/apache2/conf [root@tourWeb1 ~]# vi workers.properties
worker.list=worker1, worker2, worker3, load_balance worker.worker1.port=8009 worker.worker1.host=localhost worker.worker1.type=ajp13 worker.worker1.lbfactor=1
worker.worker2.port=18009 worker.worker2.host=localhost worker.worker2.type=ajp13 worker.worker2.lbfactor=1
worker.worker3.port=28009 worker.worker3.host=localhost worker.worker3.type=ajp13 worker.worker3.lbfactor=1
worker.load_balance.type=lb worker.load_balance.balanced_workers= worker1, worker3 |
* load_balance는 worker1과 worker3을 이용한다.
* lbfactor는 로드밸런싱 비율이다. 1:1, 1:5 등과 같이 로드밸런싱 비율을 지정할 수 있다.
2. virtualhost 수정
<VirtualHost *:80> ServerAdmin webmaster@test.com ServerName test.com ServerAlias www.test.com DocumentRoot /home/tour/test/doc/WebContent # 정적 데이터 처리를 위한 서비스 경로 <Directory "/home/tour/test/doc/WebContent"> Options -Indexes MultiViews AllowOverride None Order allow,deny Allow from all </Directory> DirectoryIndex index.jsp
<LocationMatch "/WEB-INF"> deny from all </LocationMatch>
<LocationMatch "/META-INF"> deny from all </LocationMatch>
TransferLog "|/usr/local/apache2/bin/rotatelogs /usr/local/apache/logs/test.com-Transfer_log_%y%m 86400" ErrorLog /usr/local/apache/logs/test.com-error_log
JkMount /*.jsp load_balance
</VirtualHost> |
3. tomcat conf/server.xml jvmRoute 추가
- tomcat_1
<Connector port="8009" protocol="AJP/1.3"/> <!-- 아파치와 연동하기 위한 포트 -->
<!-- jvmRoute 지정--> <Engine jvmRoute="worker1" name="Catalina" defaultHost="localhost"> <Host name="localhost" appBase="webapps"/> </Engine> |
- tomcat_2
<Connector port="28009" protocol="AJP/1.3"/> <!-- 아파치와 연동하기 위한 포트 -->
<!-- jvmRoute 지정--> <Engine jvmRoute="worker2" name="Catalina" defaultHost="localhost"> <Host name="localhost" appBase="webapps"/> </Engine> |
* jvmRoute는 JK 커넥터에서 톰캣 프로세스를 구분하는데 사용된다. 그렇기때문에 톰캣 프로세스별로 서로 다른 이름을 가져야 한다.
4. 서비스 확인
톰캣 및 아파치 재시작후 정상적으로 뜨는지 확인한다.
정상으로 확인이되면 한쪽 톰캣을 정지시킨후 로드밸런싱이 되는지 확인한다.