아파치 톰캣 연동하기
웹페이지는 동적 data와 정적 data가 존재한다.
톰캣은 WAS서버이지만 WEB서버의 기능도 갖추고 있다.
하지만 톰캣의 웹서버기능은 아파치 웹서버보다 느린 처리속도를 보였고, 웹의 모든 정적/동적 데이터를 모두 WAS가 처리한다면 결과적으로 사용자의 요청의 응답이 느려지게 될 것이다.
때문에 정적 데이터는 웹서버인 아파치가 처리하고 동적 데이터는 와스인 톰캣이 처리함으로써 서버의 전체적인 부하를 분산하고 속도를 빠르게 하기 위해 연동을 해서 사용하는 것이다.
지금은 톰캣이 많이 발전해서 톰캣의 웹서버가 아파치에 뒤쳐지지 않을만큼의 기능을 하지만 그럼에도 불구하고 연동하는 이유는 아파치내에서만 설정할 수 있는 부분이라던가, 아파치에서 제공하는 유용한 모듈을 톰캣에서는 사용할수 없는 부분 등의 이유가 있다.
그러므로 아파치와 톰캣을 연동하여 처리영역을 분담하고, 더 많은 기능을 지원하게 하여 안정적인 운영을 하도록 하기 위해 번거롭더라도 연동을 많이 하고있다.
아파치 - 톰캣 연동 동작 플로우
1. 아파치 웹서버의 httpd.conf에 톰캣 연동을 위한 설정을 추가하고 톰캣에서 처리할 요청을 지정한다.
2. 사용자의 브라우저는 아파치 웹서버에 접속하여 요청한다. (통상 80 port )
3. 아파치 웹서버는 사용자의 요청이 들어왔을때, 이 요청이 톰캣에서 처리되도록 지정된 요청인지 확인한다.
4. 톰캣에서 처리해야하 하는 경우 아파치 웹서버는 톰캣의 AJP 포트(통상 8009 port) 에 접속해 요청을 톰캣에게 전달한다.
5. 톰캣은 아파치 웹서버로부터 요청을 받아 처리한 후, 처리 결과를 다시 아파치 웹서버에게 돌려준다.
6. 아파치 웹 서버는 톰캣으로 전달받은 처리 결과를 사용자에게 전송한다.
연동 작업준비
서버에 아파치, 톰캣을 각각 설치 후 mod_jk 모듈 다운로드 하여 압축 풀기
mod_jk 다운로드 경로
https://tomcat.apache.org/download-connectors.cgi
mod_jk (tomcat-connector)는 톰캣 사이트에서 배포되는 것이고, 아파치 내부에 설치한다.
ajp를 통한 통신방식
1. mod_jk 파일 생성하기
# yum install autoconf libtool
해당 툴 설치 필요, 설치 후 tomcat-connectors 폴더의 native 안에 들어가기
native폴더안의 buildconf.sh 실행하고 설치한 apache폴더 내의 bin/apxs 파일 configure등록 후
make & make install 실행하기
# ./buildconf.sh
# ./configure --with-apxs=/usr/local/lib_manual/apache2.4.48/bin/apxs
(주의! apxs 경로를 찾을 수 없다고 오류 뜰 수 있다.
해결방법! 이것때문에 3시간해맸다.
#vi apxs
--맨상단에 perl문 수정--
#!/replace/with/path/to/perl/interpreter -w 를 #!/usr/bin/perl 로 수정
도움 https://m.blog.naver.com/57540922/220940988816
뒤에
)
# make
# make install
작업이 수행되면 현재경로의 apache-2.0 폴더 안에 mod_jk.so 가 들어있을 것이다.
이를 복사하여 아파치 모듈 폴더에 붙여넣기
# cd apache-2.0
# cp mod_jk.so /usr/local/lib_manual/apache2.4.48/modules
2. 아파치 설정파일 수정
아파치의 설정 파일이 있는 conf폴더에 mod_jk 관련 설정 추가하기
# vi httpd.conf
LoadModule jk_module modules/mod_jk.so
# workers.properties file
JkWorkersFile conf/workers.properties
JkMountFile conf/uriworkermap.properties
# log file
JkLogFile logs/mod_jk.log
# load balancing workers will not function, error check
JkShmFile logs/mod_jk.shm
# log level
JkLogLevel info
# log file time format
JkLogStampFormat "[%y %m %d %H:%M:%S] "
#jsp .json .xml .do file will exacute on tomcata
JkMount /*.jsp instance1
JkMount /*.json instance1
JkMount /*.xml instance1
JkMount /*.do instance1
3. worker 등록, 로드 밸런스 설정
아파치의 conf 폴더 내에서 workers.properties 생성 후 아래 내용 입력 후 저장
# vi workers.properties
workers.tomcat_home=/usr/local/lib_manual/apache-tomcat-9.0.41
worker.list=instance1,instance2
worker.list=balancer
worker.instance1.port=8009
worker.instance1.host=0.0.0.0
worker.instance1.type=ajp13
worker.instance1.lbfactor=1
worker.instance2.port=8109
worker.instance2.host=localhost
worker.instance2.type=ajp13
worker.instance2.lbfactor=1
worker.balancer.type=lb
worker.balancer.balance_workers=instance1, instance2
worekr.balancer.sticky.sticky_session=TRUE
worker 이름: worker 이름은 정하기 나름이지만 각각 뒷단의 Tomcat 서버를 구분할 수 있는 이름이여야 한다. 이 worker 이름은 나중에 로드밸런싱을 할때에 Tomcat 에도 적용되어지는 이름이기에 잘 설정해야 한다.
worker port: 여기서 말하는 port 는 뒷단 Tomcat 서버의 AJP 포트를 말한다.
worker type: 이건 ajp13 으로 설정하면 된다.
worker lbfactor: 부하분산을 위한 설정으로 뒷단 Tomcat 서버들에 연결 무게를 설정해준다.
----------------
그리고 로드밸런스 설정을 위해 uriworkermap.properties 생성한다.
로드밸런스라고 하면 instance1 인스턴스가 응답하지 않을 경우에 다른 서버들이 그 역할을 대신하는 것을 말한다. 이를 위해서는 woker 설정을 변경해주고 urlworkermap 설정을 추가해주어야 한다.
위와 같이 conf폴더 내에 생성
# vi uriworkermap.properties
그리고 아래의 한줄 추가
/*=balancer
conf 폴더에서 workers.properties uriworkermap.properties 이 두가지파일이 만들어졌다면 굿굿
4. tomcat에서의 설정 변경
아파치에서 톰캣과 연동을 위한 설정을 했듯이 톰캣에서도 변경해줘야 하는 부분이 있다.
JvmRoute 설정인데 방법은 두가지가 있다.
- 1) tomcat 구동시 커맨드라인으로 값을 추가하는 방식
- 2) server.xml 파일 편집하기(추천)
server.xml 파일의 Engine 태그에 jvmRoute 설정을 추가하자.
아까 workers.properties에 추가한 워커 중 하나를 넣어주면 된다.
그리고 톰캣의 http 접속 포트를 disable 처리 해주고 ajp 접속 포트를 활성화 하자.
이제 tomcat자체 만으로 웹서버를 실행하는 것이 아니기 때문에 열어둘 필요가 없으며
apache에서 mod_jk를 통한 ajp통신으로 jsp나 동적 파일들을 실행하기 위함이다.
설정이 완료되었다면 저장 한다.
5. 웹 파일 경로 지정
이부분은 대부분의 포스팅에서 생략되어 있었다. 이유는 모르겠지만.
지금까지 한 작업들을 정리하자면 apache와 tomcat을 연동시켜 이미지 등 정적인 작업들은 apache
jsp나 spring기반 등 동적인 작업들은 tomcat을 통해 작동한다.
그렇다면 실행할 web파일의 경로는 어디서 설정하는 걸까?
답은 apache와 tomcat 모두 다 설정해줘야한다.
하나의 웹 프로젝트를 기준으로 동일하게 설정해 줘야한다. 다르게 설정된다면 에러가 뜨며 정상적으로 실행되지 않는다.
tomcat에서의 설정
host안의 appBase와 Context의 docBase의 조합으로 "/home/webpolder/drow"경로에 웹 파일을 넣고 싶을때 이렇게 작성한다.
만약 spring 프로젝트로 war파일을 넣고싶다면 아래사진을 보자
조합상으로 보면 "/home/webpolder/bcomfile.war" 경로대로 파일이름까지 정확하게 맞추어 war파일을 저장해야한다.
apache에서의 설정
jsp를 이용하는 경우 apache에서는 읽어들일 수 없다.
tomcat을 이용해야 하는데 mod_jk 를 설정파일에만 넣는다고해서 알아서 실행될거라 생각했는데 아니었다.
어떤 port와 어떤 주소로 접속하는지 설정하고 어떤 worker를 지정하여 tomcat처리를 맡길지 추가로 설정해야 한다.
그래야 실제로 사용할 port들을 관리하고 tomcat과 연동시키며 로드밸런싱 작업도 수행할 수 있다.
이를 위해 vhosts.conf 파일을 만들것이다.
먼저 httpd.conf파일에 vhosts.conf파일을 이용하기 위한 설정을 추가하자.
소스의 가장 아래쪽에 추가한다.
<Directory> 태그가 있어야 해당 경로를 web파일의 경로로 사용할 수 있다.
그리고 apache폴더/conf/extra 를 보면 httpd-vhosts.conf 라는 샘플 파일이 있다. 이를 복사하여 conf폴더에 vhosts.conf를 만들자
# cd apache폴더/conf/extra
# cp httpd-vhosts.conf ../vhosts.conf
# cd ..
httpd.conf에 이미 vhosts.conf를 이용하도록 설정을 추가한 상태이므로 vhosts.conf를 편집하자.
# vi vhosts.conf
vhost파일 이라고 부르기도 하는데 가상 호스트를 여러개 등록하여(<VirhualHost 태그 2개이상 이용> 아파치 하나로 여러개의 웹 프로젝트를 실행시키는 것도 가능하기에 vhosts라고 파일 이름을 정했다.
중요한 부분은 DocumentRoot 의 값이 웹 파일이 들어갈 경로이다. tomcat과 같이 "/home/webpolder/drow"가 되도록 입력해주자.
만일 war파일을 통해 스프링 프로젝트를 실행하기 원한다면, war파일의 경로를 입력해주자.
/home/webpolder/bcomfile.war 파일에서 확장자는 빼고 입력해준다.
ServerName, ServerAlias는 사용할 도메인네임을 입력해준다.
가상의 도메인을 이용하려면 원하는 도메인 입력한 뒤에 /etc/hosts 파일에 등록시켜주고 테스트하면 된다.
저장 후 apache와 tomcat을 재시작 시키고 테스트하면 된다.
만일 오류가난다면, apache의 logfile을 참조하여 어떤부분에 문제가 있는지 추적해보자.
mod_jk 를 이용한 아파치와 톰캣의 연동작업은 설정이 복잡하며, 사용자마다 사용하는 툴의 버전이나 경로, 주소 값, 등 많은것이 다르기에 블로그 한두개를 따라서 한다고 해도 제대로 되지 않는 경우가 많다.
나도 잘 모르는 경우였기에 하루하고 반나절에 걸쳐서 여러가지 시행착오를 거치며 겨우 연동에 성공했다.
때문에 이렇게 기쁘게 리뷰를 작성하며, 혹시라도 다른 문제가 생긴다면 apache의 log파일을 잘 참조해보는것이 도움된다.
연동후 실행하는데 페이지에 403, 503, 무한로딩 오류가 있다면 아래의 글을 참조
https://teck10.tistory.com/191
아파치 톰캣 연동작업시 오류/ 403 404 503 에러 잡기
연동작업 후 테스트를 진행하는데 생기는 오류들 해결방법 정리해봤다! 테스트 작업 하는데 권한없다고 403에러 뜨는경우! - Directory 태그에 활성화된부분 내에서 DocumentRoot를 지정 안한 경우, http
teck10.tistory.com