[톰캣] JSESSIONID

서버/톰캣 2016. 7. 28. 14:19

JSESSIONID란?

- 톰캣 컨테이너에서 세션을 유지하기 위해 발급하는 키

- HTTP 프로토콜은 stateless하다. 요청시마다 새로운 연결이 생성되고 응답후 연결은 끊기게 되므로 상태를 유지할 수 없다.

- 따라서, 상태를 저장하기 위해서 톰캣은 JSESSIONID 쿠키를 클라이언트에게 발급해주고 이 값을 통해 세션을 유지할 수 있도록 한다.


동작방식에 대해서

1. 브라우저에 최초 접근시 톰캣은 Response 헤더에 다음과 같이 JSESSIONID값이 발급된다.


Set-Cookie: JSESSIONID=3CB361E0BE1A9A7DE7DB926DF0772BAE


2. 브라우저 재요청시 Response를 통해 받은 JSESSIONID를 Request 헤더의 쿠키에 값을 넣어 서버에 요청한다. 쿠키를 통해 JSESSIONID값을 전달받게 되면 서버는 새로운 JSESSIONID 값을 Response 헤더에 발급하지 않는다.


3. 클라이언트로부터 전달받은 JSESSIONID값을 기준으로 서버에서는 세션 메모리 영역에 상태를 유지할 값들을 저장할 수 있게 된다. (HttpSession 등)


유지범위

- 동일한 Full 도메인 (서브도메인이 다를 경우 쿠키가 유지되지 않으므로..)

- 포트번호는 달라도 무관하다.


한계

- 톰캣 컨테이너를 2대 이상 사용하게 될 경우 세션을 유지할 수 없다. 유지가 되기 위해서는 세션 클러스터링 환경을 구축하여야 한다.

'서버 > 톰캣' 카테고리의 다른 글

[톰캣] server.xml 설정  (1) 2016.07.01
[톰캣] conf 디렉토리 설정파일  (1) 2016.06.24
[톰캣] 디렉토리 구성 및 환경변수  (1) 2016.06.09
[톰캣] 톰캣7 설치  (0) 2016.05.30
[톰캣] setenv.sh 활용하기  (0) 2016.05.23
Posted by SungHoon, Park
,

server.xml은 아래의 톰캣 아키텍처 구조를 그대로 반영한 설정파일이므로, 다음과 같은 구조를 파악하는 것이 설정파일 이해에 많은 도움이 된다.



1. <Server>

- 최상위 컴포넌트로서, 톰캣의 인스턴스와 동일하다.

- 1개 이상의 <Service>를 포함한다.

- 기본으로 8005 포트가 설정되어 있다. 여러개의 톰캣 인스턴스를 사용할 경우, 포트번호 설정을 다르게 하여야 한다.


속성

 설명

 shutdown

 톰캣을 셧다운할 때, 사용할 텍스트를 설정한다. 

 기본으로 "SHUTDOWN"이 설정되어 있는데 TCP 소켓으로 SHUTDOWN 텍스트를 날리면 톰캣 서버가 종료된다. (링크참조)

 따라서, 보안강화를 위해 shutdown의 텍스트를 임의로 변경하거나, 포트 설정을 port="-1"로 셋팅하고 자체적으로 kill 명령을 통해 종료처리를 할 수 있다.


2. <Listener>

- <Server>의 하위 컴포넌트

- 특정 이벤트들을 리스닝하고 이벤트 발생시 응답한다.


3. <GlobalNamingResources>

- <Server>의 하위 컴포넌트

- <Resource> 등을 통해서 전역 리소스를 설정한다. (JNDI 등...)


4. <Service>

- <Server>의 하위 컴포넌트

- 1개 이상의 <Connector>와 <Engine>을 포함한다.

- 기본으로 설정된 이름은 Catalina이다. 여담으로 Catalina 이름의 유래는 톰캣 서블릿 컨테이너를 고안한 Craig McClanahan이 좋아한 섬(Catalina Island) 이름이였다고 한다. (링크참조)


5. <Connector>

- 톰캣은 기본적으로 HTTP(8080), HTTPS(8443), AJP(8009) 커텍터를 제공한다.

- HTTP Connector : https://tomcat.apache.org/tomcat-7.0-doc/config/http.html

- AJP Connector : https://tomcat.apache.org/tomcat-7.0-doc/config/ajp.html


 속성

 설명

port

 포트번호

protocol

 프로토콜명 (HTTP/1.1, AJP/1.3 등..)

