톰켓에서의 Connector 은 보통 2가지로 나뉜다.
HTTP Connector 와 JK Connector 

HTTP Connector 은 톰캣 혼자서(아파치 같은거 없이) 구동되어서 하나의 웹서버로서 활용 되기 위한 용도의 Connector 이다.

JK Connector 는 보통 AJP/1.3 프로토콜을 이용한 webserver 와 tomcat 의 연동을 위한 Connector 이다.

그럼 JK Connector 는 도대체 먼가 궁금 할것이다.

1. JK Connector

 JK Connector는 다양한 플랫폼을 지원하고, 아파치 웹서버 뿐만 아니라 Netscape/iPlanet, IIS 등도 지원하며, 뿐만 아니라 SSL을 지원하여 HTTP와 HTTPS 모두 사용 가능하다.

  웹서버와 연계하기 위한 모듈은 다음과 같다.

 - mod_jk : 아파치 웹서버 1.3 및 2.0과 연결하기 위한 모듈

- isapi   : IIS와 연결하기 위한 추가 모듈

- nsapi  : 넷스케이프/iPlanet과 연결하기 위한 추가 모듈

- dsapi : Domino와 연결하기 위한 추가 모듈. 하지만 이 모듈은 그리 좋은 성능을 제공하지는 못하다

 2. JK2  Connector

 JK2 Connector는 JK Connector를 재구성(Refactoring)해서 만든 Connector이다. 그러한 이유로 JK Connector와 매우 유사한 모습과 기능을 가지고 있지만 실질적으로 환경 구성에서는 약간의 차이를 보인다. 

JK2 Connector의 가장 큰 장점은 다양한 연결 방식을 제공한다는 점으로 매우 고성능의 유닉스 소켓과 함께 JDK 1.4에서 새로이 소개하고 있는 New I/O를 적용해서 사용할 수 있는 관계로 속도상의 향상을 도모할 수 있다.

이 Connector를 사용할 때에는 비록 JK2가 Apache 1.3을 지원하고 있긴 하지만 Apache 2.0을 대상으로 설계 되어졌다는 점이다.

 멀티 쓰레드 형태로 동작하는 IIS와 Netscape/iPlanet 그리고 아파치 2.0과의 연동시에는 JK Connector 보다 훨씬 좋은 성능을 제공한다.  

Apache 웹 서버는 멀티 쓰레드 기반의 웹서버가 아니다.

Apache 2.0만 멀티 쓰레드 기반으로 되어 있다. 이러한 이유로 단순 성능 비교시 유닉스에서 수행되는 Apache 웹 서버가 윈도우에서 돌아가는 IIS에 비해서 속도가 떨어진다.

또한 자바의 시스템 관리 기술인 JMX를 이용하여 웹서버와 톰캣의 연동 상황을 웹으로 보여줄 수 있는 상태 모듈이 포함되어 있다.

참고 : http://blog.naver.com/PostView.nhn?blogId=sj99yang&logNo=140002804249&redirect=Dlog&widgetTypeCall=true

자 그럼 Connector source 를 한번 볼까?

public class Connector implements Lifecycle, MBeanRegistration
다행이다ㅋ. 이놈은 interface 가 아니다. Likfecycle 과 MbeanRegistration 만 implements 한다. Mbean.... 나중에 책보고 한번더 정리가 필요 할것 같다. 아직도 JMX 기술에 대한 명확한 이해가 부족한것 같다.

API를 보면 너무나도 많은 Filed 가 있다. 하지만 이 모든것을 정리하기에는 시간적 여유가 너무나도 부족하다. 걍  슬쩍 훓어 보겠다.

- public Connector(String protocol)
Conntecor의 생성자 이다. 

Class clazz = Class.forName(protocolHandlerClassName);
this.protocolHandler = (ProtocolHandler) clazz.newInstance();

위 소스에서 보면 protocolHandlerClassName 이놈이 보인다.
따라가 보변 org.apache.coyote.http11.Http11Protocol 이놈이다.
다시 말해서 protocolHandler 로 Http11Protocol 클래스의 instance를 가지도록 한다는 의미가 된다. Http11Protocol  의 분석은 다음 글에 ....;;;

암튼 이놈은 default 로 setting 되어 있다.
하지만 method 중에서 setProtocol 이 있다.

if ("HTTP/1.1".equals(protocol)) {
              setProtocolHandlerClassName
                    ("org.apache.coyote.http11.Http11Protocol");
            } else if ("AJP/1.3".equals(protocol)) {
                setProtocolHandlerClassName
                    ("org.apache.jk.server.JkCoyoteHandler");
.....

이런 source 가 보인다.

즉 기본적으로는 http 프로토콜을 쓰지만 AJP/1.3 으로 JK connector 을 쓸수 있다.
그리고 이놈은 Server.xml 에서 정의 되어 있다.

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

앞서 적은 Digestor에서 이놈의 setting을 처리 하는 것이겠지? ㅋㅋㅋ
난중에 Digestor 도 한번더 보자.ㅋ


HTTP 1.1 의 특징(톰캣 최종 분석 참고)
 - 지속연결
   브라우저가 페이지 하나를 요청 하더라고 그 페이지 에서 참조하는 다른 자원도 함께 다운로드 해야 한다. 만약 참조하는 다른 자원에 대해서 각각 연결해서 다운하면 속도가 느려질수 밖에 없다. 따라서 HTTP 1.1 에서는 지속 연결(Persistent Connections)를 지원한다. 

 - 청크 인코딩
 HTTP 1.1. 에서는 transfer-encoding 이라는 특별한 해더가 추가됐는데, 이 해더는 바이트 스트림이 청크(chunk)단위로 전송 될것임을 가리킨다. 모든 청크에서는 실제 데이터가 전송되기 전에 16진수로 된 길이 값과 케리지 리턴/개행문자가 먼저 전송된다. 청크의 길이가 0 이면 하나의 트랜잭션이 종료 된다.

 - 100(Continue) 상태 코드 사용
Expect : 100 -continue 헤더를 전송해 요청 본체를 전송하기 앞서 서버측의 승인을 기다리는 것이다. 이 방법은 클라이언트가 전송하고자 하는 요청 본체의 양이 많을 경우 서버가 이를 받아들일수 있는지를 먼저 확인하고자 할때 사용된다.

출처 - http://interwater.tistory.com/31


===================================================================================























Posted by linuxism

댓글을 달아 주세요