12 08 2015
IIS와 Apache Tomcat 연동하기
요즘 블로그에 통 신경쓸 겨를이 없었다. 최근에 아는 형님의 소개로 입사하게 되었는데, 집이랑 회사와의 거리가 제법 멀다 보니(대충 1시간 30분 정도 걸림), 블로그에 글 쓰는것도 은근히 체력을 소모하는 요소가 되었다. 그리고 여담으로, 난 블로그에 작성할 글의 초안을 미리 마크다운으로 대충 작성해두고 나중에 옮겨적는 편인데, 마크다운 에디터를 기존에 쓰던 MarkdownPad에서 HarooPad로 바꾸고는 편리하게 초안을 작성해 두… …었는데, 하루패드는 HTML 영역은 복사가 안되더라. 평소에는 마크다운이 변환된 HTML을 복사해서 블로그에 붙여넣은 뒤 조금 수정한 다음 공개하는 식이었는데, 그게 복사가 안되서 의욕을 잃었던 것도 있다.
각설하고, 출근하고 제일 먼저 했던게 윈도우 서버에 설치된 IIS에 Apache Tomcat을 연동해서 자바 서블릿이 동작하도록 하게 한 것이다. 이걸 하려고 인터넷을 뒤졌는데, 왠지 어떤 자료들을 보고 진행해도 되는게 없었다-_- 그래도 그 와중에 어찌저찌 연동에 성공하게 되어서 그 내용을 기록해두려고 한다. 아니 근데, 당장 내 서버부터 아파치랑 톰캣 연동해야 하는데, 나는 지금 도대체 무얼 하고 있는가…
출처
이 글은 아래 문서를 참고하여 진행한 내용이므로, 해당 문서도 참고하자.
- Tomcat Connector를 이용하여 IIS8 과 Apache Tomcat7 연동(64비트) – 모람씨앤티
- 이 문서와 내가 작업한 환경은 약간 다른데, 예를 들어 위 문서는 64Bit 환경에서 작업하였으나 나는 32Bit 환경에서 작업했다는 등의 미묘한 차이가 있다.
- Apache 설정 및 톰캣 연동 – 12.구루비 Dev 스터디 – 개발자, DBA가 함께 만들어가는 구루비 지식창고!
- IIS와의 연동에 관한 내용은 아니지만, Tomcat Connector에 관해서는 이 문서의 도움을 받았다.
- The Apache Tomcat Connector – Reference Guide – Configuring IIS
- 이 글에선 언급하지 않지만, Tomcat Connector의 공식 레퍼런스 문서를 보면 Connector의 환경설정은 환경설정파일뿐만 아니라 윈도우 레지스트리를 통해서도 가능하다고 명시되어 있다.
전제사항
JDK, IIS, 톰캣은 모두 설치되어 있다고 가정한다. 환경변수로 JAVA_HOME도 설정 완료되었다고 가정한다. 어차피 JAVA_HOME 환경변수가 없다면 톰캣이 구동되지도 않는다.
이 글은 32비트 윈도우 7에서 작업하는 것을 전제로 작성되었으며, 따라서 IIS 7을 사용한다. IIS 6에서도 비슷한 순서로 진행이 가능하리라고 생각되지만, 실제로 해본 것은 아니라서 잘은 모르겠다.
Tomcat Connector의 관련 설정은 레지스트리를 통해서도 할 수 있지만, 이 글에서는 환경설정은 설정파일을 통해서 하는 것으로 진행하고, 레지스트리를 통한 환경설정은 언급하지 않는다. 관련 내용은 위에서도 언급한 Tomcat Connector의 공식 문서를 살펴보자.
IIS와 톰캣간의 연동은 IIS의 ISAPI 필터를 통해서 구현된다. 따라서 ISAPI 관련 기능들이 시스템에 설치되어 있는지 확인하고, 설치되어 있지 않다면 해당 부분들을 설치한다. 제어판의 Windows 기능 사용/사용 안함 > 인터넷 정보 서비스 > World Wide Web 서비스 > 응용 프로그램 개발 기능
에서 ISAPI 필터
와 ISAPI 확장
의 설치 여부를 확인하고, 설치되어 있지 않다면 설치한다.
여담으로, 윈도우 운영체제는 64비트 운영체제인데 톰캣은 32비트라면 Tomcat Connector도 32비트를 다운로드 받아야하고, IIS에서 32비트 ISAPI가 실행될 수 있도록 설정을 수정해야 한다. 이 내용은 여기서 언급하지 않는다.
Tomcat Connector 다운로드
톰캣과 다른 웹서버(예를 들면 IIS라던가 아파치라던가)를 연동해주는 프로그램을 Tomcat Connector라고 부르는 것 같다. 이러한 Tomcat Connector는 톰캣 홈페이지의 Tomcat Connector에서 다운로드할 수 있다. 다운로드 링크를 찾기 어려울 수 있는데, Tomcat Connector JK 1.2 > Binary Release
를 클릭하면 파일과 폴더 목록이 표시된다.
이후에는 Windows
폴더를 고른 후, 파일명을 잘 보고 자신의 환경에 맞는 커넥터를 다운로드한다. 당시에 내가 다운로드한 파일은 tomcat-connectors-1.2.40-windows-i386-iis.zip
이었으며, 파일명의 의미는 32비트 윈도우 운영체제의 IIS에서 구동되는 Tomcat Connector 1.2.40이라는 의미이다.
다운로드한 압축 파일을 열어보면 4개의 파일이 압축되어 있는데, 이 중 isapi_redirect.dll
파일을 제외한 나머지 파일들은 모두 텍스트 파일이며, 구동 및 연동에는 필요없다.
폴더 구조
Tomcat Connector를 저장할 폴더의 구조는 딱히 정해진 것이 없다. 내가 설정한 구조로 이야기해보자면, 톰캣 폴더 아래에 Tomcat Connector DLL 파일 및 커넥터 환경설정 파일이 저장될 폴더, 로그 파일이 저장될 폴더, 서블릿 관련 설정(Worker 및 URIMapping) 파일이 저장될 폴더를 따로 만들었는데, 대충 아래와 같은 구조로 만들었다.
- 톰캣 디렉토리
- Tomcat Connector
- bin (isapi_redirect.dll 및 그 환경설정 파일이 저장되는 디렉토리)
- log (Tomcat Connector의 로그 파일이 저장될 디렉토리)
- conf (Worker 및 URIMapping 설정이 저장될 디렉토리)
- Tomcat Connector
꼭 이런 구조가 아니더라도, ISAPI_Redirect 로그 파일을 톰캣 로그 디렉토리로 지정한다거나, Worker 및 URIMapping 설정을 톰캣의 conf 디렉토리로 지정하는 것도 가능하다. 단, isapi_redirect.dll 파일과 ISAPI_Redirect 환경설정 파일은 반드시 같은 디렉토리에 있어야 한다.
Tomcat Connector 설치 및 환경설정
다운로드한 압축파일의 압축을 해제한 다음, isapi_redirect.dll
파일을 적당한 폴더로 복사한다. 그리고 DLL 파일과 동일한 위치에 isapi_redirect.properties 파일을 만든다. 나의 경우, 내용은 아래와 같이 작성하였다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# 커넥터 dll 파일의 경로 extension_uri=/jakarta/isapi_redirect.dll # 로그 파일의 저장 위치 및 로그 파일. # 로그 파일의 경로는 절대경로로 기입한다. log_file=C:\Apache-tomcat\Tomcat Connector\log\isapi_redirect.log # 로그 레벨. 로그 레벨은 debug, info, warn, error, trace를 쓸 수 있으며, 일반적으로는 설치시 debug로 설정하여 문제 해결에 활용하고, 오픈 후에는 info로 적용해서 사용하는 것이 일반적이다. log_level=info # Tomcat 연동시 사용될 Worker 설정 파일의 경로 worker_file=C:\Apache-tomcat\Tomcat Connector\conf\workers.properties # Worker와 매핑될 URI의 매핑 설정 파일의 경로 worker_mount_file=C:\Apache-tomcat\Tomcat Connector\conf\uriworkermap.properties |
위 환경설정 파일의 내용을 설명해보자면 아래와 같다.
- extension_uri의
/jakarta/
는 서버 기준으로 사용되는 절대 경로가 아닌, 클라이언트 입장에서 서버의 자원을 요청할 때 사용하는 URI 주소이다. 뭔소리인고 하니(…)/jakarta/
는 IIS에서 설정한 가상 디렉터리라는 이야기. - 로그 파일의 경로는 이미 존재하는 경로로 지정해야 한다.
- 로그 파일이나 Worker 설정 파일, URI 매핑 파일의 경로는 하드 디스크의 절대 경로로 작성한다.
이후에는 위의 isapi_redirect.properties
파일에 지정한 경로에 Worker 파일과 URI 매핑 설정 파일을 만들어야 한다. 내 경우엔 Worker 파일은 아래와 같이 만들었다. Worker가 무엇인지는 아래에 적어두었다.
1 2 3 4 |
worker.list=worker1 worker.worker1.type=ajp13 worker.worker1.host=localhost worker.worker1.port=8009 |
- worker.list는 톰캣 Worker의 이름을 명시한다. 톰캣 Worker란 웹서버로부터 서블릿 요청을 받아, 이 요청을 톰캣 프로세스로 전달하여 요청을 처리하는 톰캣 인스턴스이다.
- Worker의 이름은 자유롭게 작성할 수 있고 콤마(,)로 구분해서 몇개라도 만들 수 있다. 로드 밸런싱을 위해 여러개의 Worker를 만들어 처리하게 하거나, 서로 다른 Context를 다른 Worker가 처리하도록 하게 할 수도 있다. 여기서는 그냥 하나만 만들었다.
- Worker의 Type과 Host, Port는 톰캣의 server.xml 파일을 참고한다. <connect> 항목 중 protocol이 AJP인 것을 찾는다.
마찬가지로 URI 매핑 파일은 아래처럼 만들었다.
1 2 3 |
# URL 중 .do로 끝나거나 .jsp로 끝나는 URL은 모두 worker1 워커를 통해 처리한다 /*.do=worker1 /*.jsp=worker1 |
딱히 설명할 것도 없는 내용이라고 생각하며, URL의 최종 파일명이 .do
나 .jsp
일 경우 worker1
을 통해 서블릿 요청을 처리하라는 내용이다.
IIS 환경 설정
Tomcat Connector의 환경 설정이 끝났다면, IIS쪽의 환경설정을 해 주어야 한다.
IIS 관리자 실행화면에서 좌측 트리 중 최상단의 컴퓨터를 클릭한다. 그 뒤 ISAPI 및 CGI 제한
을 더블클릭한다.
우측의 추가
버튼을 누른다. ISAPI 및 CGI 추가 대화상자가 표시되면 아래 정보를 입력한다.
- ISAPI 및 CGI 경로
- Tomcat Connector(isapi_redirect.dll) 파일을 지정한다.
- 설명
- 그냥 적당히 입력한다. 내 경우에는
Tomcat Connector
라고 입력
- 그냥 적당히 입력한다. 내 경우에는
- 확장 경로 실행 허용 체크박스를 체크한다.
IIS에 ISAPI 필터를 등록했다면, 웹사이트가 해당 ISAPI를 사용하도록 설정을 해야 한다. 이것은 새 사이트를 만들고 진행해도 되고 기존에 있던 웹사이트에 설정해도 되는데, 내 경우에는 그냥 기본으로 있는 Default Web Site에 설정을 적용했다.
Tomcat Connector를 적용하려는 웹사이트에 가상 디렉터리를 만든다. 가상 디렉터리의 별칭은 위에서 만든 isapi_redirect.properties 파일의 extension_uri
에서 지정한 경로 이름으로 한다. 여기서는 jakarta
가 되겠다. 그리고 실제 경로는 isapi_redirect.dll 파일이 저장된 경로를 지정해준다.
가상 디렉터리를 추가했다면 마찬가지로 좌측에서 사이트를 클릭한 후, 우측의 기능 선택 화면에서 ISAPI 필터
를 더블 클릭한다.
ISAPI 필터 등록 화면이 나타나면 추가 버튼을 클랙해서 처음에 등록한 isapi_redirect.dll 파일을 등록해준다.
ISAPI 필터를 등록했다면, 다시 사이트 노드를 클릭한 뒤 이번에는 처리기 매핑
을 더블 클릭한다. 여기서 ISAPI-dll이 사용 안함으로 되어있다면, ISAPI-dll을 선택 후 우측의 기능 사용 권한 편집을 클릭한 뒤, 실행 권한을 준다.
여기까지 진행되었다면 IIS와 Tomcat을 연동하기 위한 Tomcat Connector의 설정은 모두 끝났다. IIS와 Tomcat을 모두 재시작한다.
재시작한 후에는 IIS와 Tomcat이 동시에 잘 실행되는지 테스트해보자. 간단한 html 파일과 간단한 jsp 파일을 생성해서, 각각 html 파일은 IIS 웹사이트의 루트에, jsp 파일은 Tomcat의 webapps/ROOT에 복사한 다음 각각 올바르게 접속이 되는지 확인해보자. 다만, 위에서 URI 매핑 설정할 때 jsp 파일이 톰캣 Worker를 통해 구동되도록 설정하지 않았다면 jsp 파일이 표시가 안될수도 있다. 일단 이 글대로 진행했다면 jsp 파일도 올바르게 표시될 것이다.
만약 웹사이트 접속시 오류가 발생한다면 설정이 잘못된 것이므로 설정을 확인한다. 처음에 작성한 isapi_redirect에 지정한 로그 경로에 로그파일이 생성되었는지 확인해서, 로그파일이 있다면 일단 Tomcat Connector는 실행된 것이므로 로그파일을 참고해서 isapi_redirect의 설정 오류를 점검하고, 로그 파일이 생성되지 않았다면 Tomcat Connector 자체가 실행되지 못한 것이므로, IIS의 설정 오류를 점검해본다.
Raspbian을 Wheezy에서 Jessie로 업그레이드 아이패드 에어 2
덕분에 잘 해결했습니다. 상세한 포스팅 감사합니다.
에구에구, 요즘에는 바빠서 관리도 못하고 있는 블로그인데요, 뭘. 제 글이 도움이 되셨다니 저도 기쁩니다 🙂
이 글을 참고해서 서버연동을 진행하고 있는데 진행이 잘 되지 않네요 ㅠ
jsp페이지를 연결시킬 때 페이지가 정상적으로 나타나는것이 아닌 소스가 나타나서 저를 당황케 하는 문제에 봉착했습니다
isapi_redirect.properties 이 파일을 사용하겠다고 선언하는 부분이 안보이는데
생성만 해 두면 되는건가요??
에고, 빨리빨리 답변해드렸어야 했는데 회사 생활이 바쁘다보니 한달이나 지나서야 답변드리네요. 죄송합니다 ( __)
저는 JSP 파일의 코드가 나타나는 문제는 보지 못해서 어떻게 답변을 드리기가 어렵네요. 일단 로그파일(isapi_redirect.properties의 log_file로 지정한 파일)을 살펴보시는게 어떨까 합니다.
그리고 isapi_redirect.properties 파일은, 예, 말씀하신 부분이 맞습니다. 그냥 isapi_redirect.dll 파일과 같은 경로에 isapi_redirect.properties 파일을 생성만 해 두시면 됩니다.
1. 아파치 톰캣으로 jsp 웹 서비스가 가능한데, 굳이 iis와 연동하는 이유는 무엇인가요?
2. 톰캣 포트넘버와 iis 포트 넘버를 같은 포트로 지정해야하나요?
1. 실제 운영하는 사이트들은 성능(빠른 응답)이 상당히 중요시 됩니다.
.html, .js, .jpg 같은 정적인(요청과 응답이 변화 없는) 파일들은 iis 나 apache 같은 웹서버에서 서비스를 하고
동적인 .jsp, .do 같이 동적인(요청과 응답이 DB 연동등으로 변화하는) 파일들은 tomcat 이나 다른 WAS 서버에서 서비스를 하는 것이 성능 향상에 아주 큰 도움이 됩니다.
2. iis 포트는 80번, tomcat 포트는 8080번, 이 둘을 연결하는 ajp13 포트는 8009번으로 설정하는 것이 일반적입니다.
3. 이 연동의 개념은 80포트(iis)에 .do 나 .jsp 요청이 들어 왔을 경우 8009포트를 통하여 8080포트에 요청하고 요청 처리 결과를 8009포트를 통해 80포트에 전달 해주것 입니다.
따라서 80번 포트 하나로 웹서버와 WAS 서버 둘의 요청이 가능하게 되는것 입니다.
정말 많은 도움이 됬습니다.~ 감사합니다. ~꾸벅~
진짜 섬세한 설명 ㅋㅋㅋ 연동 성공했어요 감사
혹시 이렇게 연동하여 spring project를 띄울 경우,
속도가 로컬에서 테스트 했을때와 달라지는데에 원인이 있을까요??
혹시 이렇게 연동하여 spring project를 띄울 경우,
속도가 로컬에서 테스트 했을때와 달라지는데에 원인이 있을까요??
안녕하세요 마사키님의 글을 보고 iis와 톰켓의 연동은 성공시켰습니다.
다만 문제가 하나 있는데요. jsp파일은 IIS의 디렉토리에 맞춰서 url을 입력하면 작동합니다만 servlet은 계속 경로를 못찾는 문제가 있는데요.
서블릿 매핑문제라고 생각해서 web.xml에가서 매핑 해주었는데도 여전히 경로를 찾지 못합니다.
IIS서버 디렉토리는 C:\tomcat7\webapps 으로 jsp파일은 C:\tomcat7\webapps\WEB_APP안에, 서블릿 파일은 C:\tomcat7\webapps\servlet에 넣어두었을때 어떻게 매핑을 하면 좋을까요
서블릿 파일은 혹시 몰라서 C:\tomcat7\webapps\WEB_APP, C:\tomcat7\webapps\WEB_APP\servlet, C:\tomcat7\webapps\servlet 세군데의 경로에 같은 이름의 서블릿파일을 넣어두었습니다.