acceptCount

 Request 큐의 길이를 설정한다. HTTP 요청시, IDLE 쓰레드가 없을 경우 해당값만큼 요청을 대기한다. 대기 큐에 들어간다는 것은 처리가능한 쓰레드가 없다는 의미이며, 기능장애 가능성이 높다. 따라서, 계속 대기 큐에 쌓이도록 하는 것보다 0~10 내외로 값을 낮게 주어 처리하도록 한다.

redirectPort

 SSL 요청이 들어올 경우 리다이렉트될 포트번호

URIEncoding

 GET 요청을 처리할 때 사용할 인코딩 방식을 설정한다. 톰캣은 기본적으로 ISO-8859-1인데, 한글 사용을 위해 UTF-8로 변경을 해주도록 한다

useBodyEncodingForURI

 true/false로 설정한다. 

 이 값은 request.setCharacterEncoding()으로 설정한 값으로 인코딩을 처리한다. 스프링 프레임워크를 사용할 경우 web.xml에서 CharacterEncodingFilter로  선언해주는 값으로 인코딩을 하게 된다

maxParameterCount

 GET 또는 POST로 전달할 수 있는 파라미터 갯수

 기본값은 10000개

 0으로 설정하게 되면 갯수에 제한을 두지 않는다.

maxPostSize

 POST로 전달할 수 있는 bytes 사이즈
 기본값은 2Mbytes(2097152)
 0이하의 숫자로 설정하게 되면 bytes 사이즈에 제한을 두지 않는다

connectionTimeout

 타임아웃 밀리세컨드

 기본값은 60000(60초)이며 -1일 경우 타임아웃의 제한이 없다

connectionUploadTimeout

 데이터 업로드에 대한 타입아웃 밀리세컨드
 이 설정은 disableUploadTimeout이 false일 경우에 효과가 있다

maxThreads

 Connector에서 처리할 수 있는 동시 요청 쓰레드 갯수

 기본값은 200개

 아파치와 연동할 경우 MaxClients 값과 관계가 있다. 아파치 MaxClients가 톰캣의 maxThreads보다 많을 경우 hang이 걸릴수가 있다.


 ※ maxThreads X 로드밸런싱 갯수 = MaxClients * 1.1 (또는 1.2)

    아파치 prefork 방식 기준이다.


 ※ http://knight76.tistory.com/entry/Apache-http-서버와-tomcat-서버간의-연결-유의사항 참고

minSpareThreads

 최소로 유지할 쓰레드 갯수
 기본값은 10

maxSpareThreads

 idle 상태로 유지할 최대 쓰레드 갯수

 톰캣6 이후로 없어진 속성값. 톰캣 5.5까지 지원한다.


6. <Engine>

- 커넥터로 수신한 클라이언트의 요청을 처리하고 응답한다.

- 기본으로 설정된 이름은 Catalina이다.


7. <Host>

- VirtualHost를 의미하며, name 속성으로 설정된 호스트명으로 웹 애플리케이션을 제공한다.

- 기본으로 설정된 이름은 localhost이다.

- 하나의 톰캣 인스턴스에 여러개의 <Host>도 사용가능하나, 보통 톰캣 인스턴스당 1개의 <Host> 설정을 추천한다.


속성

 설명

 appBase

 웹 애플리케이션이 존재하는 경로. CATALINA_BASE의 webapps를 기본으로 한다.

unpackWARs

 기동시 war 파일을 압축해제한다.

autoDeploy

 class 파일, JSP, XML 등이 갱신되었을 때 자동으로 배포한다.


8. <Context>

- 웹 애플리케이션의 의미한다.

- <Context> 설정이 <Host>안에 없을 경우 기본적으로 webapps 하위의 ROOT 디렉토리(or ROOT.war)을 기본경로(http://localhost:8080/)로 설정한다.


- 컨텍스트 설정은 CATALINA_BASE 하위의 conf 디렉토리에서도 설정할 수 있다.

예제) %CATALINA_BASE%\conf\[엔진명]\[호스트명] 하위에 설정파일 추가.

- %CATALINA_BASE%\conf\Catalina\localhost\host-manager.xml

  <Context antiResourceLocking="false" privileged="true" useHttpOnly="true" />


- %CATALINA_BASE%\conf\Catalina\localhost\manager.xml

  <Context antiResourceLocking="false" privileged="true" useHttpOnly="true" />


9. <Valve>

- 요청을 처리하는 파이프라인 사이에 추가되어 특별한 처리를 수행하는 컴포넌트다.

