본문 바로가기
이카루스의 날개/JSP

RedHat Linux 7.2 에어 Apache 1.3과 Tomcat 4.1.29 연동 : mod_jk2

by 윙혼 2007. 5. 31.

apache-tomcat-4.1.36-LE-jdk14.tar.gz
apache_1.3.37.tar.gz

RedHat Linux 7.2 에어 Apache 1.3과 Tomcat 4.1.29 연동 : mod_jk2
손권남(kwon37xi@yahoo.co.kr)

RedHat Linux 7.2 에서 기본적으로 제공되는 Apache 1.3과 Tomcat 4.1.29 연동에 관한 정리.

아파치의 설치
Apache는 레드햇에 의해 기본제공되는 rpm 파일로 설치합니다. 1.3 대라면 버전이 조금 다르다
해도 상관 없다.

업데이트된 버전을 이용해서

# rpm -Uvh apache-devel-1.3.27-3.7.2.rpm
# rpm -Uvh apache-apache-1.3.27-3.7.2.rpm
“apachectl start” 명령을 실행하고 브라우저로 이 리눅스에 접속해 보라. 아파치 소개 화면이
뜬다면 성공한 것이다.

아파치를 리눅스를 켤 때마다 자동으로 실행하고 싶다면 ntsysv 명령을 실행하고 httpd 부분에
체크표시를 하면된다. 이후부터는 명령을 치지 않고도 컴퓨터를 켜면 항상 실행된다.

JAVA(J2SDK 설치)
톰캣을 사용하려면 J2SDK가 필요하다. http://java.sun.com/downloads/index.html 에서
리눅스용 rpm을 받는다. 1.3.1 버전을 받았다면 다음과 같이 rpm 위에 .bin 이 붙어있다.

j2sdk-1_3_1_10-linux-i586.rpm.bin
이것을 설치하려면

bin 파일을 rpm으로 바꾸기 - 라이센스 동의를 요구하기 위해서 bin 파일로 배포한 것이다.
# chmod +x j2sdk-1_4_2_03-linux-i586-rpm.bin
파일 실행
# ./j2sdk-1_4_2_03-linux-i586-rpm.bin
라이센스 문서이다. q 를 누르면 문서 읽기를 마칠 수 있다. 라이센스에 동의 하는지 여부를
물어볼 것이다. 동의하면 yes 싫으면 만다.
실질적인 설치
# rpm -Uvh j2sdk-1_4_2_03-linux-i586-rpm.bin
이 자바를 모든 사람들이 동일하게 사용하길 원한다면 /etc/profile.d 에 셸 스크립트를 하나
추가해 주면 된다. 파일 이름은 java.sh 로 한다. 아래는 파일의 내용

JAVA_HOME=/usr/java/jdk1.3.1_10
export JAVA_HOME


PATH=$PATH:$JAVA_HOME/bin
이제 부터 모든 사용자(tomcat 포함)가 이 자바 환경을 사용하게 되었다. 이것이 실제 적용
되려면 잠시 로그아웃 했다가 다시 로그인하거나 “. /etc/profile.d/java.sh” 명령을 실행
하면 된다. 맨 앞의 점에 주의하라.

톰캣의 설치
톰캣은 http://jakarta.apache.org 에서 받는다.

톰캣설치는 새로운 계정을 만들어서 그 계정에 설치하길 권한다. 안그러고 root에 해도
상관은 없지만 보안상 권장되는 방법은 아님.

계정 만들기
# useradd -d /home/tomcat -m tomcat
# passwd tomcat
여기서 비밀번호를 물어보면 새로운 tomcat 계정을 위한 비밀번호를 입력해준다.


톰캣 계정으로 로그인 하여 톰캣 파일을 /home/tomcat에 복사
# su - tomcat
$ tar xvzf jakarta-tomcat-4.1.29.tar.gz
이것으로 설치는 끝! 톰캣이 작동하는지 보려면

$ jakarta-tomcat-4.1.29/bin/startup.sh
브라우저로 이 리눅스 머신에 접속해본다. 접속할때 포트번호로 8080을 줘야한다. 예) http://localhost:8080

고양이 화면이 뜨면 성공한 것이다.

mod_jk2 를 이용한 아파치 1.3과 톰캣의 연동
이제 본론이다. mod_jk2 를 이용해서 아파치 1.3과 톰캣을 연동하면 뒤에 8080을
안붙이고도 JSP웹 컨텍스트에 접속이 가능해진다. HTML과 이미지 같은 정적인
자료는 그에 대해 최적의 성능을 내는 아파치가 담당하고 JSP나 서블릿같은 동적인
부분은 그것을 톰캣이 처리하게 된다.

mod_jk2 는 다음에서 받는다.

