1. 웹 서브시스템이란? |
JBoss EAP 6의 웹 서브시스템에서는 jboss.org 커뮤니티의 JBoss Web 프로젝트를 사용하여 개발된 웹 컨테이너를 사용하고 있습니다. JBoss Web 자체는 원래 Tomcat을 기반으로 작성되어 있어 Tomcat에서 보아보아왔던 익숙한 항목도 많이 찾아볼 수 있습니다.
- 웹 서브시스템에서 필요한 extension
<extension module="org.jboss.as.web"/>
- 웹 서브시스템에 대한 기본 설정
<subsystem xmlns="urn:jboss:domain:web1.4" default-virtual-server="default-host" native="false">
<connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http"/>
<virtual-server name="default-host" enable-welcom-root="true">
<alias name="localhost"/>
<alias name-="example.com"/>
</virtual-server>
</subsystem>
웹 서브시스템에서 설정 가능한 항목은 크게 다음 3개 카테고리로 나눌 수 있습니다.
- 커넥터 : 외부 통신을 위해 사용
- JSP 설정 : JSP 컨테이너의 동작 방법을 설정하기 위해서 사용
- 가상 서버 : 가상 호스팅을 위해 사용
HTTP의 헤더 사이즈, POST 파라미터의 최대값 등 웹 서브시스템의 동작을 상세히 설정하려면 미리 정의된 별도의 시스템 프로퍼티를 사용합니다.
2. 커넥터 설정 |
웹 서브시스템은 요청을 받아들이기 위해 커넥터라는 컴포넌트를 사용합니다.
커넥터는 다음 그림처럼 3가지 종류가 있습니다.
커넥터는 웹 서브시스템의 <connector>에서 정의합니다.
(1) 웹 관리 콘솔에서 커넥터 설정
웹 관리 콘솔에서 'Profiles' → 'Web' → 'Servlet/HTTP Configuration' → 'Connectors' 탭을 선택하여 커넥터의 추가, 편집 및 삭제가 가능합니다.
(2) CLI에서 커넥터 설정 조회
CLI를 사용하여 HTTP 커넥터의 설정을 조회하는 방법은 다음과 같습니다.
CLI에서 조회뿐만 아니라 값의 추가, 수정, 삭제가 모두 가능합니다.
[standalone@localhost:9999 /] /subsystem=web/connector=http:read-resource
{
"outcome" => "success",
"result" => {
"configuration" => undefined,
"enable-lookups" => false,
"enabled" => "true,
"executor" => undefined,
"max-connections" => undefined,
"max-post-size" => 2097152,
"max-save-post-size" => 4096,
"name" => "http",
"protocol" => "HTTP/1.1",
"proxy-name" => undefined,
"proxy-port" => undefined,
"redirect-port" => 443,
"scheme" => "http",
"secure" = false,
"socket-binding" => "http",
"ssl" => undefined,
"virtual-server" => undefined
}
}
(3) HTTP 커넥터 속성들
속성 | 설명 | 기본값 |
enable-lookups | 이 값을 false로 설정하면 성능을 높일 수 있습니다. requst.getRemoteHost() 호출 시 IP 주소 대신 호스트명을 돌려주기 위해 DNS 룩업을 하지 않습니다. 일반적으로 변경할 필요가 없습니다. |
false |
Enabled | 커넥터 사용 여부를 설정하며, 이 값이 false이면 커넥터를 사용할 수 없습니다. | ture |
Executor | 내부 스레드 풀 대신에 외부 Executor thread 풀을 사용하려고 할 때 Executor thread 풀 이름을 지정합니다. | undefined |
max-connections | 커넥터의 최대 커넥션 수로 동시 접속 수를 말하며 기본값은 최대 스레드 수로 설정됩니다. 네이티브 커넥터를 설치한 경우에는 내부적으로 계산된 수치(Java VM에서 사용 가능한 프로세서 수의 32배)로 설정됩니다. |
undefined |
max-post-size | 한 번에 송신할 수 있는 POST 요청의 최대 사이즈 byte 단위로 지정합니다. 이 값이 0이면 무제한입니다. |
2097152 (2MB) |
max-save-post-size | POST 요청일 때 컨테이너에서 저장되거나 버퍼링될 파라미터의 최대 사이즈를 지정합니다. -1을 설정하면 무제한, 0을 설정하면 저장하지 않습니다. |
4096 (4KB) |
name | 커넥터 이름 | - |
protocol | 프로토콜 지정 HTTP/1.1 또는 AJP/1.3 |
- |
proxy-name | 커넥터가 Proxy 구성을 사용할 경우 request.getServerName()을 호출할 때 서버 포트를 지정할 수 있는 속성값을 말합니다. 주로 리버스 프록시를 사용하는 경우에 설정하지만, mod_jk 등 AJP 프로토콜을 사용하는 프록시의 경우는 자동 설정되기 때문에 설정할 필요는 없습니다. |
undefined |
proxy-port | 커넥터가 Proxy 구성을 사용할 경우 request.getServerPort()를 호출할 때 서버 포트를 지정할 수 있는 속성값을 말합니다. 주로 리버스 프록시를 사용하는 경우에 설정하지만, mod_jk 등 AJP 프로토콜을 사용하는 프록시의 경우에는 자동을 설정되지 때문에 설정할 필요가 없습니다. |
undefined |
redirect-port | SSL 리다이렉트에 사용하는 포트번호를 지정합니다. non-SSL 요청에서 <security-constraint>가 설정된 경우에 여기에 지정한 포트번호로 리다이렉트합니다. |
8443 |
scheme | 리다이렉트 URL에 사용되는 request.getScheme()의 반환값에 설정되는 값입니다. 주로 리버스 프록시를 사용하는 경우로 설정하지만, mod_jk 등 AJP 프로토콜을 사용하는 프록시의 경우 자동으로 설정되기 때문에 설정할 필요가 없습니다. SSL 사용 시 https를 지정합니다. |
http |
secure | request.isSecure()의 반환값을 설정합니다. 주로 리버스 프록시를 사용하는 경우에 설정하지만, mod_jk 등 AJP 프로토콜을 사용하는 프록시일 경우에는 자동으로 설정되기 때문에 설정할 필요가 없습니다. true일 경우, 세션 Cookie에 Secure 속성이 부여됩니다. |
false |
socket-binding | 사용할 소켓 바인딩 이름을 지정합니다 | http |
ssl | SSL 커넥터를 사용하는 경우로 설정합니다. | undefined |
virtual-server | 가상 서버를 사용하는 경우로 설정합니다. | undefined |
(4) 새로운 커넥터 추가
새로운 커넥터를 추가하려면 웹 관리 콘솔이나 CLI를 사용하여 설정할 수 있습니다.
다음은 AJP 커넥터를 추가하는 방법입니다.
default 프로파일과 full 프로파일에는 AJP 커넥터가 설정되어 있지 않습니다. 클러스터링을 사용하지 않고 웹 서버를 이용한 로드 밸런싱 기능만 사용하려면 다음과 같이 AJP 커넥터를 추가합니다.
'Profile' → 'Web' → 'Servlet/HTTP' → 'Connectors'탭 → 'Add'를 클릭합니다.
다음 표의 설정 값을 입력합니다.
프로퍼티 | 설정값 |
커넥터 이름 | ajp |
소켓 바인딩 | ajp |
프로토콜 | AJP/1.1 |
스키마 | http |
Enable | ture |
3. JSP 설정 |
JSP 컨테이너가 동작하는 방식을 변경할 때 사용할 수 있는 값들은 다음 표와 같습니다.
웹 서브시스템의 <jsp-configuration>은 한 번만 설정할 수 있습니다.
속성 | 설명 | 기본값 |
check-interval | 재컴파일이 필요한 JSP 페이지들을 체크하는 주기를 초 단위로 지정합니다. 값이 0일 경우에는 체크하지 않습니다. |
0 |
development | 개발 모드를 설정합니다. 운영 환경에서는 이 설정을 false로 합니다. |
false |
disabled | true일 경우 JSP 컨테이너를 사용하지 않는 상태가 됩니다. | false |
display-source-fragment | Exception 메시지에 소스 코드를 포함하여 출력합니다. | true |
dump-smap | true일 경우 JSR-045 표준에 대한 디버그를 출력합니다. | false |
error-on-use-bean-invalid-class-attribute | Bean이 인스턴스화 되지 못할 때 이를 컴파일 에러로 간주합니다. | false |
generate-strings-as-char-arrays | char 배열로서 String를 생성합니다. | false |
java-encoding | JSP 파일을 Java 소스 파일로 생성할 때 사용할 encoding을 지정합니다. | UTF8 |
keep-generated | true로 설정하면 생성된 서블릿을 삭제하지 않고 유지합니다. | true |
mapped-file | 디버그하기 쉽게 정적 콘텐츠도 라인 수를 출력하도록 지정합니다. | true |
modification-test-interval | JSP 변경 유무를 빈번하게 체크하지 않도록 변경시간 체크 주기를 초 단위로 지정합니다. | 4초 |
recompile-on-fail | 컴파일 오류가 발생한 경우 modification-test-interval를 무시하고, 강제적으로 recompile를 실행하도록 설정할 수 있습니다. | false |
scratch-dir | JSP를 컴파일할 때에 사용하는 디렉터리 기본값은 work 디렉터리를 사용합니다. |
undefined |
smap | JSR-045 표준에 맞는 소스 맵 파일을 생성합니다. | true |
source-vm | 소스 파일이 호환되는 JDK 버전 | 1.5 |
tag-pooling | JSP 커스텀 태그 인스턴스 들을 풀로 관리합니다. | true |
target-vm | 클래스 파일이 호환되는 JDK 버전 | 1.5 |
trim-spaces | 응답 데이터에서 필요 없는 스페이스를 삭제합니다. | false |
x-powered-by | HTTP 응답 헤더에 "X-Powered-By" 정보를 출력합니다. | true |
* JSR-045 : Debugging Support for Other Languages
Java 클래스 파일에 JSP 같이Java 언어 이외의 줄 번호를 저장할 수 있는 구조
* X-Powered-By
HTTP 헤더에 아래와 같이 미들웨어 버전과 엔진 정보가 출력됩니다.
"X-Powered-By : Servlet 2.5; Jboss-5.0/JBossWeb-2.1"
해킹 방지 등 보안상의 이유로 출력하지 않으려면 x-powered-by를 false로 설정합니다.
(2) 개발 환경을 위한 JSP 설정
개발 환경에서 JSP 파일의 변경 사항을 주기적으로 체크하여 변경된 JSP 파일이 컴파일되도록 설정하여야 합니다. 변경된 JSP 파일이 컴파일되도록 설정하려면 development 모드를 true로 설정하고, check-interval에 변경된 JSP 파일을 체크하는 주기를 초단위로 설정합니다.
운영 환경에서는 JSP를 컴파일하지 않도록 설정하는 것을 권장합니다.
운영 환경에서 꼭 필요한 경우라면 JSP 체크 주기를 30초 이상으로 설정합니다.
다음은 CLI를 사용하여 개발 환경의 JSP 체크 주기를 설정하는 방법입니다.
[standalone@localhost:9999 /] /subsystem=web/configuration:=jsp-configuration:write-attribute(name=development,value=true)
{
"outcome" => "success",
"response-headers" => {
"operation-requires-reload" => true,
"process-state" => "reload-required"
}
}
[standalone@localhost:9999 /] /subsystem=web/configuration=jsp-configuration:write-attribute(name=check-interval,value=5)
{
"outcome" => "success",
"response-headers" => {
"operation-requires-reload" => true,
"process-state" => "reload-required"
}
}
(4) 가상 서버
JBoss EAP 6의 웹 서브시스템은 EAP 서버상에서 두개 이상의 RL로 애플리케이션을 호스팅할 수 있도록 가상 서버를 정의하는 기능을 제공합니다.
예를 들어, app1과 app2의 두 개의 애플리케이션이 있고, 이 애플리케이션들을 같은 EAP 서버에 배포하는 것을 가정합니다. 이 경우 다음과 같은 URL이 되도록 EAP를 설정할 수 있습니다.
http://www.jboss.com:8080/app1
http://www.redhat.com:8080/app2
그림으로 표현하면 다음과 같습니다.
가상 서버는 웹 서브시스템의 virtual-server 항목에 정의합니다.
웹 관리 콘솔에서 프로파일을 선택한 후 Servlet/HTTP 페이지를 열어, Virtual Servers 탭을 선택하면 가상 서버를 추가, 편집 및 삭제할 수 있습니다.
① 웹 관리 콘솔 설정 위치
'Profiles' -> 'Web' -> 'Servlet/HTTP' -> 'Virtual Servers' 탭 -> 'Add'
'Create Virtual Server'
② 주요 설정 항목
- 가상 서버 이름
- Alias 이름
- 디폴트 모듈
③ CLI에서 가상 서버 추가
<가상 서버 추가>
[standalone@localhost:9999 /] /subsystem=web/virtual-server=redhat:add(default-web-module=app2.war, enable-welcom-root=false,alias=["www.redhat.com"])
{"outcome" => "success"}
<가상 서버 정보 조회>
[standalone@localhost:9999 /] /subsystem=web/virtual-server=redhat:read-resource
{
"outcome" => "success",
"result" => {
"access-log" => undefined,
"alias" => ["www.redhat.com"],
"configuration" => undefined,
"default-web-module" => "app2.war",
"enable-welcome-root" => false,
"name" => "redhat",
"rewrite" => undefined,
"sso" => undefined
}
}
아파치의 가상 호스트(Virtual Host)의 설정과 같은 기능을 제공하는 것이 JBoss EAP6에서는 가상 서버입니다. 일반적으로 JBoss EAP 6 앞단에 아파치 웹 서버를 구성하는 경우가 많아서 JBoss의 가상 서버보다는 웹 서버의 가상 호스트 기능을 사용하여 설정하는 경우가 많습니다.
(5) 시스템 프로퍼티
웹 서브시스템에서는 수 많은 시스템 프로퍼티를 사용할 수 있습니다. 이 값들을 변경하여 웹 서브시스템 자체의 동작을 상세하게 제어할 수 있습니다.
시스템 프로퍼티는 그 값을 변경하는 것으로 웹 서브시스템에 인스턴스에 큰 영향을 줄 수 있기 때문에 벼경하는 경우는 그 의미나 동작을 자세히 이해하고 테스트한 다음 변경해야 합니다.
<주요 시스템 프로퍼티>
속성 | 설명 | 기본값 |
org.apache.tomcat.util.http.Parameters.MAX_COUNT | POST의 Body 중에서 해석할 수 있는 파라미터의 최대값 초과했을 경우 IllegalStateException 발생 |
512 |
org.apache.tomcat.util.http.MimeHeaders.MAX_COUNT | HTTP 요청으로 송신할 수 있는 헤더의 최대값 초과했을 경우 IllegalStateException 발생 |
128 |
org.apache.tomcat.util.net.MAX_THREADS | 요청 처리를 위해 사용하는 스레드 커넥터의 최대값 네이티브 커넥터를 사용할 때만 적용 |
내부 로직 |
org.apache.coyote.http11.Http11Protocol.MAX_HEADER_SZIE | HTTP 헤더의 쵣ㅐ값 초과했을 경우 ArrayOutOfBoundsException 발생 |
8192 Byte |
org.apache.coyote.http11.DEFAULT_CONNECTioN_TimEOUT | 기본 HTTP 소켓 타임아웃 | 60초 |
org.apache.coyote.ajp.DEFAULT_CONNECTION_TimeOUT | 기본 AJP 소켓 타임아웃 | -1(무제한) |
org.apache.tomcat.util.Constants.ENABLE_MODELER | JMX 관리 사용 여부 | false |
org.apache.coyote.ajp.AprProcessor.TOMCATAUTHENTiCATION | JBoss Web에서의 인증 정보를 우선 처리하는 경우 true로 설정 AJP를 통해 요청되는 경우 프론트 엔드 웹 서버의 인증 정보를 사용하는 경우에 false로 설정 |
true |
org.apache.catalina.session.StandardManager.MAX_ACTIVE_SESSIOnS | URI에 대한 인코딩을 설정 | ISO-8859-1 |
org.apache.catalina.connector.USE_BODY_ENCODiNG_FOR_QUERY_STRing | 쿼리 문자열에 본문의 인코딩을 따름 | false |
UTF-8 인코딩을 사용하는 애플리케이션을 배포하기 위해서는 URI에 대한 인코딩을 지정해야 합니다.
다음과 같이 CLI를 사용하여 URI 인코딩을 설정할 수 있습니다.
[standalone@localhost:9999 /] /system-property=org.apache.catalina.connector.URI_ENCODING:add(value="UTF-8")
{
"outcome" => "success",
"response-headers" => {"process-state" => "reload-required"}
}
[standalone@localhost:9999 /] /system-property=org.apache.catalina.connector.USE_BODY_ENCODiNG_FOR_QuERY_STRING:add(value="true")
{
"outcome" => "success",
"response-headers" => {""process-state" => "reload-required"}
}
시스템 프로퍼티를 설정하면 서버를 재시작해야합니다.
위 CLI를 실행하면 XML에는 다음과 같이 설정 됩니다.
<system-properties>
<property name="org.apache.catalina.connector.URI_ENCODING" value="UTF-8"/>
<property name="org.apache.catalina.connector.USE_BODY_ENCODING_FOR_QUERY_STRING" value"true".>
</system-properties>
참고 서적 : 거침없이 배우는 JBoss
'IT 이야기 > JBoss EAP' 카테고리의 다른 글
[Error_Log] java.text.ParseException: Unparseable date 에러 발생 (0) | 2020.10.20 |
---|---|
[JBoss EAP] GC LOG (0) | 2020.10.20 |
JBoss EAP 6과 친해지기 10탄 - JBoss EAP 6 서브시스템 개요 및 프로파일 (0) | 2020.09.28 |
JBoss EAP 6과 친해지기 9탄 - JBoss EAP 6 모듈 아키텍처 (0) | 2020.09.24 |
JBoss EAP 6과 친해지기 8탄 - JBoss EAP 6 도메인 모드 (0) | 2020.09.22 |
댓글