- Valve는 Catalina 컨테이너(Context, Host 또는 Engine)에 추가되어, 요청과 응답 사이에 pre-processing을 가능하게 한다. <Context>에 추가되면 해당 웹 애플리케이션에 Valve가 적용, <Host>에 추가되면 모든 웹 애플리케이션에 Valve가 적용된다.

- Servlet Filter와 비슷한 기능이나, Servlet은 EE 스펙, Valve는 톰캣 스펙이다.


※참고자료

- 리눅스를 활용한 회사 인프라 구축의 모든 것

http://i5on9i.blogspot.kr/2014/07/tomcat-valve-servlet-filter.html

https://tomcat.apache.org/tomcat-7.0-doc/config/valve.html

http://bcho.tistory.com/788





'서버 > 톰캣' 카테고리의 다른 글

[톰캣] JSESSIONID  (0) 2016.07.28
[톰캣] conf 디렉토리 설정파일  (1) 2016.06.24
[톰캣] 디렉토리 구성 및 환경변수  (1) 2016.06.09
[톰캣] 톰캣7 설치  (0) 2016.05.30
[톰캣] setenv.sh 활용하기  (0) 2016.05.23
Posted by SungHoon, Park
,

conf 디렉토리 하위에는 7개의 설정파일이 존재한다.


1. server.xml

- 톰캣 설정에서 가장 중요한 파일이다. 톰캣의 Service, Connector(포트 설정 등), Host 정보와 같은 중요한 정보들을 설정한다.


2. catalina.policy

- 보안 정책 권한 설정 파일이다. JVM에 의해서 웹 애플리케이션에 강제적으로 보안 정책 권한을 설정한다.


3. catalina.properties

- 서버를 시작할 때 검색하는 서버, 공유로더, jar 등의 공유정보를 포함한다.


4. tomcat-users.xml

- 사용자 권한과 인증 정보를 설정한다.

- 톰캣 관리자를 사용할 때 활용되는 정보이며, 기본적으로 주석처리가 되어 있다. 주석해제 및 설정을 하여야 톰캣 관리자가 활성화 된다.


5. logging.properties

- 톰캣 인스턴스의 로깅 설정 파일이다.

- 톰캣에서는 java.util.logging을 구현한 줄리(tomcat-juli.jar) 라이브러리를 로깅 서비스로 활용한다.

- 기본적으로 4가지 로그 파일을 설정한다.


1. catalina.{yyyy-mm-dd}.log

- 톰캣 로그 : 서버로그 or 카탈리나 로그로도 불린다.

- stdout(System.out), stderr(System.err)에 관한 에러로그들을 출력한다. 


2. localhost.{yyyy-mm-dd}.log

- server.xml에 설정된 호스트들의 로그


3. manager.{yyyy-mm-dd}.log

- 톰캣 관리자 애플리케이션 로그


4. host-manager.{yyyy-mm-dd}.log

- 호스트 관리자 애플리케이션 로그


6. web.xml

- 톰캣 인스턴스에서 사용하는 기본 설정파일이다. 웹 애플리케이션에서 web.xml이 설정되어 있다면 웹 애플리케이션 설정이 우선한다.


7. context.xml

- 세션, 쿠키 저장경로 등을 지정하는 설정 파일이다.


'서버 > 톰캣' 카테고리의 다른 글

[톰캣] JSESSIONID  (0) 2016.07.28
[톰캣] server.xml 설정  (1) 2016.07.01
[톰캣] 디렉토리 구성 및 환경변수  (1) 2016.06.09
[톰캣] 톰캣7 설치  (0) 2016.05.30
[톰캣] setenv.sh 활용하기  (0) 2016.05.23
Posted by SungHoon, Park
,

톰캣을 구성하는 디렉토리 구조는 다음과 같다.


디렉토리명

설명

톰캣엔진

사용

인스턴스

사용

 bin

 톰캣 실행시 사용하는 스크립트 디렉토리

 

 conf

 웹 어플리케이션에 필요한 설정 파일 디렉토리

 

 lib

 톰캣에서 사용하는 라이브러리 디렉토리

 

 logs

 로그 디렉토리

 

 temp

 임시 파일 디렉토리

 

 webapps

 웹 어플리케이션 배포 디렉토리

 기본으로 docs, examples, host-manager, manager가 존재한다.

 

 work

 JSP가 Servlet 컴파일되는 디렉토리

 


[톰캣엔진에서 사용]으로 표시된 디렉토리는 톰캣엔진이 실제 구동될 때 사용하는 디렉토리를 의미하며,

