일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- action
- 프로세스
- Site Reliability engineering
- Reducer
- 쿠버네티스
- SRE
- 모캠
- #api 문서화
- Redux
- React
- 카카오게임즈
- 쿠버네티스 컨트롤러
- Kubernetes
- #Swagger-editor
- #Swagger-ui
- #Swagger-codegen
- #스웨거
- javascript
- ecs
- 기술PM
- AWS
- 프로세스 통신
- fluentd
- React.js
- server
- 북딜
- 모두의캠퍼스
- IP
- docker
- #Swagger
- Today
- Total
탕구리's 블로그
Apache와 Tomcat 연동(feat. mod_jk) 본문
오늘은 아파치와 톰캣을 연동하며 삽질한 내용을 간단하게 정리할거에요!
구조는 아래와 같습니다.
아파치가 http(s) 요청을 받으면 커넥터를 통해 자바 어플리케이션이 띄워져 있는 톰캣으로 연결시켜주는 구조예요.
그림에 적혀있는 mod_jk는 아파치와 톰캣을 연결해주는 커넥터 역할을 합니다.
우선, 세 가지 어플리케이션을 설치를 진행합니다. 저는 리눅스에 바이너리로 직접 설치를 했어요
아래와 같은 환경에서 연동하는 작업을 진행했습니다.
os: centos7
apache : 2.4.41
tomcat : 9.0.30
connector: 1.2.46
java: openjdk1.8
위에 명시된 어플리케이션이 설치하고 연동하는 작업들을 진행했습니다.
1. apache를 설치하며 apr에 대한 라이브러리들을 같이 설치
2. apr, apr-util 파일들을 apache가 구동 시 읽을 수 있도록 httpd/srclib로 이동
3. httpd.conf 파일 수정
- LoadModule jk_module modules/mod_jk.so 추가
- VirtualHost 설정 추가
4. tomcat-connector 설정 변경
- path/conf -> uirworkermap.properties, workers.properties 수정
5. tomcat 설정 변경
- path/conf -> server.xml 수정
httpd.conf에 대한 설정이나 connector의 workers.properties에 대한 설정은
필요한 설정 옵션들을 찾아보면 그리 어렵지 않게 설정 가능해요.
위와 같이 다섯 가지 과정을 진행하며 연동 작업을 진행했어요.
처음 연동을 진행하고 기본 테스트까지는 잘 진행되었는데, 원하는 대로 각종 설정을 바꾸는 과정에서 문제가 발생했습니다. 시간을 엄청 잡아먹게 했던 내용은 tomcat의 server.xml 파일을 설정하면서 OTL...
1. tomcat에서 *. war 파일 경로를 제대로 찾지 못하는 문제
2. *. war파일의 unpacking이 제대로 이루어지지 않았던 문제
우선 톰캣에서 사용하는 server.xml 파일의 설정은 아래와 같아요.
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="/home/test/tomcat/webapps" unpackWARs="true" autoDeploy="false">
<Context path="" docBase="ROOT.war" reloadable="true"/>
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="localhost_access_log."
suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
server.xml 파일은 다음과 같은 설정을 할 수 있어요.
- 톰캣이 apache로부터의 요청을 받기 위한 APJ 프로토콜로의 사용과 포트 설정
- http를 통해 들어오는 요청 허용과 포트 설정
저는 ajp 프로토콜에 대한 포트와 http에 대한 포트를 사용할 수 있도록 설정했어요.
ajp 프로토콜은 mod_jk 모듈을 통해 tomcat으로 연결해주는 프로토콜입니다.
http는 저희가 아는 그 http 통신이구요.
<Host /> 설정은 가상 호스트에 대한 설정을 담당하며 호스트를 구성함에 있어서 사용될 각종 설정이 가능합니다.
저는 기본 appBase를 /home/test/tomcat/webapps로 두었고, tomcat은 설정된 경로에 있는 war파일을 unpacking 하는 작업을 진행합니다. 그리고 바이너리 변경 시 자동으로 배포되지 않도록 autoDeploy를 false로 설정했어요.
경로는 변경이 가능하지만, 기본적으로 tomcat이 설치되어 있는 기본 경로는 ${catalina_home}의 webapps 디렉토리로 설정되어있어요.
설정한 경로에 있는 *.war 파일을 unpacking 하여 ROOT 파일을 생성하는 과정을 진행합니다.
(디렉토리 명을 변경하는 작업은 context에 추가적인 작업이 필요하기에 생략하였다.)
<Context /> 설정은 톰캣에서 구동되는 하나의 웹 어플리케이션 자체의 설정을 의미합니다.
1. 톰캣이 요청을 받으면 Catalina가 요청에 맞는 Context를 찾는다.
2. Context는 자신이 설정된 어플리케이션의 deployment descriptor file(web.xml) 을 기반으로 요청을 서블릿에게 전달한다.
전체적인 요청의 흐름은 이렇습니다.
- Client HTTP request -> Catalina -> Context -> servlet -> Client response
1번 문제에 대해서는 설치를 하며 변경하였던 경로들에 대해 문제가 발생하여, 문서를 차근차근 읽어가면 수정하여 해결하였습니다.
2번 문제의 경우 오류가 발생하는 지점을 찾는데 굉장히 힘들었어요....(퉤)
설정 내용이 잘못됐는지 아닌지 정확히 알 수 없어 정말 수많은 수정을 진행하였지만 문제는 나아지지 않았고, 결국 *.war 파일을 구동하는 과정에서 연결되어 있는 다른 어플리케이션과의 연동 설정이 제대로 이루어지지 않아 톰캣은 구동되지만 어플리케이션이 제대로 올라가지 않는 문제였습니다. 이래서 설정이 중요한가 봅니다.
오류를 찾는 과정에서 정말 많은 화가 났지만 결론적으로 해결이 되었습니다.
끝.
'Server' 카테고리의 다른 글
레디스, 캐시의 사용(feat. Toast Meetup) (0) | 2020.03.08 |
---|---|
Nginx는 무슨 역할을 할까? - with willson (0) | 2019.07.18 |
Travis CI / AWS codedeploy - with willson (0) | 2019.07.15 |
Swagger를 이용해보자! 2편 (3) | 2018.05.27 |
Swagger를 이용해보자! 1편 (1) | 2018.05.27 |