Print
카테고리: [ Web Application Server ]
조회수: 20600

1. 개요

Jetty 9.x 버전에 대한 설명이다.


2. 다운로드

다운로드 링크는 https://www.eclipse.org/jetty/download.html 이다.

2-1. 9.3.x

Jetty 최신 버전인 9.3을 대상으로 설명한다. 마지막 릴리즈 파일은 jetty-distribution-9.3.6.v20151106.tar.gz이다. 압축을 해제하면 다음과 같은 구조의 파일이 생성된다.

$ ls -l
total 636
drwxr-xr-x  2 jetty jetty   4096 Dec 21 09:35 bin
drwxr-xr-x  7 jetty jetty   4096 Dec 21 09:35 demo-base
drwxr-xr-x  2 jetty jetty   4096 Dec 21 09:35 etc
drwxr-xr-x 14 jetty jetty   4096 Dec 21 09:35 lib
-rw-r--r--  1 jetty jetty  30012 Nov  7 03:37 license-eplv10-aslv20.html
drwxr-xr-x  2 jetty jetty   4096 Dec 21 09:35 logs
drwxr-xr-x  3 jetty jetty   4096 Dec 21 09:35 modules
-rw-r--r--  1 jetty jetty   6262 Nov  7 03:37 notice.html
-rw-r--r--  1 jetty jetty   1637 Nov  7 03:37 README.TXT
drwxr-xr-x  2 jetty jetty   4096 Dec 21 09:35 resources
-rw-r--r--  1 jetty jetty   3978 Nov  7 03:37 start.ini
-rw-r--r--  1 jetty jetty 142605 Nov  7 03:37 start.jar
-rw-r--r--  1 jetty jetty 423393 Nov  7 03:37 VERSION.txt
drwxr-xr-x  2 jetty jetty   4096 Dec 21 09:35 webapps

2.2. 9.4.x

2018년 4월 말 현재 9.4 버전은 jetty-distribution-9.4.9.v20180320.tar.gz 이다.


3. 기동

bin 디렉토리 아래의 jetty.sh 파일을 실행하면 다음과 같이 추가적인 argument를 입력하도록 가이드한다.

$ ./jetty.sh
Usage: jetty.sh [-d] {start|stop|run|restart|check|supervise} [ CONFIGS ... ]

Jetty 기동을 위하여 start argument를 추가하여 jetty.sh를 실행해 보자.

$ ./jetty.sh start
Starting Jetty: Exception in thread "main" java.lang.UnsupportedClassVersionError: org/eclipse/jetty/start/Main : Unsupported major.minor version 52.0
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)

FAILED Mon Dec 21 17:28:57 KST 2015

Jetty는 Java 8 이상을 필요로 한다. 그러나 위는 Jetty 기동 시 사용한 Java 버전이 8 미만이기 때문에 발생한 오류이다. 그러면 아래와 같이 JAVA_HOME 환경 변수를 통해 Java 8의 위치를 설정해 보자.

export JAVA_HOME=/java/jdk1.8.0_60

그러나 동일한 오류가 발생한다. Jetty는 JAVA_HOME이 아닌 JAVA 환경 변수를 통해 실제 java 파일의 위치를 설정해야 하기 때문이다.

$ export JAVA=/java/jdk1.8.0_60/bin/java

다시 기동해 보자.

$ ./jetty.sh start
Starting Jetty: 2015-12-21 17:30:54.595:INFO::main: Logging initialized @2027ms
2015-12-21 17:30:54.869:WARN:oejs.HomeBaseWarning:main: This instance of Jetty is not running from a separate {jetty.base} directory, this is not recommended.  See documentation at http://www.eclipse.org/jetty/documentation/current/startup.html
2015-12-21 17:30:55.384:INFO::main: Redirecting stderr/stdout to /jetty/9.3/logs/2015_12_21.stderrout.log
OK Mon Dec 21 17:30:56 KST 2015

한편 Jetty를 중지하기 위해서는 stop argument를 사용한다.

$ ./jetty.sh stop
Stopping Jetty: OK

4. 포트 설정

기본 포트는 8080이다. start.ini 파일 내에 포트 설정이 들어있는데 기본적으로는 comment 처리되어 있다.

## Connector port to listen on
# jetty.http.port=8080

만약 포트를 8180으로 변경하려면 아래와 같이 comment를 제거한 후 jetty.http.port 속성 값을 8180로 변경한다.

jetty.http.port=8180

5. 스레드 설정

start.ini 파일 내 스레드 풀에 대한 설정은 아래와 같다.

### ThreadPool configuration
## Minimum number of threads
# jetty.threadPool.minThreads=10

## Maximum number of threads
# jetty.threadPool.maxThreads=200

## Thread idle timeout (in milliseconds)
# jetty.threadPool.idleTimeout=60000

스레드 덤프를 통해 스레드 풀 생성 현황을 확인해 보자.

"qtp1143839598-20" #20 prio=5 os_prio=0 tid=0x00007fd9a841e000 nid=0x2f30 waiting on condition [0x00007fd9849ac000]
"qtp1143839598-19" #19 prio=5 os_prio=0 tid=0x00007fd9a841c000 nid=0x2f2f waiting on condition [0x00007fd984aad000]
"qtp1143839598-18" #18 prio=5 os_prio=0 tid=0x00007fd9a8419800 nid=0x2f2e waiting on condition [0x00007fd984bae000]
"qtp1143839598-17" #17 prio=5 os_prio=0 tid=0x00007fd9a8418000 nid=0x2f2d waiting on condition [0x00007fd984caf000]
"qtp1143839598-16" #16 prio=5 os_prio=0 tid=0x00007fd9a8416000 nid=0x2f2c waiting on condition [0x00007fd984db0000]
"qtp1143839598-15" #15 prio=5 os_prio=0 tid=0x00007fd9a8414000 nid=0x2f2b waiting on condition [0x00007fd984eb1000]
"qtp1143839598-14" #14 prio=5 os_prio=0 tid=0x00007fd9a8412000 nid=0x2f2a waiting on condition [0x00007fd984fb2000]
"qtp1143839598-13" #13 prio=5 os_prio=0 tid=0x00007fd9a8410800 nid=0x2f29 waiting on condition [0x00007fd9850b3000]
"qtp1143839598-12-acceptor-0@6ef6bd15-ServerConnector@60314ebb{HTTP/1.1,[http/1.1]}{0.0.0.0:8080}" #12 prio=5 os_prio=0 tid=0x00007fd9a840f800 nid=0x2f28 runnable [0x00007fd9851b4000]
"qtp1143839598-11" #11 prio=5 os_prio=0 tid=0x00007fd9a840b000 nid=0x2f27 runnable [0x00007fd9854b5000]

qtp는 QueuedThreadPool의 약자이다. 또한 스레드 명은 “[QueuedThreadPool]-[QueuedThreadPool instance hashcode]-[thread index]” 포맷으로 이루어져 있다.