[인스턴스에서 사용]으로 표시된 디렉토리는 웹 어플리케이션에서 웹서비스를 위해 사용하는 디렉토리들을 의미한다. 이 디렉토리들은 톰캣 환경변수 CATALINA_BASE와도 관련이 있다.


다음은 톰캣 환경변수 정보이다.


환경변수명

설명

 CATALINA_BASE

 톰캣 구동시 띄워지게 되는 웹서비스 인스턴스의 베이스 디렉토리

 conf, logs, temp, webapps, work 디렉토리를 포함하는 홈 디렉토리를 의미한다.

 CATALINA_HOME

 톰캣 설치 홈 디렉토리

 CATALINA_TMPDIR

 톰캣 인스턴스의 임시 디렉토리

 JRE_HOME

 자바 런타임 디렉토리

 CLASSPATH

 클래스패스 경로


환경변수에서는 CATALINA_BASE의 의미에 대해 살펴보자.


CATALINA_BASE는 인스턴스 단위에 대한 베이스 디렉토리이다.

톰캣 설치시 CATALINA_BASE에 관한 디렉토리들이 톰캣 홈 디렉토리 하위에 포함되기 때문에, CATALINA_BASE와 CATALINA_HOME의 경로가 같은 것이다.

톰캣이 시작되면 CATALINA_BASE의 conf, logs, temp, webapps, work 디렉토리 설정 등을 물고 구동되어 웹서비스를 제공하게 된다.


bin 디렉토리의 version.sh 스크립트를 실행하면 환경변수 정보를 확인할 수 있다.


[root@localhost bin]# ./version.sh 
Using CATALINA_BASE:   /root/apps/tomcat
Using CATALINA_HOME:   /root/apps/tomcat
Using CATALINA_TMPDIR: /root/apps/tomcat/temp
Using JRE_HOME:        /usr/java/jdk1.8.0_91
Using CLASSPATH:       /root/apps/tomcat/bin/bootstrap.jar:/root/apps/tomcat/bin/tomcat-juli.jar
Server version: Apache Tomcat/7.0.69
Server built:   Apr 11 2016 07:57:09 UTC
Server number:  7.0.69.0
OS Name:        Linux
OS Version:     3.10.0-123.el7.x86_64
Architecture:   amd64
JVM Version:    1.8.0_91-b14
JVM Vendor:     Oracle Corporation


만약, 톰캣 인스턴스를 2개 운영해야 한다면...


~/deploy/inst1

ㄴ conf

ㄴ logs

ㄴ temp

ㄴ webapps

ㄴ work


~/deploy/inst2

ㄴ conf

ㄴ logs

ㄴ temp

ㄴ webapps

ㄴ work


위와 같이 나누고, conf 디렉토리의 server.xml 설정에서 Server 포트, HTTP 포트, AJP 포트, REDIRECT 포트를 다르게 설정해준다. 그리고 구동 스크립트를 2개로 나누어 CATALINA_BASE를 따로 설정하여 띄우면 된다.


[startup-1.sh]

#! /bin/sh


#! usr/bin/env bash

export CATALINA_BASE=~/deploy/inst1

export CATALINA_OPTS="-Denv.servername=inst1"


./startup.sh


[startup-2.sh]

#! /bin/sh


#! usr/bin/env bash

export CATALINA_BASE=~/deploy/inst2

export CATALINA_OPTS="-Denv.servername=inst2"


./startup.sh



'서버 > 톰캣' 카테고리의 다른 글

[톰캣] server.xml 설정  (1) 2016.07.01
[톰캣] conf 디렉토리 설정파일  (1) 2016.06.24
[톰캣] 톰캣7 설치  (0) 2016.05.30
[톰캣] setenv.sh 활용하기  (0) 2016.05.23
[톰캣] 버전별 Servlet, JSP, JAVA 지원 스펙  (0) 2016.04.12
Posted by SungHoon, Park
,

현재 톰캣 9.0까지 나와 있으나, 7.0을 기준으로 설치한다.


1. 다운로드

- http://apache.tt.co.kr/tomcat/tomcat-7/v7.0.69/bin/apache-tomcat-7.0.69.tar.gz


2. 설치

1) 톰캣을 설치할 적당한 디렉토리를 생성한다.


[root@localhost ~]# mkdir apps


2) 다운로드 받은 tar.gz 파일을 apps 디렉토리로 이동한다.


