반응형
반응형

📝catalina.out

톰캣에서 발생한 모든 내용을 기록한다 (콘솔에 표시되는 모든 것을 기록) 또한 별도의 설정이 없을 때 이 파일의 크기는 무한정 증가한다 즉, 롤링이 안 됨 → Log4j나 System.out.print와 같은 걸로 로깅한 것들이 들어가 있음

 

📝catalina.yyyy-mm-dd.log

톰캣에 의해 생성되는 로그만 기록 Standard output(표준 스트림), Standard error(표준 에러)의 로깅은 제외

→ Log4j나 System.out.print와 같은 걸로 로깅한 것들이 들어가 있지 않다

 

📝localhost_access

클라이언트가 웹 애플리케이션에 접근할 때 발생하는 정보를 기록합니다. 이 로그에는 클라이언트의 IP 주소, 접근 시간, 요청된 URL, 응답 상태 코드 등이 포함될 수 있습니다. 이 로그는 웹 애플리케이션에 대한 접근 추적 및 분석에 사용

 

📝localhost

host( VirtualHost 같은) 한정한 로그 → 로그는 쌓이는데 어떤 규칙인지는 잘 모르겠네요

 

📝host-manager.log

Tomcat Host Manager Web app 로그 (가상 호스트 매니저) → 로그가 안 쌓여서 사실 잘 모르겠습니다

 

📝manager.log

Tomcat Manager Web App 로그 (웹콘솔) → 로그가 안 쌓여서 사실 잘 모르겠습니다

 

 

🔗 참고 및 출처

https://velog.io/@always/Tomcat-%EB%A1%9C%EA%B7%B8-%ED%8C%8C%EC%9D%BC-%EC%A2%85%EB%A5%98

https://yes-admit.tistory.com/64

 

 

반응형
반응형

📝Hot Reload

소스 코드 수정 후 반영때까지 톰캣이 재기동하면서 다시 클래스 파일 생성하면서 시간이 10초 15초정도 소요 특히

XML 수정같은 경우는 (Mapper) 톰캣 자체를 아예 재기동 필요(톰캣의 변화 감지는 Java파일 및 JSP 따위만 판단)

위와 같은 불편한 점을 해소시키기 위한 기술이 Hot Reload란 기술

 

📝적용 방법

1. IntelliJ 사용 - 기본 지원 (유료)
2. 스프링부트 사용 (설정 추가하면 지원)
3. Spring Loadded Jar 사용해 Tomcat 설정 추가 (JDK 8버전에서 동작) [11버전에서는 돌아가지 않는 거 같다]
4. JRebel 사용 - (유료) 

 

1번 : 유료이기 때문에 구매해서 사용

2번 : 하기 블로그 참조 

https://blog.egstep.com/spring-boot/2017/12/10/springboot-reload/

 

Spring Boot 개발 시 자동 리로드 Reload

Introduction 스프링 부트 개발 중 코드 변경 시, 자동 리로드 되게 하는 방법

blog.egstep.com

 

3번 : 하기 블로그 참조

https://guiyomi.tistory.com/67

 

Eclipse - Hot reload(Hot deploy) 설정

스프링 개발을 하다 보면 java 파일을 수정할 때마다 톰캣이 재부팅 되면서 수정 사항이 반영되기 때문에 약 10초 가량을 기다려야 하는 불편함이 있다. 간단하게 Springloaded를 의존성에 추가하여 h

guiyomi.tistory.com

 

 

4번 : 유료이기 때문에 구매해서 사용 (사용시 하기 블로그 참고) [14일 Trieal 존재]

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=sue227&logNo=221195660703 

 

JRebel이란? (설치방법)

스프링 작업 시 xml을 수정하면 서버를 다시 돌려야 한다. 이럴 때 JRebel을 사용하면 간편하다. JRebe...

blog.naver.com

 

 

🔗 참고 및 출처

https://blog.egstep.com/spring-boot/2017/12/10/springboot-reload/

https://guiyomi.tistory.com/67

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=sue227&logNo=221195660703 

반응형
반응형

📝텍스트 파일로만 페이지 띄우기

tomcat path : C:\tomcat9
server.xml path : C:\tomcat9\conf\server.xml

