공개 SW 솔루션설치 & 활용가이드 미들웨어 > 웹서버 제대로배워보자 How to Use Open Source Software Open Source Software Installation & Application Guide
CONTENTS 1. 개요 2. 기능요약 3. 실행환경 4. 설치및실행 5. 기능소개 6. 활용예제 7. FAQ 8. 용어정리
- 3-1. 개요 소개 주요기능 Jetty Web Server 는독립형또는내장된인스턴스를통해정적 / 동적콘텐츠를제공할수있는 HTTP 서버와서블릿컨테이너제공 비동기 HTTP 서버 표준기반서블릿컨테이너 웹소켓서버 http / 2 서버 OSGI, JNDI, JMX, JASPI, AJP 지원 대분류 미들웨어소분류 웹서버 라이선스형태 Apache License 2.0, Eclipse Public License 1.6 사전설치솔루션 JDK1.8 이상 운영제제 Windows, Linux, Mac, Unix 등버전 9.4.6 특징 보안취약점 개발회사 / 커뮤니티 Eclipse 유연하고확장가능 비동기식 엔터프라이즈확장가능 오픈소스및상업적으로사용가능 취약점 ID : CVE-2015-2080 심각도 : 7.5 HIGH(V3) 취약점설명 : 예외처리코드인 9.2.9.v20150224 를사용하면원격공격자가 HTTP 헤더 (JetLeak) 의잘못된문자를통해프로세스메모리에서중요한정보를얻을수있음 대응방안 : 9.2.9 이상업데이트 참고경로 : https://lists.fedoraproject.org/pipermail/package-announce/2015-march/151804.html 공식홈페이지 http://www.eclipse.org/jetty/index.html
- 4-2. 기능요약 Jetty는 JAVA EE 사양중주로 Servlet 사양을구현하고있다. Jetty 자체가모든 Web Profile 기술을제공하지않지만 Jetty 아키텍처는타사기능을플러그인하여정확한요구에맞게사용자정의된컨테이너를생성할수있도록한다. Version JVM Protocols Servlet/JSP 9.4 1.8 9.3 1.8 HTTP/1.1 (RFC 7230), HTTP/2 (RFC 7540), WebSocket (RFC 6455, JSR 356), FastCGI HTTP/1.1 (RFC 7230), HTTP/2 (RFC 7540), WebSocket (RFC 6455, JSR 356), FastCGI 3.1/2.3 3.1/2.3 9.2 1.7 HTTP/1.1 RFC2616, javax.websocket, SPDY v3 3.1/2.3 8 1.6 7 1.5 HTTP/1.1 RFC2616, WebSocket RFC 6455, SPDY v3 HTTP/1.1 RFC2616, WebSocket RFC 6455, SPDY v3 3.0/2.2 2.5/2.1
- 5-2. 기능요약 Java EE 7 Web Profile JSR Web Profile 명 Jetty-9.1.x 포함여부플러그인여부 JSR 340 Servlet Specification API 3.1 Yes JSR 344 Java Server Faces 2.2 (JSF) No JSR 245 / JSR 341 JSR 330 Java Server Pages 2.3/Java Expression Language 3.0 (JSP/EL) Dependency Injection for Java 1.0 Yes No Yes, Mojarra or MyFaces Yes Yes as part of a CDI implementation, Weld JSR 907 Java Transaction API 1.2 (JTA) Yes Yes JSR 356 Java API for Websocket 1.0 Yes No
- 6-3. 실행환경 Jetty 는 Java 로구현된 HTTP 서버및 Servlet 컨테이너로 Eclipse Foundation 의무료및공개 SW 프로젝트이다. Jetty 는독립적으로서버를구성할수있고, Java 응용프로그램에포함되어웹서비스를제공 할수있는 API 를지원한다. 본가이드에서는아래와같은환경으로구성되어있다. JAVA 8 Jetty 9.4.6.v20170531
- 7-4. 설치및실행 세부목차 4.1 다운로드 4.2 설치 4.3 디렉토리구성 4.4 실행 4.5 데모실행
- 8-4. 설치및실행 4.1 다운받기 (1/2) 먼저 JDK(Java Development Kit) 가설치되어있어야한다. 미설치시는 http://www.java.com/ko/download/ 에서다운받아설치한다.
- 9-4. 설치및실행 4.1 다운받기 (2/2) Jetty 서버는 https://www.eclipse.org/jetty/download.html 에서다운로드받는다. 파일은 zip 과 gzip 포맷형식으로다운로드받을수있다. 설치할서버에적당한파일 형식으로다운로드받는다.
- 10-4. 설치및실행 4.2 설치 (1/3) 다운로드받은파일을압축해제한다.
- 11-4. 설치및실행 4.2 설치 (2/3) 압축을해제하면아래와같은디렉토리가보인다.
- 12-4. 설치및실행 4.2 설치 (3/3).bash_profile 에 JETTY_HOME 을등록한다. $ vi ~/.bash_profile export JETTY_HOME=/home/jetty/jetty-distribution-9.4.6.v20170531 $ source ~/.bash_profile
- 13-4. 설치및실행 4.3 디렉토리구성 주요디렉토리구성은아래와같다. Location license-eplv10-aslv20.html VERSION.txt 라이선스파일 Release 정보 Description etc/ lib/ modules/ logs/ wbapps/ start.ini start.jar Jetty XML 설정파일실행에필요한 jar 파일모듈정의파일로그정보기본 web 소스디렉토리실행옵션을포함하고있는파일 Jetty 실행 Jar
- 14-4. 설치및실행 4.4 실행 (1/2) Jetty 를기본 8080 port 를시작하기위해서는아래와같은명령을실행한다.
- 15-4. 설치및실행 4.4 실행 (2/2) Jetty 를실행한서버로브라우저를통해서비스호출을실행해본다. 하지만 $JETTY_HOME 디렉토리에는 deploy 된 webapps 가없기때문에 404 Error 가보이게된다.
- 16-4. 설치및실행 4.5 데모실행 (1/2) demo-base 디렉토리에 jetty demo 예제를실행해본다.
- 17-4. 설치및실행 4.5 데모실행 (2/2) Jetty 를실행한서버로접속하여브라우저를통해서비스호출을실행해본다.
- 18-5. 기능소개 세부목차 5.1 HTTP 포트변경 5.2 SSL 설정 5.3 HTTPS 포트변경 5.4 웹애플리케이션디플로이 5.5 Virtual Hosts 설정 5.6 로깅
- 19-5. 기능소개 5.1 HTTP 포트변경 (1/2) jetty.http.port property 설정을통해포트를변경할수있다. [jetty ~/jetty-distribution-9.4.6.v20170531]$ java -jar start.jar jetty.http.port=8081 2017-07-24 11:30:07.720:INFO::main: Logging initialized @470ms to org.eclipse.jetty.util.log.stderrlog 2017-07-24 11:30:07.886: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 2017-07-24 11:30:07.918:INFO:oejs.Server:main: jetty-9.4.6.v20170531 2017-07-24 11:30:07.938:INFO:oejdp.ScanningAppProvider:main: Deployment monitor [file:///home/jetty/jetty-distribution-9.4.6.v20170531/webapps/] at interval 1 2017-07-24 11:30:07.955:INFO:oejs.AbstractConnector:main: Started ServerConnector@1794d431{HTTP/1.1,[http/1.1]}{0.0.0.0:8081} 2017-07-24 11:30:07.956:INFO:oejs.Server:main: Started @706ms
- 20-5. 기능소개 5.1 HTTP 포트변경 (2/2) 영구적으로포트를변경해야하는경우에는 start.ini 파일을수정한다. ## Connector host/address to bind to # jetty.http.host=0.0.0.0 ## Connector port to listen on jetty.http.port=8081 ## Connector idle timeout in milliseconds # jetty.http.idletimeout=30000 ## Connector socket linger time in seconds (-1 to disable) # jetty.http.solingertime=-1 ## Number of acceptors (-1 picks default based on number of cores) # jetty.http.acceptors=-1
- 21-5. 기능소개 5.2 SSL 설정 (1/6) OpenSSL 을사용하여 SSL 인증서를만든다. OpenSSL 명령어가없는경우에는 OpenSSL 웹 사이트 (https:www.openssl.org) 에서설치한다. 아래의내용은예제이므로실제사이트에서 사용하는인증서는발급인증기관의문서를참고해야한다. 1. 다음명령을실행한다. [jetty ~]$ openssl genrsa -des3 -out jetty.key Generating RSA private key, 1024 bit long modulus...++++++...++++++ e is 65537 (0x10001) Enter pass phrase for jetty.key: jettypass (4 자이상의원하는암호로설정 ) Verifying - Enter pass phrase for jetty.key: 위와동일한패스워드를입력한다.
- 22-5. 기능소개 5.2 SSL 설정 (2/6) 2. 이제인증서파일을생성할것이다. 파일의이름을 jetty.crt 로지정한다. [jetty ~]$ openssl req -new -x509 -key jetty.key -out jetty.crt Enter pass phrase for jetty.key: You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:KR ( 국가코드 2 자리 ) State or Province Name (full name) []: ( 국가또는지방이름 ) Locality Name (eg, city) [Default City]: ( 도시이름 ) Organization Name (eg, company) [Default Company Ltd]: ( 조직이름 ) Organizational Unit Name (eg, section) []: ( 조직단위이름 ) Common Name (eg, your name or your server's hostname) []:JETTY ( Domain 이름 ) Email Address []: ( 이메일주소 )
- 23-5. 기능소개 5.2 SSL 설정 (3/6) 3. crt 파일을 PKCS12 형식으로변환해야한다. 이작업은다음단계를통해수행할수있다. [jetty ~]$ openssl pkcs12 -inkey jetty.key -in jetty.crt -export -out jetty.pkcs12 Enter pass phrase for jetty.key: jettypass Enter Export Password: jettypass(jettypass 을다시사용했지만자유롭게변경할수있다.) Verifying - Enter Export Password: jettypass 4. Jetty keysotre 에서 PKCS12 파일가져오는단계는다음과같다. Jetty.pkcs12 파일을 JETTY_HOME/etc 디렉토리에복사 기존키저장소파일을삭제 Keytool import 명령을실행 [jetty ~]$ cp jetty.pkcs12 $JETTY_HOME/etc [jetty ~]$ cd $JETTY_HOME/etc [jetty ~/jetty-distribution-9.4.6.v20170531/etc]$ keytool -importkeystore -srckeystore jetty.pkcs12 - srcstoretype PKCS12 -destkeystore keystore Enter destination keystore password: (keystore 이암호를입력 jettypass) Re-enter new password: Enter source keystore password: jettypass ( 이전에 pkcs12 파일에대해정의한암호 ) Entry for alias 1 successfully imported. Import command completed: 1 entries successfully imported, 0 entries failed or cancelled
- 24-5. 기능소개 5.2 SSL 설정 (4/6) 5. 지금까지인증서를생성하여 Jetty 의키스토어로가져오는과정을살펴보았다. 이제 Jetty 서버에 HTTPS 커넥터와 SSL 을설정할것이다. Jetty 는모듈러아키텍처를사용하므로구성파일을통해다른 모듈을활성화할수있어야한다. 따라서 SSL 및 HTTPS 모듈을수동으로활성화해야한다. $JETTY_HOME/start.ini 파일을열러다음행을추가한다. --module=ssl --module=https 마지막단계로이전섹션에서설정한키저장소비밀번호를정의하는것이필요하다. 이전예제에서 keysotre 와인증서모두에대해 jettpass 암호를정의하였는데이암호를다음단계를통해암호화할수있다. [jetty ~]$ cd $JETTY_HOME/lib [jetty ~/jetty-distribution-9.4.6.v20170531/lib]$ java -cp jetty-util-9.4.6.v20170531.jar org.eclipse.jetty.util.security.password jettypass (lib 버전은 Jetty 버전에따라다름 ) 2017-07-24 15:38:39.770:INFO::main: Logging initialized @138ms to org.eclipse.jetty.util.log.stderrlog jettypass OBF:1wty1vu91v9u1y8320zj1y7v1v8s1vv11wug MD5:157c95e4fb782c3d1d14355a7295ab00
- 25-5. 기능소개 5.2 SSL 설정 (5/6) 생성된암호를 OBF 로시작하는줄을복사한다. ( 이예제에서는 OBF:1wty1vu91v9u1y8320zj1y7v1v8s1vv11wug ) 이제 SSL 구성에서이비밀번호를설정한다. [jetty ~/jetty-distribution-9.4.6.v20170531/lib]$ cd $JETTY_HOME/etc [jetty ~/jetty-distribution-9.4.6.v20170531/modules]$ vi jetty-ssl-context.xml 기존예제내용중 KeyStorePassword 와 KeyManagerPassword 의패스워드를변경한다. <Set name="keystorepassword"><property name="jetty.sslcontext.keystorepassword" deprecated="jetty.keystore.password" default="obf:1wty1vu91v9u1y8320zj1y7v1v8s1vv11wug"/></set> <Set name="keymanagerpassword"><property name="jetty.sslcontext.keymanagerpassword" deprecated="jetty.keymanager.password" default="obf:1wty1vu91v9u1y8320zj1y7v1v8s1vv11wug"/></set>
- 26-5. 기능소개 5.2 SSL 설정 (6/6) 이제 Jetty 서버를기동한다. 출력로그는다음과유사하다. [jetty ~/jetty-distribution-9.4.6.v20170531]$ java -jar start.jar 2017-07-24 16:21:48.698:INFO::main: Logging initialized @475ms to org.eclipse.jetty.util.log.stderrlog 2017-07-24 16:21:48.864: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 2017-07-24 16:21:48.926:INFO:oejs.Server:main: jetty-9.4.6.v20170531 2017-07-24 16:21:48.952:INFO:oejdp.ScanningAppProvider:main: Deployment monitor [file:///home/jetty/jetty-distribution-9.4.6.v20170531/webapps/] at interval 1 2017-07-24 16:21:48.969:INFO:oejs.AbstractConnector:main: Started ServerConnector@6500df86{HTTP/1.1,[http/1.1]}{0.0.0.0:8081} 2017-07-24 16:21:48.991:INFO:oejus.SslContextFactory:main: x509=x509@2f686d1f(1,h=[],w=[]) for SslContextFactory@3fee9989(file:///home/jetty/jetty-distribution- 9.4.6.v20170531/etc/keystore,file:///home/jetty/jetty-distribution-9.4.6.v20170531/etc/keystore) 2017-07-24 16:21:49.048:INFO:oejs.AbstractConnector:main: Started ServerConnector@71318ec4{SSL,[ssl, http/1.1]}{0.0.0.0:8443} 2017-07-24 16:21:49.048:INFO:oejs.Server:main: Started @825ms
- 27-5. 기능소개 5.3 HTTPS 포트변경 (1/2) jetty.http.port property 설정을통해포트를변경할수있다. [jetty ~/jetty-distribution-9.4.6.v20170531]$ java -jar start.jar jetty.ssl.port=8444 2017-07-24 16:28:18.373:INFO::main: Logging initialized @474ms to org.eclipse.jetty.util.log.stderrlog 2017-07-24 16:28:18.541: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 2017-07-24 16:28:18.607:INFO:oejs.Server:main: jetty-9.4.6.v20170531 2017-07-24 16:28:18.626:INFO:oejdp.ScanningAppProvider:main: Deployment monitor [file:///home/jetty/jetty-distribution-9.4.6.v20170531/webapps/] at interval 1 2017-07-24 16:28:18.643:INFO:oejs.AbstractConnector:main: Started ServerConnector@6500df86{HTTP/1.1,[http/1.1]}{0.0.0.0:8081} 2017-07-24 16:28:18.664:INFO:oejus.SslContextFactory:main: x509=x509@2f686d1f(1,h=[],w=[]) for SslContextFactory@3fee9989(file:///home/jetty/jetty-distribution- 9.4.6.v20170531/etc/keystore,file:///home/jetty/jetty-distribution-9.4.6.v20170531/etc/keystore) 2017-07-24 16:28:18.722:INFO:oejs.AbstractConnector:main: Started ServerConnector@71318ec4{SSL,[ssl, http/1.1]}{0.0.0.0:8444} 2017-07-24 16:28:18.723:INFO:oejs.Server:main: Started @825ms
- 28-5. 기능소개 5.3 HTTPS 포트변경 (2/2) 영구적으로포트를변경해야하는경우에는 start.ini 파일에포트를추가한다. ## Number of selectors (-1 picks default based on number of cores) # jetty.http.selectors=-1 ## ServerSocketChannel backlog (0 picks platform default) # jetty.http.acceptorqueuesize=0 ## Thread priority delta to give to acceptor threads # jetty.http.acceptorprioritydelta=0 ## HTTP Compliance: RFC7230, RFC2616, LEGACY # jetty.http.compliance=rfc7230 jetty.ssl.port=8444
- 29-5. 기능소개 5.4 웹애플리케이션디플로이 (1/3) 1. 웹애플리케이션의디렉토리구조웹애플리케이션은서블릿, 필터, JSP 등의동적인콘텐츠와 HTML, Image 등의정적콘텐츠, 애플리케이션지원라이브러리등이있다. 웹애플리케이션은단일웹아카이브 (WAR 파일 ) 또는디렉토리트리로묶을수있다. 디렉토리명 /WEB-INF/ /WEB-INF/web.xml /WEB-INF/classes/ 설명 웹애플리케이션과관련된모든것을저장하는데사용되는디렉토리. 일반적으로내부적으로액세스하는컨텐츠만들어있다. 웹애플리케이션의다양한동작을정의하는필수배포설명자 Java Class 파일들의위치 /WEB-INF/lib JAR 파일 ( 라이브러리 )
- 30-5. 기능소개 5.4 웹애플리케이션디플로이 (2/3) 2. 자동배포웹애플리케이션을배포하기위한가장기본적인방법은 WAR파일이나 Exploded WAR 디렉토리를 $JETTY_HOME/webapps 폴더에배치하는것이다. 이자동배포는 WAR의파일이름또는디렉토리이름으로 Context 경로가지정된다. 파일또는디렉토리 /webapps/footrope.war /webapps/lazaret-2.1.3-snapshot.war /webapps/belaying-pins/web-inf/web.xml /webapps/root.war ( 예약명 ) /webapps/root/web-inf/web.xml ( 예약명 ) 지정된 Context 경로 http://host/footrope/ http://host/lazaret-2.1.3-snapshot/ http://host/belaying-pins/ http://host/ http://host/
- 31-5. 기능소개 5.4 웹애플리케이션디플로이 (3/3) 3. XML 을통한웹애플리케이션배포 파일이름을기반으로하지않는 Context 경로를사용하려고하는경우에는자동배포방식 이아닌 XML 을통한웹애플리케이션배포가가능하다. $JETTY_HOME/webapps 디렉토리에서 Context 배포설명자파일을다음과같이구성하여 저장한다. <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd"> <Configure class="org.eclipse.jetty.webapp.webappcontext"> <Set name="contextpath">/wiki</set> <Set name="war">/opt/myapp/myapp.war</set> </Configure>
- 32-5. 기능소개 5.5 Virtual Hosts 설정 가상호스트 가상호스트는 IP 주소한개에여러이름기반웹사이트를운영하기위해필요하다. Jetty 는다음과같은가상호스트이름스타일을지원한다. 가상호스트구성은이전장에서 설정했던 Context XML 파일에아래와같이 virtualhosts 를세팅한다. <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd"> <Configure class="org.eclipse.jetty.webapp.webappcontext"> <Set name="contextpath">/blah</set> <Set name="war"><property name="jetty.webapps"/>blah.war</set> <Set name="virtualhosts"> <Array type="java.lang.string"> <Item>10.0.0.23</Item> <Item>www.blah.com</Item> <Item>www.blah.net</Item> <Item>www.blah.org</Item> </Array> </Set> </Configure>
- 33-5. 기능소개 5.6 로깅 (1/3) 1. Jetty 로깅 Jetty 는자체 org.eclipse.jetty.util.log.looger 계층을통해로깅을제공하며기존 Java 로깅 프레임워크를기본적으로사용하지않는다. Jetty는 classpath 에설정되어있는 jetty-logging.properties 파일을로드하여 property 중 org.eclipse.jetty.util.log.class logger 구현체를로딩한다. 만약지정된 logger가없으면기본적으로 org.eclipse.jetty.util.log.stderrlog class가로딩된다. 즉, console 화면에로그가출력된다. Org.eclipse.jetty.util.log.class property에정의되는구현 class들은아래와같다. Default Logging with Jetty s StdErrLog Using Log4j or Log4j2 via SLF4J Using Logback via SLF4J Using Java Util Logging via SLF4J Using Java Commons Logging via SLF4J
- 34-5. 기능소개 5.6 로깅 (2/3) 2. Request Log 설정 사용자요청당하나의로그항목이수신되며일반적으로표준 NCSA 형식으로제공되므로 Webalizer 와같은웹로그분석도구를사용하여쉽게분석할수있다. 표준요청로그항목에는클라이언트 IP 주소, 날짜, Method, URL, 결과, 전송크기, 참조자, 사용자에이전트, 전송시간이포함된다. 123.4.5.6 - - [20/Jul/2016:10:16:17 +0000] "GET /jetty/tut/xmlconfiguration.html HTTP/1.1" 200 76793 "http://localhost:8080/jetty/tut/logging.html" "Mozilla/5.0 (X11; U; Linux i686; en-us; rv:1.6) Gecko/20040614 Firefox/0.8" 342
- 35-5. 기능소개 5.6 로깅 (3/3) - 웹애플리케이션에대한 Request Log 구성방법 특정웹애플리케이션에대해별도의요청로그를구성하려면 Context xml 파일에다음을 추가한다. <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd"> <Configure class="org.eclipse.jetty.webapp.webappcontext"> <Call name="inserthandler"> <Arg> <New id="requestlog" class="org.eclipse.jetty.server.handler.requestloghandler"> <Set name="requestlog"> <New id="requestlogimpl" class="org.eclipse.jetty.server.ncsarequestlog"> <Set name="filename"><property name="jetty.logs" default="./logs"/>/test-yyyy_mm_dd.request.log</set> <Set name="filenamedateformat">yyyy_mm_dd</set> <Set name="append">true</set> </New> </Set> </New> </Arg> </Call> </Configure>
- 36-6. 활용예제 세부목차 본예제는간단한웹애플리케이션을 maven project 로만들어 Jetty 서버를기동하여테스트 하는것을목표로한다. 6.1 Jetty 서버기동예제
- 37-6. 활용예제 6.1 Jetty 서버기동예제 (1/8) 다음은 Maven 을사용하여 Helloworld 를출력하는웹애플리케이션을실행해보자. 먼저 maven pom.xml 파일내용은아래와같다. pom.xml <project xmlns="http://maven.apache.org/pom/4.0.0" xmlns:xsi="http://www.w3.org/2001/xmlschemainstance" xsi:schemalocation="http://maven.apache.org/pom/4.0.0 http://maven.apache.org/mavenv4_0_0.xsd"> <modelversion>4.0.0</modelversion> <packaging>war</packaging> <groupid>org.eclipse.jetty.demo</groupid> <artifactid>jetty-helloworld-webapp</artifactid> <version>1.0</version> <dependencies> <dependency> <groupid>javax.servlet</groupid> <artifactid>javax.servlet-api</artifactid> <version>3.1.0</version> <scope>provided</scope> </dependency> </dependencies> 뒷장계속
- 38-6. 활용예제 6.1 Jetty 서버기동예제 (2/8) pom.xml ( 계속 ) <build> <plugins> <plugin> <groupid>org.eclipse.jetty</groupid> <artifactid>jetty-maven-plugin</artifactid> <version>9.4.6.v20170531</version> </plugin> <plugin> <groupid>org.apache.maven.plugins</groupid> <artifactid>maven-war-plugin</artifactid> <version>2.6</version> <configuration> <failonmissingwebxml>false</failonmissingwebxml> </configuration> </plugin> </plugins> </build> </project>
- 39-6. 활용예제 6.1 Jetty 서버기동예제 (3/8) Servlet 소스예제 package com.example; import javax.servlet.annotation.webservlet; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import java.io.ioexception; @WebServlet(urlPatterns = {"/*"}, loadonstartup = 1) public class HelloWorldServlet extends HttpServlet { @Override public void doget(httpservletrequest request, HttpServletResponse response) throws IOException { response.getoutputstream().print("hello World"); } }
- 40-6. 활용예제 6.1 Jetty 서버기동예제 (4/8) 예제에서사용하는디렉토리구조는아래와같다.
- 41-6. 활용예제 6.1 Jetty 서버기동예제 (5/8) Maven 설치 [jetty ~]$ wget http://mirror.apache-kr.org/maven/maven-3/3.5.0/binaries/apache-maven-3.5.0-bin.tar.gz --2017-07-25 15:30:37-- http://mirror.apache-kr.org/maven/maven-3/3.5.0/binaries/apache-maven-3.5.0- bin.tar.gz Resolving mirror.apache-kr.org (mirror.apache-kr.org)... 1.201.139.179 Connecting to mirror.apache-kr.org (mirror.apache-kr.org) 1.201.139.179 :80... connected. HTTP request sent, awaiting response... 200 OK Length: 8534562 (8.1M) [application/x-gzip] Saving to: apache-maven-3.5.0-bin.tar.gz 100%[===========================================================================>] 8,534,562 5.53MB/s in 1.5s 2017-07-25 15:30:39 (5.53 MB/s) - apache-maven-3.5.0-bin.tar.gz saved [8534562/8534562] [jetty ~]$ tar xvfz apache-maven-3.5.0-bin.tar.gz apache-maven-3.5.0/readme.txt apache-maven-3.5.0/license apache-maven-3.5.0/notice apache-maven-3.5.0/lib/ apache-maven-3.5.0/lib/cdi-api.license
- 42-6. 활용예제 6.1 Jetty 서버기동예제 (6/8) Maven 설치 ( 계속 ) 1) bashrc 파일에 maven 설치경로를아래와같이설정한다. [jetty ~] vi ~/.bashrc export M2_HOME=/home/jetty/apache-maven-3.5.0 export PATH=$PATH:$M2_HOME/bin 2) 설정후 bashrc 를적용한다. [jetty ~]$ source.bashrc
- 43-6. 활용예제 6.1 Jetty 서버기동예제 (7/8) Maven 실행 [jetty ~/jetty-helloworld-webapp]$ mvn jetty:run -Djetty.http.port=9999 [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building jetty-helloworld-webapp 1.0 [INFO] ------------------------------------------------------------------------ [INFO] [INFO] >>> jetty-maven-plugin:9.4.5.v20170502:run (default-cli) > test-compile @ jetty-helloworldwebapp >>> [INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ jetty-helloworld-webapp --- [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] skip non existing resourcedirectory /home/jetty/jetty-helloworld-webapp/src/main/resources [INFO] Started o.e.j.m.p.jettywebappcontext@20de05e5{/,file:///home/jetty/jetty-helloworldwebapp/target/webapp-tmp/,available}{file:///home/jetty/jetty-helloworld-webapp/target/webapp-tmp/} [INFO] Started ServerConnector@3fd9e827{HTTP/1.1,[http/1.1]}{0.0.0.0:9999} [INFO] Started @37885ms [INFO] Started Jetty Server
- 44-6. 활용예제 6.1 Jetty 서버기동예제 (8/8) 브라우저를통해 maven 으로실행한 jetty 서버에접속한다.
- 45-7. FAQ Q 왜 Jetty 를사용해야합니까? & A Jetty는다른웹서버패키지와달리설치공간이아주작습니다. Jetty는개발자와관리자에게불필요한오버헤드나메모리사용을걱정하기않고배포할수있도록할수있습니다. Jetty는매우클라우드친화적입니다. Q 실행중인 Jetty 버전을어떻게확인할수있습니까? & A Jetty 설치디렉토리에서 java jar start.jar -version 으로확인할수있습니다.
- 46-7. FAQ Q Jetty 는 WebSocket를지원합니까? & A 네. Jetty는 RFC-6455 (https://tools.ietf.org/html/rfc6455) WebSocket Protocol을지원합니다. 또한, JSR-356 (https://www.jcp.org/en/jsr/detail?id=356) Java WebSocket API를지원하고있습니다. Q Jetty 는 HTTP/2 를지원합니까? & A 네. Jetty는 RFC-7450 (https://tools.ietf.org/html/rfc7540) 에서정의되어있는 HTTP/2 프로토콜에대한클라이언트및서버구현을모두지원합니다.
- 47-8. 용어정리 용어 JAVA EE SSL WebSocket HTTP/2 설명 자바엔터프라이즈에디션 (Java Platform, Enterprise Edition; Java EE) 은웹애플리케이션서버에서동작하는장애복구및분산멀티티어를제공하는자바소프트웨어의기능을추가한서버를위한플랫폼이다. TLS ( Transport Layer Security ) 및 SSL ( Secure Sockets Layer ) 은 SSL 이라고도하며컴퓨터네트워크에서통신보안을제공하는암호화프로토콜이다. 웹소켓 (WebSocket) 은하나의 TCP 접속에전이중 (full-duplex) 통신채널을제공하는컴퓨터통신프로토콜이다. 웹소켓프로토콜은 2011년 IETF에의해 RFC 6445 로표준화되었으며웹 IDL의웹소켓 API는 W3C에의해표준화되고있다. HTTP/2(Hypertext Transfer Protocol Version 2) 는월드와이드웹 (WWW) 에서쓰이는 HTTP 프로토콜의두번째버전이다. SPDY에기반하고있으며, 국제인터넷표준화기구 (IETF) 에서개발되고있다. 2015년 5월, RFC 7540로공개되었다.
Open Source Software Installation & Application Guide 이저작물은크리에이티브커먼즈 [ 저작자표시 비영리 동일조건변경허락 2. 0 대한민국라이선스 ] 에따라이용하실수있습니다.