📝Tomcat 큰 3가지 구성
Coyote : Tomcat TCP 프로토콜 지원
Catalina : Java Servlet을 호스팅 해준다.
Jasper : JSP 페이지 요청 처리 Servlet
📝톰캣 동작 구조
Tomcat Server가 그 밑에 Service 객체를 생성한다 (그 하위에는 Engine, Connector(호출 포트), Host, Context(URI Mapping) 등이 존재)
HTTP 통신 요청 → 호출 포트에 해당하는 Connector 연결 → Service → Engine → Host → Context(기본적으로 webapps에 있는 곳 참조해 프로젝트 URI Mapping → 프로젝트 내 web.xml 읽기 → 프로젝트 내 web.xml 기반으로 프로젝트 URI 매핑
하나의 Server에는 여러개 Service가 존재할 수 있다.
하나의 Service에는 1개의 Engine과 여러개의 Connector로 구성
하나의 Engine에는 여러개 Host 존재할 수 있다.
하나의 Host에는 여러개 Context가 존재할 수 있습니다.
Tomcat Server → Engine(Connector로 통해 전달) → Host → Context
[Tomcat에서는 server.xml에 적혀있는 내용을 가지고 객체를 만드는 거라고 생각하면 된다. 그렇기 때문에 Connector에 포트번호를 적어두면 어떤 Service를 이용할지 방향을 알려준다]
📝Server
port : Shutdown 명령을 보낼 수 있는 TCP/IP 주소
<Server port="8005" shutdown="SHUTDOWN">
📝Service
Serivce의 유일한 이름으로 Log를 남길 때 사용한다 (Catalina.out)
<Service name="Catalina">
📝Connector
특정 TCP port에서 request들을 listen해 engine으로 보내준다.
- port
- 리슨할 포트
- protocol
- TCP/IP 방식
- HTTP/1.1
- 기본적으로 Connection당 하나의 요청을 처리 하도록 설계 동시 전송이 불가능하고 요청과 응답이 순차적으로 이뤄진다
- HTTP/2
- HTTP1.1을 완전하게 재작성한 것이 아니라 프로토콜의 성능에 초첨을 맞춰 수정한 버전 기본적으로 connection 한 개로 동시에 여러 개의 메시지를 주고 받을 수 있으며, 응답은 순서에 상관없이 stream으로 주고 받는다
- AJP
- "Apache JServ Protocol"의 약자로, Tomcat과 웹 서버(주로 Apache) 간의 통신을 위한 프로토콜로 Web서버인 Apache에서 어떤 포트를 들어오면 포트포워딩할 지에 대한 포트 설정을하고 Tomcat도 이에 대한 걸 받기 위한 프로토콜 설정 및 포트 개방을 한다
<!-- Apache 설정 -->
<VirtualHost *:80>
ServerName yourdomain.com
# 기타 설정
ProxyPass / ajp://localhost:8009/ # Tomcat과의 AJP 연결 설정
ProxyPassReverse / ajp://localhost:8009/
</VirtualHost>
<!-- Tomcat 설정 -->
<Connector protocol="AJP/1.3" port="8009" redirectPort="8443" />
위 프로토콜의 동작 방식 설정
- BIO : Tomcat 7 기본 방식 하나의 Thread가 하나의 Connection을 담당
- NIO : Tomcat 8.5 기본 방식 하나의 Thread가 하나 이상의 Connection을 담당
- APR : 10.x 버전 부터 ARP 방식 삭제
<Connector port="7104" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="7004" URLEncoding="UTF-8" />
📝Thread Pool 설정
maxThreads : Connector가 생성할 수 있는 최대 Thread 수
maxConnections : 동시 처리 가능한 최대 Connection 수
maxSpareThreads : 최소로 실행을 유지할 thread 수
acceptCount : thread가 꽉 찼을 때 queue에 저장 가능한 최대 request 수
Thread Pool
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150", maxConnections >
공유 Thread Poll
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4"/>
📝 Engine
name : Engine의 유일한 이름으로 Log를 남길 때 사용한다.
defaultHost ?
<Engine name="Catalina" defaultHost="localhost">
📝Host
name : 유일한 가상 Host명 (http://hostname/~)
appBase : app 폴더 (default webapps) Host마다 다른 appBase를 지정할 수 있다. (여러개 Domain 효율적 관리가능)
autoDeploy : appBase에 변동사항이 있을 때 자동으로 Deploy(배포) 해준다.
unpackWARs : war파일 deploy 설정 여부
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
📝Context
Host안에 있으며 하나의 WebApplication이며 주로 .war 형태로 배포됩니다.
docBase : 호출할 경로 URI이다. (/ABC/testing.jsp 호출시 /webapps/DEF/testing.jsp를 호출하게 된다.)
path : 실제 호출시킬 경로이다
만약 Context가 없으면 기본적으로 docBase는 webapps안에 있는 폴더 이름을 따라가게 된다.
즉, webapps/ABC 폴더가 존재시 /ABC/ 이런식으로 호출함
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context docBase="ABC" path="/DEF" reloadable="true"></Context>
🔗 참고 및 출처
https://velog.io/@hyunjae-lee/Tomcat-2-%EA%B5%AC%EC%A1%B0
https://bogyum-uncle.tistory.com/m/219
https://ijbgo.tistory.com/m/26
https://velog.io/@wiostz98kr/HTTP1.1%EA%B3%BC-HTTP2.0%EC%9D%98-%EC%B0%A8%EC%9D%B4-e2v4x4t1
'[Java] > [Tomcat]' 카테고리의 다른 글
[Tomcat] IDE 없이 톰캣으로 페이지 띄워보기 (서블릿 Servlet) (0) | 2022.12.01 |
---|---|
[Tomcat] HTTPS 사용하기 (JDK에 keytool로 SSL 인증서 발급하기) (0) | 2022.12.01 |
[Tomcat] 포트변경 및 SSL 인증서 발급후 HTTPS 통신 포트 연결(수정중) (0) | 2022.10.27 |
[Tomcat] 톰캣으로 페이지호출, URL매핑 (javac로 class파일 만들기) (0) | 2022.06.12 |
[Tomcat] 리눅스에 있는 톰캣 UTF-8 설정 (0) | 2021.11.27 |