8장. 웹 서브시스템

Name

Date

Reason For Changes

Version

오픈나루

2013/11

Initial Version

1.0

전준식, jjeon@opennaru.com

2018/02

Second Version

2.0

이번 장에서는 웹 서브시스템에 대해 설명한다. 웹 서브시스템은 서블릿 및 JSP를 기본으로 한 웹 애플리케이션의 실행 환경을 제공한다. 이 때문에 JBoss EAP 6의 서브시스템 중에서도 많이 사용되는 것이 웹 서브시스템이다. 이번 장에서는 웹 서브시스템에서 설정 가능한 각종 항목에 대하여 설명한다. 또, 별도 컴포넌트로 제공하고 있는 네이티브 커넥터의 사용 방법에 관해서도 설명한다.

image

그림 1. 웹 서브시스템 개요

08-1.웹 서브시스템이란?

JBoss EAP 6의 웹 서브시스템에서는 jboss.org 커뮤니티의 JBoss Web 프로젝트를 사용하여 개발된 웹 컨테이너를 사용하고 있다. JBoss Web 자체는 원래 Tomcat를 기반으로 작성되어 있어 이번 장에서 소개하는 설정 항목들은 Tomcat에서 보아왔던 익숙한 항목도 많이 찾아볼 수 있다.

다음 내용은 스탠드얼론 모드 기준으로 standalone.xml 파일에 설정된 웹 서브시스템에 대한 내용이다.

  • 웹 서브시스템에서 필요한 extension

    <extension module="org.jboss.as.web"/>
  • 웹 서브시스템에 대한 기본 설정

    <subsystem xmlns="*urn:jboss:domain:web:1.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-welcome-root="true">
        <alias name="localhost"/>
        <alias name="example.com"/>
      </virtual-server>
    </subsystem>

웹 서브시스템에서 설정 가능한 항목은 크게 다음 3개 카테고리로 나눌 수 있다.

  • 커넥터 : 외부 통신을 위해 사용

  • JSP 설정 : JSP 컨테이너의 동작 방법을 설정하기 위해서 사용

  • 가상 서버 : 가상 호스팅을 위해 사용

HTTP의 헤더 사이즈, POST 파라미터의 최댓값 등 웹 서브시스템의 동작을 상세히 설정하려면 미리 정의된 별도의 시스템 프로퍼티를 사용한다. 시스템 프로퍼티 값들은 이 장의 마지막 부분에서 설명한다.

08-2.커넥터 설정

웹 서브시스템은 요청을 받아들이기 위해 커넥터라는 컴포넌트를 사용한다. 커넥터는 다음 그림처럼 3가지 종류가 있다.

image

그림 2. 웹 서브시스템에서 커넥터의 종류

커넥터는 웹 서브시스템의 <connector>에서 정의한다.

웹 관리 콘솔에서 커넥터 설정

웹 관리 콘솔에서 ‘Profiles’ → ‘Web’ → ‘Servlet/HTTP Configuration’ → ‘Connectors’ 탭을 선택하여 커넥터의 추가, 편집 및 삭제가 가능하다.

image

그림 3. 커넥터 설정 화면

CLI에서 커넥터 설정 조회

CLI를 사용하여 HTTP 커넥터의 설정을 조회하는 방법은 다음과 같다. CLI에서 조회뿐만 아니라, 값의 추가, 수정, 삭제가 모두 가능하다. CLI의 사용법은 ‘16장. JBoss EAP 6 관리도구’에서 자세히 설명한다.

+

[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

}

}

HTTP 커넥터 속성들

속성 설명 기본값

enable-lookups

이 값을 false로 설정하면 성능을 높일 수 있다. request.getRemoteHost() 호출시 IP 주소 대신 호스트명을 돌려주기 위해 DNS 룩업을 하지 않는다. 일반적으로 변경할 필요가 없다.

false

enabled

커넥터 사용 여부를 설정하며, 이 값이 false이면 커넥터를 사용할 수 없다.

true

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

표 1. HTTP 커넥터의 주요 속성