http://ftp.apache-kr.org/jakarta/tomcat-connectors/jk2/
솔라리스나 윈도우는 컴파일된 버전을 제공해주기도 한다. 리눅스용은 직접 컴파일해야
한다.

다음을 받는다.

jakarta-tomcat-connectors-jk2-src-current.tar.gz
컴파일을 한다. 컴파일을 하기전에 libtool 패키지가 설치되어 있는지 확인한다.
(보통 설치되어 있다)

# rpm -qa | grep libtool
libtool-libs-1.4-8
libtool-1.4-8
저렇게 두 개의 패키지가 설치되어 있으면 된다.

컴파일을 시작해 보자. tomcat 계정으로 로그인 해서 작업한다. 커넥터의 디렉토리
명은 자기 것에 맞게 하면 된다.

# su - tomcat
$ cd jakarta-tomcat-connectors-jk2-2.0.2-src/jk/native2
$ ./configure --with-apxs=/usr/sbin/apxs --with-tomcat41=/home/tomcat/jakarta-tomcat-4.1.29
jakarta-tomcat-connectors-jk2-2.0.2-src/jk/build/jk2/apache13 에 mod_jk2.so 생성됨
생성된 mod_jk2.so 파일을 /etc/httpd/modules 로 복사한다. root 계정으로 해야한다.

# cp jakarta-tomcat-connectors-jk2-2.0.2-src/jk/build/jk2/apache13/mod_jk2.so /etc/httpd/modules/



/etc/httpd/conf/httpd.conf 편집 - 다음 두 줄을 적당한 위치에 추가한다.

LoadModule jk2_module modules/mod_jk2.so
AddModule mod_jk2.c
AddModule 의 경우 아파치 2에서는 불필요하나 1.3에서는 필수이다.

httpd.conf 의 DirectoryIndex 를 찾아 index.jsp 를 추가한다. 다음과 같은 형태가 될 것이다.

<IfModule mod_dir.c>
DirectoryIndex index.html index.htm index.shtml index.php index.php4 index.php3 index.phtml index.cgi index.jsp
</IfModule>
톰캣의 server.xml 살펴보기
기본적으로 톰캣에서는 server.xml 에 아파치와 연동하는 부분이 설정되어 있다. 그래도
혹시 모르니 아래와 같은 부분이 있는지 확인하고 없다면 추가하고 주석처리 되어 있다면
주석을 풀어주라.

<Connector className="org.apache.coyote.tomcat4.CoyoteConnector"
port="8009" minProcessors="5" maxProcessors="75"
enableLookups="true" redirectPort="8443"
acceptCount="10" debug="0" connectionTimeout="0"
useURIValidationHack="false"
protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler"/>
workers2.properties 작성
파일이름에 주의하라. workers2.properties 이다.

이 파일을 /etc/httpd/conf 디렉토리에 작성해 주고 다음 내용으로 채운다.

[shm:]
file=/etc/httpd/logs/jk2.shm
size=1000000


# Example socket channel, explicitly set port and host.
[channel.socket:localhost:8009]
port=8009
host=127.0.0.1


# define the worker
[ajp13:localhost:8009]
channel=channel.socket:localhost:8009


