Linux Apache2, Tomcat 연동 및 로드밸런싱 설정

2018. 9. 3. 16:03 Server, WAS/Tomcat

예전에는 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. 서비스 확인
   톰캣 및 아파치 재시작후 정상적으로 뜨는지 확인한다.
   정상으로 확인이되면 한쪽 톰캣을 정지시킨후 로드밸런싱이 되는지 확인한다.



출처: http://fruitdev.tistory.com/25?category=558549 [과일가게 개발자]