반응형
Tomcat과 Undertow 설정 방법 및 각 설정의 뜻
웹 애플리케이션 서버를 설정할 때, Tomcat과 Undertow는 자주 사용되는 두 가지 웹 서버입니다. 두 서버 모두 성능 최적화와 안정성을 위해 다양한 설정 옵션을 제공하는데, 이 글에서는 각 서버의 설정 방법과 설정 항목에 대한 의미를 정리해 보겠습니다.
1. Tomcat 설정 방법
Tomcat은 Java 기반의 서블릿 컨테이너로, 웹 애플리케이션을 실행하기 위해 자주 사용됩니다. Tomcat의 설정은 server.xml 파일을 통해 이루어집니다.
<Connector
protocol="org.apache.coyote.http11.Http11Nio2Protocol"
maxThreads="500"
minSpareThreads="50"
acceptCount="1000"
connectionTimeout="30000"
keepAliveTimeout="60000"
maxKeepAliveRequests="1000"
bufferSize="32768"
socketBuffer="32768"
directBuffer="true"
compression="on"
disableUploadTimeout="true"
/>
주요 설정 항목 및 의미
- protocol="org.apache.coyote.http11.Http11Nio2Protocol"
- 의미: NIO2 기반의 비동기 소켓 처리를 활성화합니다. 비동기 처리는 I/O 작업을 비동기적으로 처리하여 성능을 향상시킬 수 있습니다.
- maxThreads="500"
- 의미: 최대 워커 스레드 수를 설정합니다. 이는 동시 요청 처리량을 결정하며, 너무 적으면 요청 처리에 지연이 발생할 수 있습니다.
- minSpareThreads="50"
- 의미: 최소 여유 스레드를 설정합니다. 여유 스레드는 갑작스런 부하가 발생할 경우, 새로운 요청을 처리할 수 있도록 합니다.
- acceptCount="1000"
- 의미: 큐 대기 허용 수를 설정합니다. 요청을 처리하는 스레드가 부족할 때, 대기할 수 있는 최대 요청 수를 정의하며, 이 수를 초과하면 연결을 거절합니다.
- connectionTimeout="30000"
- 의미: 연결 타임아웃을 설정합니다. 클라이언트가 연결을 시도한 후, 응답이 오지 않으면 설정된 시간이 지나면 연결을 종료합니다. (밀리초 단위)
- keepAliveTimeout="60000"
- 의미: KeepAlive 연결을 유지할 시간을 설정합니다. HTTP 연결을 지속적으로 유지하고, 여러 요청을 처리할 수 있게 합니다.
- compression="on"
- 의미: 응답 압축을 활성화하여 네트워크 트래픽을 줄입니다. 대용량 데이터를 전송할 때 유용합니다.
- disableUploadTimeout="true"
- 의미: 업로드 중에 별도의 타임아웃을 비활성화합니다. 파일 업로드 시 타임아웃을 방지할 수 있습니다.
2. Undertow 설정 방법
Undertow는 경량화된 고성능 웹 서버로, 주로 Spring Boot와 함께 사용됩니다. Undertow의 설정은 application.properties 또는 application.yml 파일을 통해 설정할 수 있습니다.
server:
undertow:
io-threads: 32 # 16코어 기준
worker-threads: 2048 # 너무 적으면 에러 가능
buffer-size: 16384
direct-buffers: true
eager-filter-init: true # 서블릿 필터 사전 초기화
allow-blocking: true # 일부 로직에서 블로킹 허용
max-parameters: 10000 # 너무 많으면 오류 가능
max-headers: 500 # 요청 헤더 개수 제한 늘림
max-cookies: 500 # 쿠키 개수 제한 늘림
max-http-header-size: 32KB
connection-timeout: 60s
주요 설정 항목 및 의미
- io-threads: 32
- 의미: I/O 처리 스레드의 수를 설정합니다. CPU 코어 수에 비례하여 2배 정도의 수를 설정하는 것이 일반적입니다. I/O 스레드는 네트워크 요청을 처리하는 데 사용됩니다.
- worker-threads: 2048
- 의미: 비동기 요청을 처리하는 워커 스레드 수를 설정합니다. 서버가 동시에 처리할 수 있는 요청의 수를 결정합니다.
- buffer-size: 16384
- 의미: 요청과 응답에 사용되는 버퍼의 크기를 설정합니다. 큰 요청과 응답을 처리할 때 성능을 최적화할 수 있습니다.
- direct-buffers: true
- 의미: Direct ByteBuffer를 사용하여 메모리 할당을 최적화하고, 가비지 컬렉션(GC) 부담을 줄입니다.
- eager-filter-init: true
- 의미: 서버 시작 시 필터를 미리 초기화하여 성능을 향상시킵니다. 서버가 실행될 때 필터를 미리 로드함으로써 요청 처리 속도가 빨라집니다.
- allow-blocking: true
- 의미: 블로킹 I/O 작업을 허용합니다. 일부 상황에서는 블로킹 I/O가 필요할 수 있기 때문에 이를 허용하는 설정입니다.
- connection-timeout: 60s
- 의미: 커넥션 타임아웃을 설정합니다. 일정 시간 동안 클라이언트와의 연결이 없으면 연결을 종료합니다.
- max-http-header-size: 32KB
- 의미: HTTP 요청 헤더의 최대 크기를 설정합니다. 이를 통해 너무 큰 헤더로 인한 오류를 방지할 수 있습니다.
3. Tomcat과 Undertow의 차이점
- 성능: Undertow는 경량화된 서버로 기본 설정만으로도 높은 성능을 제공합니다. 반면, Tomcat은 보다 복잡한 설정을 요구하지만, 더 많은 기능을 제공합니다.
- 설정: Tomcat은 XML 설정을 사용하며, Undertow는 application.properties 또는 application.yml 파일을 통해 설정합니다.
- 비동기 처리: Tomcat은 NIO2 기반의 비동기 처리를 제공하며, Undertow는 자체적인 고성능 비동기 처리 모델을 사용합니다.
4. 결론
Tomcat과 Undertow는 각각의 특성과 장점이 있으며, 요구되는 성능에 따라 선택하여 사용할 수 있습니다. 기본 설정으로도 Undertow는 우수한 성능을 보이며, Tomcat은 좀 더 고급 설정을 통해 최적화할 수 있습니다. 두 서버 모두 다양한 설정을 통해 성능을 최적화할 수 있으며, 적절한 설정을 통해 대규모 애플리케이션의 부하를 효과적으로 처리할 수 있습니다.
반응형