새로운 커넥터를 추가

새로운 커넥터를 추가하려면 웹 관리 콘솔이나 CLI를 사용하여 설정할 수 있다.

다음은 AJP 커넥터를 추가하는 방법이다. default 프로파일과 full 프로파일에는 AJP 커넥터가 설정되어 있지 않다. 클러스터링을 사용하지 않고 웹 서버를 이용한 로드 밸런싱 기능만 사용하려면 다음과 같이 AJP 커넥터를 추가한다.

‘Profile’ ‘Web’ ‘Servlet/HTTP’ ‘Connectors’ 탭 ‘Add’를 클릭한다.

다음 표의 설정 값을 입력한다.

프로퍼티 설정 값

커넥터 이름

ajp

소켓 바인딩

ajp

프로토콜

AJP/1.1

스키마

http

Enable

true

표 2. AJP 커넥터 설정 값

image

그림 4. 새로운 AJP 커넥터 추가

08-3.JSP 설정

JBoss EAP 6에서 JSP 컨테이너가 동작하는 각종 항목을 설정하는 것이 가능하다. 웹 서브시스템의 configuration의 jsp-configuration에서 설정한다. 관리 콘솔에서 사용하는 프로파일의 Web Servlet/HTTP 페이지를 열어 JSP를 설정할 수 있다.

image

그림 5. 웹 관리 콘솔에서 JSP 설정

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 파일을 자바 소스파일로 생성할 때 사용할 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

표 3. JSP의 주요 속성

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로 설정한다.

개발환경을 위한 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"
  }
}

08-4.가상 서버

JBoss EAP 6의 웹 서브시스템은, 다른 URL로부터 같은 EAP 서버상에서 애플리케이션을 호스팅 할 수 있도록 가상 서버를 정의하는 기능을 제공한다. 예를 들어, app1와 app2의 두 개의 애플리케이션이 있고 이 애플리케이션들을 같은 EAP 서버에 배포하는 것을 가정하자. 이 경우 다음과 같은 URL이 되도록 EAP를 설정할 수 있다.

그림으로 표현하면 다음과 같다.

image

그림 6. JBoss EAP 가상서버 구성

가상 서버는 웹 서브시스템의 virtual-server 항목에 정의한다. 웹 관리 콘솔에서 프로파일을 선택한 후 Servlet/HTTP 페이지를 열어, Virtual Servers 탭을 선택하면 가상 서버를 추가, 편집 및 삭제할 수 있다.

가상 서버 설정 작업

웹 관리 콘솔 설정 위치

‘Profiles’ ⇒ ‘Web’ ⇒ ’Servlet/HTTP’ ⇒ ‘Virtual Servers’ 탭 ⇒ ‘Add’ ⇒ ‘Create Virtual Server’

주요 설정 항목

  • 가상 서버 이름

  • Alias 이름

  • 디폴트 모듈

웹 관리 콘솔 화면 가상 서버 추가

image

그림 7. 웹 관리 콘솔에서 설정화면

CLI 에서 가상서버 추가

  • 가상서버 추가

    [standalone@localhost:9999 /] /subsystem=web/virtual-server=redhat:add(default-web-module=app2.war, enable-welcome-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 EAP 6에서는 가상 서버이다. 일반적으로 JBoss EAP 6 앞단에 아파치 웹 서버를 구성하는 경우가 많아서 JBoss의 가상 서버보다는 웹 서버의 가상 호스트기능을 사용하여 설정하는 경우가 많다.

08-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_SIZE

HTTP 헤더의 최댓값. 초과했을 경우, ArrayOutOfBoundsExceptions가 발생한다.

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

애플리케이션의 HTTP 세션의 최대 개수를 지정한다.

-1(무제한)

org.apache.catalina.connector.URI_ENCODING

URI에 대한 인코딩을 설정한다.

ISO-8859-1

org.apache.catalina.connector.USE_BODY_ENCODING_FOR_QUERY_STRING

쿼리 문자열에 본문의 인코딩을 따른다.

false

표 4. 주요 시스템 프로퍼티

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>