스프링부트

Spring Boot Embedded Tomcat 서버 설정

알쓸개잡 2023. 11. 3.

Spring Boot 애플리케이션은 tomcat, jetty, undertow 내장 서버를 사용할 수 있지만 디폴트 내장 서버는 tomcat을 사용한다.

tomcat 내장 서버를 바로 사용할 수 있는 기본 구성 세트가 있지만 속성 또는 yaml 파일을 이용하여 내장 톰캣 서버를 구성하고 기본 설정을 변경할 수 있다.

 

내장 서버 autoconfiguration

spring-boot-autoconfigure에 포함된 내장 서버 관련 auto configuration 관련 코드는 다음 패키지에 있다.

  • org.springframework.boot.autoconfigure.web.embedded

내장 서버 관련 설정 클래스는

  • org.springframework.boot.autoconfigure.web.ServerProperties 클래스 파일이다.

ServerProperties 클래스 파일을 살펴보면

@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
public class ServerProperties {
	...
	private final Tomcat tomcat = new Tomcat();

	private final Jetty jetty = new Jetty();

	private final Netty netty = new Netty();

	private final Undertow undertow = new Undertow();
	...
}

 

내장 서버의 타입에 따른 설정 항목은 다음과 같음을 알 수 있다.

  • server.tomcat.* : Tomcat 관련 설정
  • server.jetty.* : Jetty 관련 설정
  • server.netty.* : Netty 관련 설정 (반응형 웹)
  • server.undertow.* : Undertow 관련 설정

Tomcat 관련 설정 항목에 대해서 spring 공식 문서를 참고해도 좋지만 ServerProperties 파일에 정의된 Tomcat inner 클래스 정의를 살펴보는 것도 설정 항목을 파악하는 데 있어서 나쁘지 않은 것 같다.

ServerProperties 클래스 파일의 Tomcat inner class가 정의된 구성은 다음과 같다.

@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
public class ServerProperties {
	...
    ...
    public static class Tomcat {
    	...
        private final Accesslog accesslog = new Accesslog();
        private final Threads thread = new Threads();
        ...
        private final Resource resource = new Resource();
        private final Mbeanregistry mbeanregistry = new Mbeanregistry();
        private final Remoteip remoteip = new Remoteip();
        ...
        ...
        
        //server.tomcat.accesslog.*
        public static class Accesslog {
		...
		...
        }
        
        //server.tomcat.thread.*
        public static class Threads {
		...
		...
        }
        
        //server.tomcat.resource.*
        public static class Resource {
		...
		...
        }
        
        //server.tomcat.mbeanregistry.*
        public static class Mbeanregistry {
		...
		...
        }
        
        //server.tomcat.remoteip.*
        public static class Remoteip {
		...
		...
        }
    }
}

 

내장 Server and Port

server.port=8181
server.address=ip_address

server.port를 지정하지 않으면 디폴트로 8080포트가 사용된다.

서버 포트를 변경하는 방법에 대한 자세한 내용은 아래 링크를 참고하기 바란다.

2023.09.16 - [스프링부트] - Spring boot embedded server의 default 포트 변경

 

Spring boot embedded server 의 default 포트 변경

기본적으로 Spring Boot 애플리케이션은 임베디드 톰캣 서버의 포트 8080으로 동작한다. Spring Boot의 기본 임베디드 서버 포트를 다른 포트로 변경할 수 있는 몇 가지 방법에 대해서 기록한다. 포트

devel-repository.tistory.com

 

Tomcat access log 활성화 및 구성

기본적으로 내장 톰캣 서버의 access log 설정은 비활성화 된다.

ServerProperties 클래스 파일의 Tomcat.Accesslog inner class를 살펴보면 다음과 같이 초기값이 지정되어 있다.

 

server.tomcat.accesslog.enabled 속성을 사용하여 활성화할 수 있다.

server.tomcat.accesslog.enabled=true

 

다음은 access log 디렉터리 위치를 지정하는 설정이다.