<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">
    <Context path="it" docBase="C:\tomcat9\webapps\ITWeb" privileged="true"/>
    ....


페이지에 띄울 텍스트파일 경로 : C:\tomcat9\webapps\ITWeb\nana.txt
nana.txt 내용 : 안녕하세요
페이지 호출 URL : http://localhost:8080/it/nana.txt

 

 

📝클래스 파일 직접 만들어서 페이지 띄우기

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

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  version="4.0"
  metadata-complete="false">



반응형
반응형

📝1. keysotre 파일 생성 (SSL인증서)

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 인증서 경로
반응형
반응형

📝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

 

Tomcat - (2) 구조

Tomcat의 구조에 대해 자세히 알아봅니다.

velog.io

 

https://bogyum-uncle.tistory.com/m/219

 

[Tomcat] server.xml 구조

톰캣의 server.xml 은 메인 설정 파일이며, Tomcat startup 초기 설정을 명세하는 책임이 있음 1. server.xml 태그 예시 2. 태그 상세 태그 설명 Server root element, shutdown port 지정, 전체 설정파일의..

bogyum-uncle.tistory.com

https://ijbgo.tistory.com/m/26

 

HTTP/1.1 VS HTTP/2

HTTP/1.1 동작 방식 HTTP/1.1는 기본적으로 Connection당 하나의 요청을 처리 하도록 설계동시 전송이 불가능하고 요청과 응답이 순차적으로 이뤄짐HTTP 문서 안에 포함된 다수의 리소스 (Images, CSS, Script)

ijbgo.tistory.com


https://velog.io/@wiostz98kr/HTTP1.1%EA%B3%BC-HTTP2.0%EC%9D%98-%EC%B0%A8%EC%9D%B4-e2v4x4t1

 

반응형
반응형

- 톰캣 포트 변경

${tomcat 설치경로}/conf/server.xml

<?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="${바꿀 포트번호}" 로 변경

 

SSL 인증서 발급

 

 

 

반응형
반응형

톰캣만 가지고 진행하도록 하겠습니다.

 

📝톰캣으로 페이지 띄우기

 

톰캣 경로 : C:\tomcat9

경로 : C:\tomcat9\conf\server.xml

 

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Context path="it" docBase="C:\tomcat9\webapps\ITWeb" privileged="true"/>
....

 

 

페이지에 띄울 텍스트파일 경로 : C:\tomcat9\webapps\ITWeb\nana.txt

nana.txt 내용 : 안녕하세요

페이지 호출 URL : http://localhost:8080/it/nana.txt

 

📝클래스파일 만들기

 

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");
    }
}

 

cmd 후 test.java 있는 경로로 이동 (c드라이브에서는 안 되고 c드라이브 하위디렉토리가 있어야함)

javac -cp C:\tomcat9\lib\servlet-api.jar test.java

 

WEB-INF안에 있는 파일은 직접 요청이 불가능하다.

 

 

📝web.xml로 URL 호출 매핑 만들기

 

 

WEB-INF 호출하기 위한 설정 파일 경로 : C:\tomcat9\webapps\ROOT\WEB-INF\web.xml

실행시킬 class파일 : C:\tomcat9\webapps\ROOT\WEB-INF\classes\test.class

 

 

<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로 바꿔줘야 web.xml 뿐만 아니라 annotation도 인식한다. (@WebServlet)

경로 : C:\tomcat9\webapps\ROOT\WEB-INF\web.xml

 

<xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="false">

 

 

반응형
반응형

📝1. 톰켓설치경로/conf/server.xml 을 열고 URIEncoding 을 추가


<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" />

📝2. 톰켓설치경로/binsetenv.sh 파일 생성 후 내용 추가.


  #!/bin/bash
  JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=\"utf-8\""

반응형
반응형

이 문제의 원인은 tomcat에서 호출한 경로를 제대로 인식하지 못해서 발생한다고 합니다.

 

Servers 탭 톰캣 더블클릭해서 열어주시고 Modules를 눌러주세요 그리고 Path를 /로 바꿔주세요

 

Project - Properties - Web Project Setting 에서 / 로 잡아주세요

반응형