# Web Context Setup
[uri:/examples/*]
worker=ajp13:localhost:8009


[uri:/examples]
worker=ajp13:localhost:8009
# Web Context Setup 이전 부분은 모두 동일하다. # Web Context Setup 이후 부분이 실제
톰캣의 웹 컨텍스트와 연결하는 부분이다.

기본적으로 톰캣을 설치하면 항상 따라오는 /examples 웹 컨텍스트를 추가했는데, 위와 같이 [uri:/examples/*] 로 설정하면 http://hostname/examples 를 호출했을 때아파치가 자동으로 hostname/examples/ 의 모든 내용을 톰캣의 http://hostname:8080/exmples 로 넘겨준다고
생각하면 된다.

웹 브라우저에서 주소를 칠때 맨 끝에 “/”를 붙여도 되고 안붙여도 되는데 만약 [uri:/examples]
를 빼먹으면 브라우저에서 http://hostname/examples 와 같이 “/” 없이 호출할 경우 오류가
발생한다. 모든 웹 컨텍스트에 대해서 [uri:/contextname/*] 과 [uri:/contextname] 을 추가
해주도록 한다.

여기서 문제점이 [uri:/contextname/*] 처럼 하면 .jsp나 서블릿 뿐만 아니라 .html 과
이미지등 까지 모두 톰캣이 처리한다는 것이다. jsp 만을 처리하고 나머지는 아파치가
처리하게 하려면 [uri:/contextname/*.jsp], [uri:/contextname/servlet/*] 와 같이 하면
된다.

웹 컨텍스트 설정
톰캣의 웹 컨텍스트와 그것을 아파치에 연동하는 법에 대해서 더 자세히 알아본다.

톰캣에 새로운 웹 컨텍스트를 추가하는 방법은 $CATALINA_HOME/conf/server.xml 에
다음과 같이 해주는 것이다. 주의할 것은 아무데나 추가하면 안된다. 어디에 추가해야
할지 모르겠으면 examples 컨텍스트부분을 찾아 그 위에 추가하면 된다.

<Context path="/newcontext" reloadable="true" docBase="/home/tomcat/projects/newcontext"/>
path=newcontext 는 바로 주소창에 치고 들어갈 경로이다. 예) http://localhost/newcontext

docBase는 리눅스상의 *.jsp와 WEB-INF 디렉토리등이 설치된 디렉토리이다.

톰캣을 재시작하면 이제 저 컨텍스트를 사용할 수 있게 된 것이다. 하지막 아직 아파치와는
연동이 안되어있다.

/etc/httpd/conf/workers2.properties 를 열어서 uri 만 삽입해주면된다.

[uri:/newcontext]
worker=ajp13:localhost:8009
[uri:/newcontext/*.jsp]
worker=ajp13:localhost:8009
[uri:/newcontext/servlet/*]
worker=ajp13:localhost:8009
이것으로 workers2.properties 파일의 설정이 끝났다.

위에서도 말했듯이 [uri:/newcontext/*.jsp]와 [uri:/newcontext/servlet/*] 대신에 [uri:/newcontext/*]만 해도 된다. 하지만 이것은 정적인 객체(html, 이미지 등)까지도
톰캣이 처리하게 되어 아파치로 처리시킬 때보다 성능이 떨어지게 된다.

그러므로 .jsp와 서블릿만을 톰캣이 처리하게 설정하는 것이 좋으며, 특히 서블릿의 경우
에는 서블릿의 매핑을 모두 /servlet/서블릿이름 이 되게 하는 것이 좋다. 그렇게 하면
위와 같이 [uri:/newcontext/servlet/*]만으로도 서블릿을 처리하게 할 수 있다. 만약
서블릿의 실행 경로를 /servlet/ 이하로 두지 않고 뒤죽 박죽이 되게 하였을 경우에는
각각의 서블릿에 대해 모두 [uri:]를 지정해줘도 된다.

[uri:/newcontext/*]로 했을 경우에는 상관없지만, *.jsp와 서블릿만을 톰캣이 처리
하게 했을 경우에는 아파치의 httpd.conf 에서도 정적인 객체 처리를 위해 몇가지
설정이 필요하다.

/etc/httpd/conf/httpd.conf 를 열고 다음을 추가한다.

Alias /newcontext "/home/tomcat/projects/newcontext/"

<Directory "/home/tomcat/projects/newcontext">
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>

# WEB-INF 접근을 못하게 막음 - 이 부분을 빼먹으면 WEB-INF가 접근 가능하게 되어
보안에 매우 치명적일 수 있다.
<Directory "/home/tomcat/projects/newcontext/WEB-INF">
Order allow,deny
Deny from all
</Directory>
httpd.conf 에서 Alias 를 설정해 주면 [uri:/newcontext] 이 부분이 없어도 “/” 없이 접속
가능하다.

주의!!

디렉토리 이름 등에서 슬래시(/)의 존재 여부에 주의하라. 슬래시 하나에 따라 작동방식이
달라진다.

또한 여기서 /home/tomcat 의 권한이 others 에게 x 권한이 없을 경우(권한 부분의
맨마지막에 x) 아파치는 이 디렉토리에 접근하지 못하게 된다.

즉, ls -la /home 했을 때 tomcat 디렉토리의 권한은 drwx-----x 와 같이 맨 마지막에
꼭 x 가 있어야 한다. 이렇지 않다면 chmod o+x /home/tomcat 명령을 실행하여
이렇게 만들어라.

둘째로 newcontext 디렉토리의 모든 상위 디렉토리들(여기서는 projects)도 마찬
가지이다. 모두 최소한 others 에게 x 권한을 줘야만 한다.

이 문제를 피해갈 수 있는 방법은 톰캣 자체를 아파치와 같은 사용자명(보통은
apache 혹은 nobody 이다. httpd.conf 에서 User 항목을 보라.)과 그룹으로
실행하는 것이다. 그리고 모든 컨텍스트 디렉토리를 아파치와 동일한 사용자
권한으로 만들라.

결론
리눅스/유닉스/윈도우나 아파치 2.0버전도 mod_jk2를 컴파일하는 부분과
AddModule 설정이 없는 것만 빼고 다른 모든 설정이 이와 동일하므로 어렵지
않게 응용 가능하다.

댓글