[ 목차 ]
[ 소개 ]
[ 속성 ]
1. 공통 속성
2. 표준 구현 속성
3. Java TCP 소켓 속성
4. NIO 전용 속성
5. NIO2 전용 속성
[ 중첩 구성 요소 ]
[ 특수 기능 ]
1. Proxy 지원
2. Connector 비교
[ 소개 ]
- (Apache JServ Protocol) AJP Connector 요소는 AJP 프로토콜을 통해 WEB_Connector 와 통신하는 Connector 컴포넌트를 나타낸다.
- 이 Connector 는 Tomcat 을 기존(또는 새로운) Apache 서버에 (외부에서) 보이지 않도록 통합하고 Apache 가 웹 애플리케이션에 포함된 (폰트, CSS, JS 와 같은)정적 콘텐츠를 처리하고 Apache 의 SSL 처리를 활용하려는 경우에 사용된다.
[ 보안 고려사항 ]
- AJP 프로토콜은 HTTP Connector 보다 Tomcat 의 내부 데이터 구조에 더 직접적으로 접근할 수 있으므로 추가적인 보안 고려가 필요하다.
- 다음 속성들의 설정값에 특히 주의해야 한다.
1) address : 접근을 허용할 IP 주소 설정
2) secret : AJP 연결을 보호하는 비밀 키
3) secretRequired : 비밀 키 사용 필수 여부
4) allowedRequestAttributesPattern : 허용된 요청 속성 패턴
[ 로드밸런싱 지원 ]
- 이 Connector 는 Engine 의 jvmRoute 속성과 함께 사용할 경우 로드밸런싱(Load Balancing) 을 지원하며 이를 통해 여러 Tomcat 인스턴스 간에 트래픽을 효율적으로 분산할 수 있다.
[ Tomcat 에서 지원하는 Native Connector ]
- 현재 Tomcat 릴리즈에서 지원되는 네이티브 커넥터는 다음과 같다.
1. JK 1.2.x
- 지원되는 모든 서버와 호환된다.
- 자세한 내용은 JK 문서 참고
2. mod_proxy (Apache httpd 2.x 용)
- Apache HTTP Server 2.2 부터 기본적으로 포함되어있음
- AJP 활성화 후 사용할 수 있다.
- 자세한 내용은 httpd 문서 참고
[ 속성 ]
1. 공통 속성
- 모든 Connector 구현체는 아래의 속성을 지원한다.
속성 | 설명 |
---|---|
allowBackslash | true 설정 시 역슬래시(\) 문자를 경로 구분 기호로 허용된다. (기본값: false) |
allowTrace | HTTP TRACE 메소드 허용 여부 (기본값: false) RFC 7231 섹션 4.3.8 에 따라 TRACE 요청의 응답에 cookie 와 authorization 헤더는 제외된다. 만일 이러한 헤더를 포함하려면 대상 Servlet 에서 doTrace() 메소드를 구현하여 응답을 제어할 수 있다. |
asyncTimeout | 비동기 요청에 대한 timeout 시간 (기본값: 30000, 30초-서블릿 스펙) |
discardFacades | 컨테이너 내부 요청 처리 객체를 격리하는 파사드 객체의 재활용 여부 (기본값: true) true 설정 시 모든 요청 후 가비지 수집을 위해 파사드가 설정되고 false 설정 시 재사용된다. |
enableLookups | true 셋팅 시 원격 클라이언트의 실제 호스트 이름을 반환하기 위해 request.getRemoteHost() 를 호출하여 DNS 조회를 수행, false 셋팅 시 DNS 조회를 건너뛰고 IP 주소를 문자열 형식으로 반환 (기본값: false, 성능 향상) |
encodedSolidusHandling | %2f 시퀀스가 포함된 Request 경로를 처리하는 방식 (기본값: reject) 1. reject: %2f 시퀀스를 포함한 요청 경로를 400 응답으로 거부 2. decode: %2f 를 / 로 디코딩 (%nn 형식도 같이 디코딩됨) 3. passthrough: %2f 를 변경하지 않고 처리 [ 추가 설명 ] - 기본 URL: http://example.com/index.php?page=260&id=22 - 인코딩 URL: http%3A%2F%2Fwww.example.com%2Findex.php%3Fpage%3D260%26id%3D22 |
enforceEncodingInGetWriter | true 인경우 문자 인코딩이 지정되지 않은경우 Response.getWriter() 호출 하게되면 이후에는 Response.getCharacterEncoding() 를 호출하거나 Content-Type 응답헤더에 ISO-8859-1 을 기본값으로 사용 (기본값: true) |
maxCookieCount | 요청당 허용되는 쿠키의 최대 개수 (기본값: 200) 음수값 설정 시 무제한 |
maxParameterCount | 쿼리 문자열 및 Request Body에서 받을 수 있는 요청 매개변수 최대 개수 (기본값: 1000) 음수값 설정 시 무제한 Request Body 는 Post 상황에서 Content Type 이 application/x-www-form-urlencoded 또는 multipart/form-data 인 경우 |
maxPostSize | 컨테이너에서 처리할 수 있는 POST 요청 본문의 최대 사이즈 (기본값: 2097152, 2MB) 음수값 설정 시 무제한이며, 이 제한을 초과하는 요청은 거부된다. |
maxSavePostSize | FORM 또는 CLIENT-CERT 인증 및 HTTP/1.1 업그레이드 중에 컨테이너가 저장/버퍼링할 요청의 본문 최대 사이즈 (기본값: 4096, 4KB) * 원문내용 요약함 * |
parseBodyMethods | application/x-www-form-urlencoded 를 요청 매개변수로 처리할 (쉼표로 구분된) HTTP 메서드 목록 (기본값: POST) * 원문 내용 요약함 * |
port (필수) |
해당 Connector 가 서버 소켓을 생성하고 수신 대기할 TCP 포트 번호 0 으로 설정 시 Tomcat 이 임의의 사용 가능한 포트를 사용함. |
protocol (AJP 구성 시 필수) |
수신 트래픽을 처리할 프로토콜 설정 AJP Connector 를 구성하려면 이 값을 지정해야 하며, 프로토콜에 대한 값을 지정하지 않으면 AJP Connector 가 아닌 HTTP Connector 가 구성된다. AJP Connector 의 표준 프로토콜 값은 Java NIO 기반 Connector 를 사용하는 AJP/1.3 이다. 명시적 프로토콜 값 (본문 마지막의 비교표 참고) 1. org.apache.coyote.ajp.AjpNioProtocol - 논블로킹 Java NIO Connector 2. org.apache.coyote.ajp.AjpNio2Protocol - 논블로킹 Java NIO2 Connector Java Connector 의 구성은 http 와 https 모두 동일하다 |
proxyName | 이 Connector 가 프록시 구성에 사용되는 경우 request.getServerName() 호출 시 반환될 이름 자세한 내용은 하단 특수기능 섹션의 '3. Proxy 지원' 부분 참고 |
proxyPort | 이 Connector 가 프록시 구성에 사용되는 경우 request.getServerPort() 호출 시 반환될 포트 자세한 내용은 하단 특수기능 섹션의 '3. Proxy 지원' 부분 참고 |
redirectPort | SSL 이 필요한 요청이 수신되면 지정된 포트로 자동 리디렉션 한다. |
rejectSuspiciousURIs | Servlet 6.0 스펙에 의해 식별된 의심스러운 URI 패턴중 하나와 일치하는 경우 요청을 거부할지 여부 (기본값: false) |
scheme | request.getScheme() 호출 시 반환하는 프로토콜의 이름 설정 (기본값: http) 예) SSL Connector 의 경우 이 속성을 https 로 설정할 수 있다. |
secure | true 설정 시 이 Connector 가 수신한 요청에 대해서 request.isSecure() 호출 시 true 를 반환한다. (기본값: false) 크립토 카드, SSL 어플라이언스, 웹서버와 같은 SSL 가속기로부터 데이터를 수신하는 (SSL, non-SSL) Connector 에 이 속성을 설정할 수 있다. |
URIEncoding | URL의 URI 바이트를 디코딩 하는데 사용할 문자 인코딩 (기본값: UTF-8) |
useBodyEncodingForURI | URI 쿼리 매개변수에 URIEncoding 대신 contentType 에 지정된 인코딩을 사용할지 여부 (기본값: false) 이 속성은 Tomcat_4.1.x 와의 호환성을 위해 존재함 * 원문 내용 요약함 * |
useIPVHosts | 요청을 수신한 IP 주소를 사용하여 요청을 보낼 호스트를 결정할지 여부 (기본값: false) |
xpoweredBy | Servlet 스펙을 지원한다는 헤더를 사용할지 여부 (기본값: false) |
1004lucifer
2. 표준 구현 속성
- AJP 를 사용하려면 위 설명과 같이 protocol 속성을 꼭 지정해야 한다.
- 표준 AJP Connector (NIO 및 NIO2 포함) 는 위 공통 속성 외에 다음 속성을 모두 지원한다.
속성 | 설명 |
---|---|
acceptCount | maxConnections 에 도달했을 때 들어오는 연결 요청에 대해 운영체제에서 제공하는 Queue(대기열)의 최대 길이 (기본값: 100) 운영체제는 이 설정을 무시하고 Queue 에 다른 사이즈를 사용할수도 있으며, 이 대기열이 가득 차게되면 운영체에서 추가 Connection 을 거부하거나 timeout 이 발생할 수 있다. |
acceptorThreadPriority | 새로운 Connection 을 수락(연결)하는데 사용되는 Acceptor Thread 의 우선순위 (기본값: 5 - java.lang.Thread.NORM_PRIORITY) 자세한 내용은 java.lang.Thread 클래스의 JavaDoc 참고 |
address | 여러 IP 를 가진 서버의 경우, 지정된 포트에서 수신 대기할 주소를 지정하며, 기본적으로 Connector 는 모든 로컬 주소를 수신한다. JVM 에 별다른 시스템 프로퍼티를 설정하지 않은경우 (NIO, NIO2 포함) Connector 는 (IPv4) 0.0.0.0 또는 (IPv6) :: 로 모두 수신한다. |
ajpFlush | (AJP Flush Message) AJP 플러시 메시지를 Proxy 서버로 보낼지 여부를 설정 (기본값: true) 명시적인 플러시가 발생할 때마다 보내며 AJP 플러시 메시지는 본문 콘텐츠가 없는 SEND_BODY_CHUNK 패킷 이다. mod_jk 또는 mod_proxy_ajp 같은 Proxy 모듈은 이 패킷을 수신하면 웹서버에 버퍼링된 데이터를 클라이언트로 즉시 (플러시)전송한다. false 로 설정하면 AJP 패킷 트래픽을 줄일 수 있지만 클라이언트로의 데이터 전송이 지연될 수 있으며, 응답이 완료될 때는 이 설정과 관계없이 항상 클라이언트로 데이터를 플러시 한다. |
allowedRequestAttributesPattern | Proxy 에서 전달받을 임의의 (Request)요청 속성 이름의 정규식 표현 (기본값: null - 허용된 패턴이 설정되지 않음) AJP 프로토콜은 Reverse Proxy(웹서버) 에서 AJP Connector 로 정보를 전달 할 때 Request 속성을 사용한다. [전송되는 주요 요청 속성] - javax.servlet.request.cipher_suite - javax.servlet.request.key_size - javax.servlet.request.ssl_session - javax.servlet.request.X509Certificate - AJP_LOCAL_ADDR - AJP_REMOTE_PORT - AJP_SSL_PROTOCOL - JK_LB_ACTIVATION [Windows IIS 전용 속성] - CERT_ISSUER - CERT_SUBJECT - CERT_COOKIE - HTTPS_SERVER_SUBJECT - CERT_FLAGS - HTTPS_SECRETKEYSIZE - CERT_SERIALNUMBER - HTTPS_SERVER_ISSUER - HTTPS_KEYSIZE [보안설정] AJP 프로토콜은 임의의 요청 속성 전달을 지원한다. - 정규 표현식과 속성 이름이 정확히 일치하지 않으면 해당 요청은 403 오류로 거부된다. - 이 속성은 불필요한 요청속성을 차단하고 보안 위험을 최소화 하는데 중요한 역할을 한다. |
bindOnInit | Connector 의 bindOnInit 속성은 소켓이 언제 바인딩 되는지 제어하는 기능이다. (기본값: true) (Request 소켓의 연결/해제) true 일 때는 Connector 가 초기화 될 때 바인딩 되고 Connector 가 종료될 때 바인딩이 해제되며, false 일때는 Connector 가 시작될 때 바인딩 되고 Connector 가 중지될 때 바인딩이 해제된다. [추가설명] <Service> 의 gracefulStopAwaitMillis 속성과 연관되어 적용된다. false 로 변경할 시 해당 속성 확인 필요 |
clientCertProvider | java.security.cert.X509Certificate 인스턴스가 아닌 다른 형식으로 제공된 클라이언트 인증서 정보를 변환하는데 사용되는 JSEE 공급자를 제어한다. |
ㅁㅁㅁ | HTTP 압축이 사용될 수 있는 MIME 유형의 쉼표로 구분된 목록이며 명시적으로 지정 시 기본값이 (Override)재정의된다. 기본값 : text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json,application/xml |
ㅁㅁㅁ | 서버 대역폭을 절약하기 위해 HTTP/1.1 GZIP 압축을 사용할 수 있다. (기본값: off) [사용 가능한값] - off : 압축 비활성화 - on : 텍스트 데이터에 대해 압축 허용 - force : 모든 경우에 압축 강제 - (int) 정수값 : 압축을 허용하며 압축되기 전 최소 데이터 사이즈를 지정 [참고] (대역폭 절약) compression 과 (CPU 절약) sendfile 간에 절충점이 있다. Connector 가 sendfile 기능을 지원하는 경우(NIO,NIO2) sendfile 사용이 압축보다 우선하여 동작하며 그렇게 되면 48KB 보다 큰 정적 파일이 압축되지 않은 상태로 전송된다. 아래 NIO/NIO2 속성의 useSendfile 속성(기본값: true)을 설정하여 sendfile 기능을 비활성화 하거나 conf/web.xml 또는 웹 애플리케이션의 web.xml 에서 DefaultServlet 구성에서 sendfile 사용 임계값을 변경할 수 있다. |
ㅁㅁㅁ | compression 이 on 으로 설정된경우 압축되기전에 필요한 최소 데이터 (Byte)사이즈 지정 (기본값 : 2048 - 2KB) |
connectionLinger | 이 Connector 가 사용하는 소켓이 닫힐 때 대기하는 (초)시간 (기본값: -1, 비활성화) |
connectionTimeout | Connector 가 연결을 수락한 후 요청 URL 이 제공될 때까지 기다리는 (밀리초)시간 (기본값 : 60000 - 60초) 하지만 Tomcat 배포판의 기본 server.xml 설정파일에는 이 값이 20000 (20초) 로 설정 되어있다. [참고] disableUploadTimeout 이 false 로 설정되어 있지 않으며 이 시간 초과값은 요청본문(있는경우) 읽을때도 사용된다. |
ㅁㅁㅁ | 데이터 업로드가 진행 중일 때 사용하는 (밀리초) Timeout 시간 (기본값: 300000 - 300초) 이 값은 disableUploadTimeout 이 false 로 설정된 경우에만 적용된다. |
ㅁㅁㅁ | Expect: 100-continue 헤더가 포함된 요청에 대해 100 상태코드(임시 응답 코드)를 반환하는 시점 지정 (헤더 설명 링크) [사용 가능한 값] - immediately : 가능한 빨리 100 상태 응답 반환 - onRead : Servlet 이 요청 본문을 읽을 때만 응답. 이를 통해 Servlet이 헤더를 검사하고, 클라이언트가 큰 요청 본문을 전송하기전에 응답 가능 |
ㅁㅁㅁ | 클라이언트 연결이 (Server Name Indication - TLS 확장 표준) SNI 를 제공하지 않거나 제공된 SNI 가 구성된 SSLHostConfig 와 일치하지 않는경우 (이 Connector 가 보안연결용으로 구성된경우) 보안 연결에 사용되는 기본 SSLHostConfig 의 이름 (기본값 : _default_, 설정된 값은 항상 소문자로 변환됨) |
ㅁㅁㅁ | 데이터 업로드 중 Timeout 기능을 비활성화 하는 플래그 (기본값 : true - timeout 시간을 초과하여 데이터 업로드 가능) |
executor | <Executor> 요소에서 지정한 이름 값을 지정한다. (String 값) 이 속성이 설정되고 지정된 Executor 가 존재한다면 Connector 는 해당 Executor Thread Pool 을 사용하며 다른 모든 Thread 속성은 무시한다. Executor 가 지정되지 않은경우 Connector 는 Thread Pool 을 제공하기 위해 Connector 각각의 (private)내부 Executor 를 사용한다. [추가의견] Tomcat_6 에도 옵션이 있는 것으로 보아 예전에는 서버의 리소스를 아끼기 위해 (Executor)공용 Thread Pool 을 만들어서 복수의 Connector 에 공유하여 사용했을 것으로 추측되는데 이제는 굳이 그럴필요가 있을까 싶다. 돈을 좀 더 들여 좋은 스펙을 사용하여 안정성을 확보하는게 더 나을것으로 생각한다. |
executorTerminationTimeoutMillis | Connector 의 내부 Executor (Thread Pool) 가 Connector 중지 프로세스를 계속하기전에 Request 처리 Thread 가 종료될 때까지 기다리는 시간 (기본값 : 5000 - 5초) |
keepAliveTimeout | Connector 가 연결을 종료하기전에 다른 HTTP 요청을 기다리는 시간 (기본값 : connectionTimeout 속성에 설정된 값을 사용) 값으로 -1 설정 시 무한정 대기를 한다. |
maxConnections | 서버에 요청한 Request 를 연결하고 처리하는 최대 연결 개수 (기본값 : 8192) 이 제한에 도달하면 서버는 추가 Request 에 대해서 연결을 수락하지만 Connector 에서 (연결X)처리하지 않으며, maxConnections 미만으로 연결수가 떨어져야만 연결을 (연결O)처리한다. 한도에 도달하면 운영체제는 acceptCount 설정에 따라 연결을 수락할 수 있고 Queue(대기열) 에 추가한다. NIO/NIO2 Connector 에서는 이 값을 -1 로 설정 시 이 기능이 비활성화 되며 연결 개수가 카운트 되지 않는다. (무제한 연결 처리) |
ㅁㅁㅁ | (chunked) 청크된 HTTP 요청에서 청크 확장의 총 길이를 제한 (기본값 : 8192) 값으로 -1 설정 시 무제한 |
maxHeaderCount | 컨테이너에서 허용하는 Request 의 최대 Header 개수 (기본값 : 100) 지정된 헤더개수보다 많은경우 요청이 거부된다. |
ㅁㅁㅁ | maxHttpRequestHeaderSize 와 maxHttpResponseHeaderSize 에 대한 기본값을 제공한다. (기본값: 8192 - 8KB) |
ㅁㅁㅁ | HTTP Request 와 관련된 요청 라인과 헤더의 최대 허용 (바이트)사이즈 (기본값 : maxHttpHeaderSize 설정 값) 수신된 바이트 수와 비교하므로 허용 사이즈는 (요청라인+헤더이름+헤더값+공백+라인종결자) 값과 비교된다. [중요] Request header is too large 에러 이슈를 해결하기 위해 이값을 늘릴 수 있지만 Tomcat 이 모든 Request 에 대해서 셋팅한 값만큼 할당한다는 것을 명심해야 한다. 예를들어 maxHttpRequestHeaderSize 를 1MB 로 지정하고 Tomcat 이 100개의 동시 Request 를 처리하는경우 요청헤더가 100MB 의 (Heap)힙 메모리를 사용하게 된다. |
ㅁㅁㅁ | HTTP Response 와 관련된 응답 라인과 헤더의 최대 허용 (바이트)사이즈 (기본값 : maxHttpHeaderSize 설정 값) 기록된 바이트 수와 비교하므로 허용 사이즈는 (요청라인+헤더이름+헤더값+공백+라인종결자) 값과 비교된다. |
ㅁㅁㅁ | 서버에서 Connection 을 Close 하기 전까지 (연결된 해당 소켓) 파이프라인으로 연결할 수 있는 최대 HTTP 요청 수 (기본값: 100) 이 값을 1 로 설정하면 (HTTP/1.0, HTTP/1.1 의) keep-alive 및 파이프라인이 비활성화 되며, -1 로 설정 시 무제하늬 파이프라인 또는 keep-alive HTTP 요청을 허용한다. [추가정보] Client 가 Tomcat 에 Connection 을 맺고 하나의 (TCP 소켓)Connection 에서 여러번 Request/Response 를 주고 받을 수 있는 Keep-Alive 의 요청 최대 횟수라고 생각하면 된다. |
ㅁㅁㅁ | 실행 대기중인 (작업)태스크의 최대 대기열 사이즈 (기본값: Integer.MAX_VALUE) 대기열이 초과되면 태스크가 거부된다. |
ㅁㅁㅁ | 중단된 업로드에 대해 Tomcat 에서 (무시할)삼킬 요청 본문 데이터를 버퍼링 할 수 있는 최대 바이트 사이즈 (기본값 : 2097152 - 2MB) 중단된 업로드는 요청본문이 무시될 것임을 Tomcat 은 알고있지만 클라이언트가 계속 요청본문을 보내는것을 의미한다. Tomcat 이 클라이언트가 보내는 요청을 삼키지 않으면 클라이언트는 응답을 받을 수 없다. (-)음수로 값을 셋팅 시 무제한으로 동작한다. [추가정보] 클라이언트에서 (파일을) 업로드 할 때 중단되는 흔한 경우는 아마 제한된 업로드보다 많은 용량이 업로드가 될 때가 아닐까 싶다. 이런경우가 (파일을 다 받을 수 없는 상황이어서) 중단된 업로드가 발생하는 것이고, 이러한 사항을 Tomcat (또는 Application) 은 알고있지만 요청을 보내는 클라이언트는 모르는 상황이기에 업로드를 지속적으로 할 것이다. 이 때 클라이언트 입장에서 요청이 끝나야 응답을 받을 텐데 Tomcat 이 요청 본문을 삼키지 않고 끊어버린다면 클라이언트는 응답을 받을 수 없을 것이다. 그렇기 때문에 Tomcat 이 해당 응답을 얼마나 삼킬지 버퍼를 지정해 줘야 한다. 다만 -1로 셋팅하여 값을 무제한으로 설정 시 외부에서 1TB 와 같이 말도안되는 용량을 업로드 하게되면 서버가 금방 메모리가 모자라서 사용을 못하게 될 것이므로 이와같이 적정한 용량을 셋팅해야 한다고 생각한다. |
maxThreads | Connector 에서 생성되는 요청 처리 스레드의 최대 수 (기본값: 200) Executor 가 이 Connector 와 연결된 경우 Connector 는 내부 Executor 대신 연결된 Executor 를 사용하므로 이 속성은 무시된다. Executor 가 연결된경우 여기에 설정된 값이 사용되지 않는다는 것을 명확히 하기위해 (JMX와 같은 곳에는) -1 로 보고된다. |
ㅁㅁㅁ | (chunk) 청크된 HTTP 요청에서 마지막 청크의 후행 헤더의 총 길이를 제한한다. (기본값: 8192 - 8KB) [추가정보] allowedTrailerHeaders 속성에 의하면 톰캣은 기본적으로 모든 메소드에 대해서 트레일러 헤더를 무시한다고 하니 해당 속성에 사용할 메소드를 추가해야 하지 않을까 싶다. (검증 X) |
minSpareThreads | 항상 실행중인 (Active + Idle) 쓰레드의 최소 제한 값 (기본값: 10) Executor 가 이 Connector 와 연결된 경우 Connector 는 내부 Executor 대신 연결된 Executor 를 사용하므로 이 속성은 무시된다. Executor 가 연결된경우 여기에 설정된 값이 사용되지 않는다는 것을 명확히 하기위해 (JMX와 같은 곳에는) -1 로 보고된다. |
packetSize | 최대 AJP 패킷 크기를 바이트 단위로 설정 (기본값: 8192) 8192 미만으로 설정 시 설정이 무시되고 8192가 사용되며 최대값은 65536 이다. 이 값은 mod_jk 에 대해 구성된 max_packet_size 지시어와 동일해야 하며 일반적으로 최대 패킷 크기는 변경할 필요가 없다. 인증서 또는 인증서 체인을 보낼 때 기본값과 관련된 문제가 보고되었다. |
processorCache | 프로토콜 핸들러는 성능 향상을 위해 Processor 객체를 캐싱한다. 이 설정은 캐시할 Processor 객체의 개수를 결정한다. (기본값: 200) 이 설정은 워크로드에 따라 성능과 GC 에 큰 영향을 미칠 수 있으며, 모든 처리 객체의 재사용을 방지하여 보안성을 높이는 효과도 있다. Servlet 3.0 비동기 처리 미사용 : maxThreads 설정과 동일한 값을 사용하는것을 권장 Servlet 3.0 비동기 처리 사용 : maxThreads 와 최대 예상 동시 요청수(동기+비동기) 중 더 큰 값을 선택하는 것을 권장 [사용 가능한 값] - -1 : 무제한 - 0 : 요청 Processor 재사용 안함 - 정수 : 원하는 설정 값 |
secret | AJP 커넥터로 요청을 보낼 수 있는 (Apache) Worker 가 제공해야 하는 비밀키 설정 (기본값: null) secretRequired 속성을 일부러 false 로 구성하지 않는한 null 이 아니고 길이가 0 이 아닌 값으로 지정해야 한다. 여기에 유효한 값이 설정되면 모든 Worker 는 동일한 값을 제공해야 요청이 허용되고 일치하지 않으면 secretRequired 설정과 관계없이 요청은 거부된다. |
secretRequired | AJP Connector 가 시작될 때 secret 속성의 필수 여부 설정 (기본값: true) true 로 설정 시 AJP Connector 는 secret 속성이 null 이 아니고 길이가 0 이 아닌 값으로 설정되어야만 시작된다. 이 속성은 AJP Connector 가 시작될 수 있는지 여부만 제어하며, (Apache) Worker 가 secret 을 제공해야 하는지 여부는 제어하지 않는다. 신뢰 할 수 있는 네트워크 환경에서만 false 로 설정하고 외부네트워크나 공개된 환경에서는 secretRequired 를 true 로 유지하고 강력한 secret 값을 설정하여 보안 위험을 최소화 하는것을 권장한다. |
ㅁㅁㅁ | Keep-Alive 사용되지 않아야 하는 HTTP 클라이언트의 User-Agent 헤더와 일치하는 (java.util.regex 사용)정규식 문자열 (기본값 : "" - EmptyString) |
ㅁㅁㅁ | HTTP 응답의 Server 헤더 값을 재정의 한다. Application 에서 Server 헤더를 설정하면 해당 값이 사용되며, 설정하지 않으면 Server 헤더가 추가되지 않는다. |
ㅁㅁㅁ | Application 에서 설정한 Server 헤더 제거 옵션 (기본값: false) 하지만 server 속성이 설정된 경우 이 속성은 무시된다. |
ㅁㅁㅁ | Connector 에서 SSL 트래픽을 활성화 (기본값: false) SSL 핸드쉐이크/암호화/복호화 사용하려면 true 설정 필요함. 이 값을 true 설정 시 scheme / secure 속성도 설정하며 request.getScheme() 및 request.isSecure() 가 올바르게 전달되도록 해야 한다. |
tcpNoDelay | 서버 소켓에서 TCP_NO_DELAY 옵션 활성화 여부 (기본값: true) 대부분의 상황에서 성능을 향상시킨다. |
threadPriority | JVM 내에서 요청을 처리하는 스레드의 우선순위 설정 (기본값: 5 - java.lang.Thread.NORM_PRIORITY 값과 동일함) Executor 가 이 Connector 와 연결된 경우 Connector 는 내부 Executor 대신 연결된 Executor 를 사용하므로 이 속성은 무시된다. Executor 가 연결된경우 여기에 설정된 값이 사용되지 않는다는 것을 명확히 하기위해 (JMX와 같은 곳에는) -1 로 보고된다. |
ㅁㅁㅁ | Thread Pool 이 minSpareThreads 보다 많은 Thread 를 가지고 있는 경우 해당 Thread 가 유지되는 최대 시간 (기본값: 60000 - 60초) Executor 가 이 Connector 와 연결된 경우 Connector 는 내부 Executor 대신 연결된 Executor 를 사용하므로 이 속성은 무시된다. Executor 가 연결된경우 여기에 설정된 값이 사용되지 않는다는 것을 명확히 하기위해 (JMX와 같은 곳에는) -1 로 보고된다. |
throwOnFailure | Connector 가 Lifecycle 전환 중 Exception 을 만났을 때 예외를 던질지 로그에만 남길지 여부 (기본값: false - 예외를 던지지 않고 로그만 남김) 이 기본값은 org.apache.catalina.startup.EXIT_ON_INIT_FAILURE 시스템 속성에 의해 변경될 수 있다. |
tomcatAuthentication | (Authentication) 인증이 Tomcat 에서 수행될지 여부 (기본값: true) tomcatAuthorization 속성이 true 인경우 이 속성은 무시된다. true 설정 시 인증은 Tomcat 에서 직접 수행된다. false 설정 시 인증된 사용자 정보(Principal)는 외부 웹서버(Apache 등)로부터 전달되며, Tomcat 은 이를 활용하여 권한부여(Authorization) 수행한다. 웹 서버는 사용자계정정보(username) 을 REMOTE_USER 라는 이름의 Request 속성으로 전달해야 한다. 단, 이 (Principal)계정정보에는 아무런 역할(Role) 이 할당되지 않는다. |
tomcatAuthorization | (Authorization) 권한부여가 Tomcat 에서 수행될지 여부 (기본값: false) true 설정 시 인증된 사용자 정보(Principal)는 외부 웹서버에서 이미 인증된 상태로 간주되며, Tomcat 은 이를 기반으로 웹 애플리케이션에 보안제약(Security Constraints)이 있는경우 권한부여가 수행되고 인증된 주체에 역할(Role) 이 할당된다. (Tomcat 의 Realm이 전달된 사용자 이름을 인식하지 못하는경우, Principal 객체는 생성되지만 Role 은 부여되지 않는다.) false 설정 시 Tomcat 은 외부 서버로부터 전달된 Principal 정보를 별도로 처리하지 않으며 권한 부여를 수행하지 않는다. |
useVirtualThreads | Connector 의 내부 executor 에서 가상 스레드(Virtual Threads) 를 사용할지 여부 (기본값: false) 만약 executor 가 설정되어 있다면 이 설정은 무시된다. 이 옵션을 사용하려면 JDK 21 이상을 사용해야 한다. |
3. Java TCP 소켓 속성
- NIO 및 NIO2 구현체는 위에 나열된 공통 Connector 및 HTTP 속성 외에도 다음과 같은 Java TCP 소켓 속성을 지원한다.
속성 | 설명 |
---|---|
socket.rxBufSize | (int) (SO_RCVBUF) 소켓수신버퍼 (바이트)사이즈 (기본값: JVM 기본값) |
socket.txBufSize | (int) (SO_SNDBUF) 소켓전송버퍼 (바이트)사이즈 (기본값: JVM 기본값) 일부 JVM 에서 8KB 이하의 값을 설정 시 매누 낮은 성능이 관찰되어 주의 필요. |
socket.tcpNoDelay | (boolean) 표준 속성 tcpNoDelay 와 동일 [추가정보] true 로 설정 시 Nagle 알고리즘을 비활성화 하여 작은 패킷을 지연없이 전송한다. |
socket.soKeepAlive | (boolean) (SO_KEEPALIVE) 소켓의 Keep-Alive 설정 여부 (기본값: JVM 기본값) |
socket.ooBInline | (boolean) 소켓의 OOBINLINE(Out-of-BconnectionLingerand Inline) 설정 여부 (기본값: JVM 기본값) |
socket.soReuseAddress | (boolean) (SO_REUSEADDR) 소켓주소재사용 옵션 설정 여부 (기본값: JVM 기본값) |
socket.soLingerOn | (boolean) (SO_LINGER) 소켓의 연결종료 후 잔류시간 옵션 설정 여부 위 2. 표준 구현 속성 connectionLinger 의 값이 0 이상이면 true 와 동일하며, 0 미만이면 false 설정한 것과 동일하다. 이 soLingerOn 속성과 soLingerTime 속성이 모두 설정되지 않으면 JVM 기본값을 사용한다. |
socket.soLingerTime | (int) (SO_LINGER) 소켓의 연결종료 후 잔류시간 을 초 단위로 설정한다. 위 2. 표준 구현 속성 connectionLinger 과 동일한 역할을 한다. 이 soLingerTime 속성과 soLingerOn 속성이 모두 설정되지 않으면 JVM 기본값을 사용한다. |
socket.soTimeout | 위 2. 표준 구현 속성 connectionTimeout 과 동일하다. |
socket.performanceConnectionTime | (int) 성능 설정을 위한 첫번째 값이며 자세한 내용은 성능 소켓 옵션 문서 참고 성능 관련 세가지 속성을 모두 설정하지 않으면 JVM 기본값을 사용한다. |
socket.performanceLatency | (int) 성능 설정을 위한 두번째 값이며 자세한 내용은 성능 소켓 옵션 문서 참고 성능 관련 세가지 속성을 모두 설정하지 않으면 JVM 기본값을 사용한다. |
socket.performanceBandwidth | (int) 성능 설정을 위한 세번째 값이며 자세한 내용은 성능 소켓 옵션 문서 참고 성능 관련 세가지 속성을 모두 설정하지 않으면 JVM 기본값을 사용한다. |
socket.unlockTimeout | (int) 소켓 잠금해제(unlock) 타임아웃 시간 (기본값: 250 - 밀리초) 값은 반드시 양수 이어야 하며, 0 이하의 값은 무시된다. |
4. NIO 전용 속성
- 다음의 속성은 NIO Connector 에만 해당된다.
속성 | 설명 |
---|---|
ㅁㅁㅁ | (int) Poller 스레드의 우선순위 설정 (기본값: 5 - java.lang.Thread.NORM_PRIORITY 값과 동일함) |
ㅁㅁㅁ | (int) Poller 의 selector() 메소드 타임아웃 밀리초 시간 (기본값: 1000 - 1초) Connection 의 (clean up)정리가 같은 Thread 에서 수행되므로 이 값을 너무 높게 설정하지 않는것을 권장한다. |
ㅁㅁㅁ | (boolean) sendfile 기능 활성화 여부 설정 (기본값: true) 주의: sendfile 사용 시 Tomcat 의 Response 수행 시 압축 기능이 비활성화 된다. |
socket.directBuffer | (boolean) Direct ByteBuffer 또는 Java Mapped ByteBuffer 사용 여부 설정 (기본값: false) true: java.nio.ByteBuffer.allocateDirect()를 사용하여 버퍼 할당 false: java.nio.ByteBuffer.allocate()를 사용하여 버퍼 할당 DirectBuffer 사용 시 적절한 사이즈의 DirectMemory 공간을 할당해야 한다. 예) Sun JDK에서는 -XX:MaxDirectMemorySize=256m 설정을 권장 |
ㅁㅁㅁ | (boolean) SSL 버퍼에 대해서 Direct ByteBuffer 또는 Java Mapped ByteBuffer 사용 여부 설정 (기본값: false) true: java.nio.ByteBuffer.allocateDirect()를 사용하여 버퍼 할당 false: java.nio.ByteBuffer.allocate()를 사용하여 버퍼 할당 DirectBuffer 사용 시 적절한 사이즈의 DirectMemory 공간을 할당해야 한다. 예) Sun JDK에서는 -XX:MaxDirectMemorySize=256m 설정을 권장 |
socket.appReadBufSize | (int) 각 Connection 의 (Read) 읽기 ByteBuffer 사이즈 설정 (기본값: 8192 - 8KB) 동시 연결수가 적으면 값을 증가시켜 더 많은 데이터를 버퍼링 할수 있으나 Keep-Alive 커넥션이 아주 많다면 값을 줄이거나 JVM Heap 사이즈를 증가하는것을 권장한다. |
socket.appWriteBufSize | (int) 각 Connection 의 (Write) 쓰기 ByteBuffer 사이즈 설정 (기본값: 8192 - 8KB) 동시 연결수가 적으면 값을 증가시켜 더 많은 데이터를 버퍼링 할수 있으나 Keep-Alive 커넥션이 아주 많다면 값을 줄이거나 JVM Heap 사이즈를 증가하는것을 권장한다. 주의: 기본값이 다소 낮으므로, 수만개 이상의 동시 접속이 아닌경우 값을 증가하는것을 권장함. |
socket.bufferPool | (int) NIO Connector 의 채널 객체(NioChannel) 캐시 사이즈 설정 (기본값: 500) 0 : 캐시 없음 -1 : 무제한 캐시 |
socket.bufferPoolSize | (int) NioChannel Pool 사이즈 (바이트)설정 (기본값: 1024*1024*100 - 100MB) [특수 값] 0 : 캐시 없음 -1 : 무제한 캐시 [자동 계산] NioChannel 버퍼 크기 = 읽기 버퍼 크기 + 쓰기 버퍼 크기 SecureNioChannel 버퍼 크기 = 애플리케이션 읽기 버퍼 크기 + 애플리케이션 쓰기 버퍼 크기 + 네트워크 읽기 버퍼 크기 + 네트워크 쓰기 버퍼 크기 |
socket.processorCache | (int) 캐시에 보관할 SocketProcessor 객체 최대 값 (기본값: 0 - 캐시 없음) -1 설정 시 무제한 캐시 |
socket.eventCache | (int) 캐시에 보관할 PollerEvent 객체 최대 값 (기본값: 0 - 캐시 없음) -1 설정 시 무제한 캐시 |
ㅁㅁㅁ | Unix 도메인 소켓이 지원되는 경우, 이 Connector 가 생성할 수신 대기할 소켓의 경로를 설정한다. 설정 시 port 속성은 생략 가능 (자세한 내용은 아래 [특수기능]-4. Unix 도메인 소켓 지원 내용 참고) 추가정보 - JDK 16 이상에서 지원됨 |
ㅁㅁㅁ | unixDomainSocketPath 설정의 Unix 도메인 소켓의 POSIX 권한을 설정한다. (기본값: rw-rw-rw-, 모든 사용자에 대해 읽기쓰기 가능) 권한형식: rwxrwxrwx 형태의 문자열 9자리 (소유자/그룹/기타사용자 권한) r : 읽기 w : 쓰기 x : 실행 - : 권한 없음 |
ㅁㅁㅁ | (boolean) Connector 가 inetd/systemd 네트워크 소켓을 상속해야 하는지 여부 (기본값: false) 단 하나의 커넥터만 네트워크 소켓을 상속 가능하며, systemd 슈퍼데몬의 포트에서 연결 요청이 들어올 때 자동으로 Tomcat 이 시작됨. (java.nio.channels.spi.SelectorProvider 클래스에 대한 JavaDoc 참고) |
5. NIO2 전용 속성
- 다음 속성은 NIO2 Connector 에만 해당한다.
속성 | 설명 |
---|---|
useCaches | (boolean) GC 에 할당되는 객체의 양을 줄이기 위해 객체 캐싱 활성화 여부 (기본값: false) |
socket.directBuffer | (boolean) Direct ByteBuffer 또는 Java Mapped ByteBuffer 사용 여부 설정 (기본값: false) true: java.nio.ByteBuffer.allocateDirect()를 사용하여 버퍼 할당 false: java.nio.ByteBuffer.allocate()를 사용하여 버퍼 할당 DirectBuffer 사용 시 적절한 사이즈의 DirectMemory 공간을 할당해야 한다. 예) Sun JDK에서는 -XX:MaxDirectMemorySize=256m 설정을 권장 |
ㅁㅁㅁ | (boolean) SSL 버퍼에 대해서 Direct ByteBuffer 또는 Java Mapped ByteBuffer 사용 여부 설정 (기본값: false) true: java.nio.ByteBuffer.allocateDirect()를 사용하여 버퍼 할당 false: java.nio.ByteBuffer.allocate()를 사용하여 버퍼 할당 DirectBuffer 사용 시 적절한 사이즈의 DirectMemory 공간을 할당해야 한다. 예) Sun JDK에서는 -XX:MaxDirectMemorySize=256m 설정을 권장 |
socket.appReadBufSize | (int) 각 Connection 의 (Read) 읽기 ByteBuffer 사이즈 설정 (기본값: 8192 - 8KB) 동시 연결수가 적으면 값을 증가시켜 더 많은 데이터를 버퍼링 할수 있으나 Keep-Alive 커넥션이 아주 많다면 값을 줄이거나 JVM Heap 사이즈를 증가하는것을 권장한다. |
socket.appWriteBufSize | (int) 각 Connection 의 (Write) 쓰기 ByteBuffer 사이즈 설정 (기본값: 8192 - 8KB) 동시 연결수가 적으면 값을 증가시켜 더 많은 데이터를 버퍼링 할수 있으나 Keep-Alive 커넥션이 아주 많다면 값을 줄이거나 JVM Heap 사이즈를 증가하는것을 권장한다. 주의: 기본값이 다소 낮으므로, 수만개 이상의 동시 접속이 아닌경우 값을 증가하는것을 권장함. |
socket.bufferPool | (int) NIO2 Connector 에서 Nio2Channel 객체 캐시 사이즈 설정 (기본값: 500) 0 : 캐시 없음 -1 : 무제한 캐시 |
socket.processorCache | (int) 캐시에 보관할 SocketProcessor 객체 최대 값 (기본값: 0 - 캐시 없음) -1 설정 시 무제한 캐시 |
[ 중첩 구성 요소 ]
- 중첩 구성요소 없음
[ 특수 기능 ]
1. Proxy 지원
- (앞단에 WEB서버와 같이 Proxy 서버가 있고) Tomcat 이 Proxy 서버 뒤에서 실행되는경우 ProxyName 및 proxyPort 속성을 설정할 수 있다.
- 이는 웹 애플리케이션이 절대URL 및 리디렉션을 생성할 때 중요한 역할을 하는 request.getServerName() 및 request.getServerPort() 메소드 반환값을 변경할 수 있다.
- 이런 속성을 설정하지 않으면 클라이언트가 원래 요청을 보냈던 (WEB 서버과 같은) Proxy 서버의 이름과 포트가 아닌 Proxy 서버에서 연결을 받은 (Tomcat 의) 서버 이름과 포트 정보가 반환된다 (이렇게 되면 클라이언트가 원래 요청을 보냈던 대상과 달라진다)
- 자세한 내용은 Proxy 지원 방법 문서 참고
2. Connector 비교
- 아래는 Connector 별로 어떻게 다른지 나타낸다.
Java Nio Connector NIO | Java Nio2 Connector NIO2 | APR/native Connector APR (deprecated) | |
---|---|---|---|
Classname | AjpNioProtocol | AjpNio2Protocol | AjpAprProtocol |
Tomcat Version | 7.x onwards | 8.x onwards | 5.5.x onwards |
Support Polling | YES | YES | YES |
Polling Size | maxConnections | maxConnections | maxConnections |
Read Request Headers | Blocking | Blocking | Blocking |
Read Request Body | Blocking | Blocking | Blocking |
Write Response Headers and Body | Blocking | Blocking | Blocking |
Wait for next Request | Non Blocking | Non Blocking | Non Blocking |
Max Connections | maxConnections | maxConnections | maxConnections |
참고
- https://tomcat.apache.org/tomcat-11.0-doc/config/ajp.html
댓글
댓글 쓰기