server.tomcat.accesslog.directory=logs

 

다음과 같이 access log 파일 이름의 접미사 또는 접두사를 변경할 수 있다.

# access log 파일 접두사 설정
server.tomcat.accesslog.prefix=access
# access log 파일 접미사 설정
server.tomcat.accesslog.suffix=.log

 

다음과 같이 access log 파일 이름의 날짜 형식을 수정할 수 있다.

날짜 형식을 지정하지 않은 경우 디폴트로 ". yyyy-MM-dd"가 사용된다.

지정된 날짜 형식은 SimpleDateFormat 클래스에 의해서 날짜 변환이 된다.

server.tomcat.accesslog.file-date-format=yyyyMMdd

 

기본적으로 tomcat은 access log를 영구적으로 저장한다. 다음과 같이 access log 보관 일수를 설정할 수 있다.

server.tomcat.accesslog.max-days=7

 

 

Tomcat 서버 Connections 설정

Tomcat 내장 서버에는 스레드 풀링 메커니즘이 내장되어 있다.

간혹 서버 리소스의 제약으로 인해 스레드 풀 개수를 조정해야 할 필요가 있는 경우 설정을 통하여 변경할 수 있다.

디폴트는 다음과 같다.

  • thread pool max : 200 (최대 thread pool 개수)
  • thread min spare : 10 (최소 worker thread 수)
public static class Threads {

    /**
     * Maximum amount of worker threads.
     */
    private int max = 200;

    /**
     * Minimum amount of worker threads.
     */
    private int minSpare = 10;

	...
}

 

다음은 thread pool max를 100으로 설정하고 최소 worker thread 수를 5개로 설정한 예이다.

server.tomcat.thread.max=100
server.tomcat.thread.min-spare=5

 

클라이언트로 연결 이후 요청을 받기까지 타임아웃 설정을 변경할 수 있다.

server.connection-timeout=10s

 

요청 헤더 크기 및 요청 본문 크기 설정

# 최대 HTTP 헤더 크기 설정 (디폴트 8KB)
server.max-http-request-header-size=8KB

# 최대 HTTP Request Body 크기 설정 (디폴트 2MB)
server.tomcat.max-swallow-size=2MB

# 최대 POST Request 크기 (디폴트 2MB)
server.tomcat.max-http-form-post-size=4MB

 

 

SSL 설정

# Enable SSL (디폴트 true)
server.ssl.enabled=true

# SSL 프로토콜 설정 (디폴트 "TLS")
server.ssl.protocol=TLS

# 별칭 설정
# 별칭은 키 저장소에 있는 키에 사용된다.
# 별칭을 지정하지 않으면 키 저장소의 첫 번째 키가 사용된다.
server.ssl.key-alias=tomcat

# 키 저장소 경로, 키 저장소 유형, 키 저장소 공급자 및 비밀번호 설정
server.ssl.key-store=<키 저장소 경로>
server.ssl.key-store-type=<키 저장소 유형>
server.ssl.key-store-provider=<키 저장소 공급자>
server.ssl.key-store-password=<키 저장소 비밀번호>

# 클라이언트 인증서는 trust store를 통해서 유효성을 검사한다.
# trust store 경로, 유형, 공급자 및 비밀번호 설정
server.ssl.trust-store=<trust store 경로>
server.ssl.trust-store-type=<trust store 유형>
server.ssl.trust-store-provider=<trust store 공급자>
server.ssl.trust-store-password=<trust store 비밀번호>

 

Spring Boot 내장 서버에 대한 주요 설정에 대해서 기록하였지만 상당히 많은 설정 항목이 있음을 알 수 있다.

Spring 공식 문서를 통해서 내장 서버에 대한 설정항목을 확인할 수도 있지만 spring-boot-autoconfigure의

org.springframework.boot.autoconfigure.web.ServerProperties 클래스 파일을 살펴보는 것도 설정항목을 파악하는데 많은 도움이 될 수 있을 것이다.

댓글

💲 추천 글