[root@localhost ~]# mv 다운로드/apache-tomcat-7.0.69.tar.gz apps/


3) 압축해제


[root@localhost apps]# tar xvf apache-tomcat-7.0.69.tar.gz


4) 심볼릭 링크 생성

- 링크를 생성하지 않아도 무방하나, 간단하게 tomcat으로 링크를 연결하면 작업시 편하다.


[root@localhost apps]# ln -s apache-tomcat-7.0.69 tomcat


3. 톰캣 실행

- bin 디렉토리로 이동후, startup.sh을 실행한다. 그리고나서, http://localhost:8080 접속한다.


[root@localhost bin] ./startup.sh




Posted by SungHoon, Park
,

톰캣 운영시, JVM 옵션과 같은 추가 설정을 좀 더 깔끔하게 관리할 수 있는 방법에 대해 정리한다.

 

문제점

- 대부분의 시스템들은 JVM 관련 옵션을 catalina.sh 파일을 수정하여 사용함.

- 이렇게 catalina.sh 파일을 수정을 하게될 경우 유지보수에 많은 어려움이 있다.

톰캣 버전 업그레이드나, 서버이전 등과 같은 작업이 발생할 경우 설정된 옵션을 옮기기 위해서 주의하여 값을 추출하여야 한다.

- 또한, catalina.sh을 지속적으로 수정하게 된다면 톰캣의 메일 sheell을 잘못 건드릴 수 있는 위험성이 존재한다.

 

[현재 catalina.sh 예시] 

# -----------------------------------------------------------------------------

# OS specific support.  $var _must_ be set to either true or false.


CATALINA_OPTS="-server -Xmx2g -Xms2g -XX:PermSize=512m -XX:MaxPermSize=512m -XX:+UseParallelOldGC -Dfile.encoding=UTF-8" 

CATALINA_OPTS="$CATALINA_OPTS -verbosegc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails"

 

cygwin=false
os400=false
darwin=false
case "`uname`" in
CYGWIN*) cygwin=true;;
OS400*) os400=true;;
Darwin*) darwin=true;;
esac 

... 

 

해결방법

- 톰캣에는 이러한 옵션값을 추가할 수 있는 또 다른 방법을 제공한다.  바로 bin 하위에 setenv.sh 파일을 사용하는 방법이다.

- 해당 파일은 기본적으로 존재하지 않으며, 직접 쉘 파일을 생성해줘야 한다.

  

[/bin/setenv.sh 파일 생성]

-------------------------------------------------------------------------------------------------------------------

CATALINA_OPTS="-server -Xmx2g -Xms2g -XX:PermSize=512m -XX:MaxPermSize=512m -XX:+UseParallelOldGC -Dfile.encoding=UTF-8" 

CATALINA_OPTS="$CATALINA_OPTS -verbosegc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails"

-------------------------------------------------------------------------------------------------------------------


setenv.sh이 있을 경우 catalina.sh에서 다음과 같이 setenv.sh 파일을 로드하게 된다.

 

if [ -r "$CATALINA_BASE/bin/setenv.sh" ]; then
  . "$CATALINA_BASE/bin/setenv.sh"
elif [ -r "$CATALINA_HOME/bin/setenv.sh" ]; then
  . "$CATALINA_HOME/bin/setenv.sh"
fi 

 

마치며

- setenv.sh로 옵션 정보를 옮기게 된다면 위에서 언급한 것처럼 톰캣 업그레이드나 서버이전 등과 같은 작업이 있을 경우 좀 더 편리한 장점이 있다.

(setenv.sh과 server.xml 파일만 옮기면 톰캣에 관한 설정은 끝날 듯)

- 또한, 옵션을 처리하는 영역이 명확히 분리되기에, 옵션을 추가하는 등 유지보수 측면에서도 좋은 역할을 할 것이라 생각한다.



Posted by SungHoon, Park
,

톰캣 버전별로 지원하는 Servlet Spec, JSP Spec, Java Spec을 설명한 표이다.

2016-04-12 기준.



참고자료

http://tomcat.apache.org/whichversion.html

'서버 > 톰캣' 카테고리의 다른 글

[톰캣] server.xml 설정  (1) 2016.07.01
[톰캣] conf 디렉토리 설정파일  (1) 2016.06.24
[톰캣] 디렉토리 구성 및 환경변수  (1) 2016.06.09
[톰캣] 톰캣7 설치  (0) 2016.05.30
[톰캣] setenv.sh 활용하기  (0) 2016.05.23
Posted by SungHoon, Park
,