test.java
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class test extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
System.out.println("hello Servlet");
}
}
1. cmd test.java 있는 경로로 이동
2. class 파일 만들기 → javac -cp C:\tomcat9\lib\servlet-api.jar test.java
3. 호출하기 위한 설정파일 수정 (web.xml) [WEB-INF안에 있는 파일은 직접 요청이 불가능하다.]
WEB-INF 호출하기 위한 설정 파일 경로 : C:\tomcat9\webapps\ROOT\WEB-INF\web.xml
실행시킬 class파일 : C:\tomcat9\webapps\ROOT\WEB-INF\classes\test.class
web.xml 내용
<servlet>
<servlet-name>testing</servlet-name>
<servlet-class>test</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>testing</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
→
hello라는 url 요청이 오면 testing이라는 서블릿의 이름을 가진 애를 실행시키라는 의미
testing이라는 이름을 가지는 서블릿의 클래스파일은 test이다
이렇게 매핑정보를 xml으로 할수도 있지만(2.x) annotation(3.x)으로도 사용 가능하다.
annotation 방식을 이용하고 싶을 경우 metadata-complete를 false로 바꿔야한다. 경로 : C:\tomcat9\webapps\ROOT\WEB-INF\web.xml
1. cmd 관리자 권한으로 실행
2. cd ${jdk/bin경로}
3. 하기 명령어 입력
keytool -genkey -alias tomcat -keyalg RSA -keystore tomcat.keystore
설명 : keytool -genkey -alias tomcat -keyalg RSA -keystore ${keystore 파일명}
4. 하기 내용 입력하기
키 저장소 비밀번호 입력:
새 비밀번호 다시 입력:
이름과 성을 입력하십시오.
[Unknown]:
조직 단위 이름을 입력하십시오.
[Unknown]:
조직 이름을 입력하십시오.
[Unknown]:
구/군/시 이름을 입력하십시오?
[Unknown]:
시/도 이름을 입력하십시오.
[Unknown]: seoul
이 조직의 두 자리 국가 코드를 입력하십시오.
[Unknown]: KR
N=maruara, OU=Unknown, O=Unknown, L=Unknown, ST=seoul, C=KR이(가) 맞습니까?
[아니오]: y
tomcat>에 대한 키 비밀번호를 입력하십시오.
(키 저장소 비밀번호와 동일한 경우 Enter 키를 누른다):
📝2. tomcat의 server.xml에서 https 설정하기
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystorePass="gkgkgk" keystoreFile="d:/openssl/tomcat.keystore"/>
port → https 통신 포트
keystorePass → 위에서 설정한 패스워드
keystoreFile → ssl 인증서 경로
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 방식 삭제
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 설정 여부
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
...
-->
...
<Server port="8005" shutdown="SHUTDOWN">
...
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
....
</Host>
</Engine>
</Service>
</Server>
Connector port="8080" → Connector port="${바꿀 포트번호}" 로 변경