티스토리 뷰

발단


Windows10 개인 로컬 환경에서 WSL2를 활용하여 docker를 실행하여 apahch와 tomcat을 연동하는 중 발생한 문제

docker에서 apache 컨테이너와 tomcat 컨테이너를 실행하였고 각각 호출 시에는 정상적으로 호출되었음

http://localhost 호출

apache index 화면



http://localhost:8080 호출

tomcat index화면



그러나 Web 서버와 Was의 처리를 분리하 mod_jk와 ajp 프로토콜을 적용하였을 때 문제가 발생하였음.

ajp 적용 후 http://localhost 호출 시 에러 화면


원인


mod_jk.log를 확인하였을 때
WEB에서 WAS로 AJP통신을 요청할 떄 해당 ip와 port로 연결을 실패하였다는 것임.

에러 메시지

[info] ajp_service::jk_ajp_common.c (2774): (worker1) sending request to tomcat failed (recoverable), because of error during request sending (attempt=1)
[info] jk_open_socket::jk_connect.c (815): connect to 172.17.0.3:8009 failed (errno=111)
[info] ajp_connect_to_endpoint::jk_ajp_common.c (1064): (worker1) Failed opening socket to (172.17.0.3:8009) (errno=111)
[error] ajp_send_request::jk_ajp_common.c (1724): (worker1) connecting to backend failed. Tomcat is probably not started or is listening on the wrong port (errno=111)
[info] ajp_service::jk_ajp_common.c (2774): (worker1) sending request to tomcat failed (recoverable), because of error during request sending (attempt=2)
[error] ajp_service::jk_ajp_common.c (2795): (worker1) connecting to tomcat failed (rc=-3, errors=1, client_errors=0).
[info] jk_handler::mod_jk.c (2991): Service error=-3 for worker=worker1


로그 중 이 부분을 확인해보면
IP 172.17.0.3 tomcat 서버에 8009 포트로 요청하는 것인데
현재 사용 중인 개발 환경이라면 docker에서 컨테이너 간에 통신을 관리하는데
172.17.0.3 IP는 tomcat 컨테이너 IP 이기 때문에 docker에서는 연결을 해줄 수 없는 것임.

ajp 설정 시 tomcat 기본 설정 부분

#/usr/local/tomcat/conf/server.xml
 <Connector protocol="AJP/1.3"
               address="localhost"
               port="8009"
               redirectPort="8443" secretRequired="false"/>


해당 IP가 표시된 것 또한 ajp 설정 부분에 address를 localhost로 선언을 하였기에 현재 컨테이너의 IP로 받아들이는 것이었음.
docker에서 localhost는 해당 컨테이너 안에서 사용 가능하며 외부로는 통신이 불가.


조치


WSL2 환경이기에 같은 서버에서 돌아간다고 생각을 하고 작업을 진행하였으나
docker 환경이기에 서로 다른 컨테이너라는 점을 놓친 것이 가장 큰 실수였음.

docker에서 컨테이너 간 통신을 설정하려면
localhost가 아닌 0.0.0.0로 설정하여 같은 머신에서의 통신할 수 있도록 설정

 <Connector protocol="AJP/1.3"
               address="0.0.0.0"
               port="8009"
               redirectPort="8443" secretRequired="false"/>


추가적으로 WEB 서버에서 mod_jk 설정을 할 때 host명은 tomcat 컨테이너 명으로 잘 설정한 부분

worker.list=worker1
worker.worker1.type=ajp13
worker.worker1.host=tomcat-jc2
worker.worker1.port=8009
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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 31
글 보관함