2015-02-04 1 views
4

Jetty9를 사용하고 텍스트 파일을 압축하면 성능이 향상되는지 테스트하고 싶습니다. http://marianoguerra.org/posts/201205enable-gzip-compression-in-jetty.htmlJetty9에서 gzip 압축 (정적 및 동적)을 활성화하는 방법은 무엇입니까?

내 코드는 다음과 같습니다 : 처음에는이 설명되어처럼 나는 오프라인 압축 파일 봉사에 관심

static private void set_jetty_handlers(Server server) 
    { 
    // gzip: I have added it to to serve off-line compressed JavaScript, CSS etc. 
    // as described at: http://marianoguerra.org/posts/201205enable-gzip-compression-in-jetty.html 
    ServletHolder servletHolder = new ServletHolder(new DefaultServlet()); 
    servletHolder.setInitParameter("gzip", "true"); 
    ServletContextHandler s_context_handler = new ServletContextHandler(); 
    s_context_handler.addServlet(servletHolder,"/*"); 

    ResourceHandler resource_handler = new ResourceHandler(); 
    resource_handler.setDirectoriesListed(false); 
    resource_handler.setWelcomeFiles(new String[] {"index.html"}); 
    resource_handler.setResourceBase(""); 
    resource_handler.setCacheControl(MAX_AGE); 

    // gzip: I have added it to to serve offline compressed JavaScript, CSS etc. 
    resource_handler.setHandler(s_context_handler); 

    // I want to work with aliases (links and symbolic links) 
    ContextHandler context_handler = new ContextHandler(); 
    context_handler.addAliasCheck(new ContextHandler.ApproveAliases()); 

    HandlerList handlers = new HandlerList(); 
    handlers.setHandlers(new Handler[] { new my_jetty_handler(), resource_handler, new DefaultHandler() }); 
    context_handler.setHandler(handlers); 

    server.setHandler(context_handler); 
    configureThreadPool(server); 
    } // set_jetty_handlers 

하지만 다음 test.html.gztest.html를 압축 할 때 나는 HTTP ERROR: 404을 얻었다. gzip 압축을 가능하게하기 위해 추가 한 라인에는 주석에 gzip:이라는 태그가 지정됩니다.

이전 버전의 Jetty는 ResourceHandler.setMinGzipLength()입니다. 현재의 Jetty 버전에서는 사용할 수 없지만 문서화를 통해 원하는대로 작동합니다.

gzip 압축을 사용 설정하는 방법은 무엇입니까? 처음에는 정적 파일 압축을 테스트하고 싶지만 그 테스트 후에는 GzipFilter을 동적 컨텐츠를 제공하는 my_jetty_handler()에 적용하고 Java 코드에서 수행하는 방법이 불분명합니다.

답변

5

나는에 의해 나의 핸들러 GZIP 압축을 추가 할 수 있습니다 (이 최종 부두 9.3.0 릴리스로 변경됩니다)).

+1

그러면'gzipHandlerRES'를'Server.setHandler (Handler)'배열에 추가해야합니다. –

1

당신은 여러 가지 행동 방식과 문맥의 작동 방식에 대한 이해가 부족합니다.

첫째, 예 :

중요 무엇
package jetty; 

import java.util.EnumSet; 

import javax.servlet.DispatcherType; 

import org.eclipse.jetty.server.Server; 
import org.eclipse.jetty.server.ServerConnector; 
import org.eclipse.jetty.server.handler.ContextHandler; 
import org.eclipse.jetty.servlet.DefaultServlet; 
import org.eclipse.jetty.servlet.FilterHolder; 
import org.eclipse.jetty.servlet.ServletContextHandler; 
import org.eclipse.jetty.servlet.ServletHolder; 
import org.eclipse.jetty.servlets.GzipFilter; 
import org.eclipse.jetty.util.thread.QueuedThreadPool; 
import org.eclipse.jetty.util.thread.ThreadPool; 

public class GzipExample 
{ 
    public static void main(String[] args) 
    { 
     ThreadPool threadPool = new QueuedThreadPool(); 
     Server server = new Server(threadPool); 
     ServerConnector connector = new ServerConnector(server); 
     connector.setPort(8080); 
     server.addConnector(connector); 

     ServletContextHandler context = new ServletContextHandler(); 
     context.setContextPath("/"); 
     // Welcome files are part of the context 
     context.setWelcomeFiles(new String[] { "index.html" }); 
     // Add alias check logic to context 
     context.addAliasCheck(new ContextHandler.ApproveAliases()); 
     server.setHandler(context); 

     // Add dynamic Gzip compression, as a servlet filter 
     FilterHolder gzipHolder = context.addFilter(GzipFilter.class,"/*",EnumSet.of(DispatcherType.REQUEST)); 
     gzipHolder.setInitParameter("methods","GET,POST"); 
     // response bytes required before gzip kicks in 
     gzipHolder.setInitParameter("minGzipSize", "256"); 
     // mime-types to compress (seen as response type) 
     gzipHolder.setInitParameter("mimeTypes", "text/plain,text/css,text/html,text/javascript"); 

     // Add your own servlets here 
     context.addServlet(HelloServlet.class,"/hello/*"); 

     // Lastly, the default servlet for resource base content (serves static files) 
     // It is important that this is last. 
     ServletHolder defHolder = new ServletHolder("default", DefaultServlet.class); 
     // Cannot be null or empty, must be declared, must be a directory, can be a URL to some jar content 
     defHolder.setInitParameter("resourceBase","./resource-base/"); 
     defHolder.setInitParameter("dirAllowed","true"); 
     defHolder.setInitParameter("gzip", "true"); 
     defHolder.setInitParameter("otherGzipFileExtensions", ".svgz"); 
     defHolder.setInitParameter("cacheControl","private, max-age=0, no-cache"); 
     context.addServlet(defHolder,"/"); 
    } 
} 

:

  • ThreadPool이이 설정 및 서버 인스턴스에 제공되는이 사후 구성되어 있지 않습니다.
  • ServletContextHandler은 사용자의 컨텍스트이며 시작 파일 목록, 컨텍스트 경로 이름, 별칭 검사, 모든 필터 및 서블릿을 포함합니다.
  • GzipFilter은 동적 gzip 압축을 설정하기 위해 현재 Jetty 9.3.x에서 http/2 + async i/o 현실성에보다 탄력적 인 gzip 처리 메커니즘으로 변경되고 있습니다.
  • GzipFilter
  • DefaultServlet
  • 임의로 예압 정적 파일을 제공하기위한 지원을 포함하여, 정적 파일을 제공하는 구성 요소이다 ... 압축 마임 타입 등 최소 바이트 임계 포함한 GZIP 동작에 대한 구성을 갖는다. (예 : 클라이언트는 기본 서블릿이 자원베이스에 /main.css.gz 발견이 GZIP 압축을 수신 할 수 나타내는 /main.css 요청하고 /main.css를 요청하는 클라이언트에 그대로 다시 제공)이 모두에게 필요한
  • resourceBase입니다 일하고 정의하십시오.
  • ResourceHandler는이 단지의 일부로 구현이야,
  • 당신은 gzip 압축과 부두 핸들러를 사용할 수 없습니다 ... 슈퍼 기본이며, 등 GZIP, 캐싱, 이력서, 부분/범위 요청, 같은 고급 개념을 의미하지 않는다 서블릿 계층. 그것은 test.html.gz를 제공한다 test.html 오프라인 압축 파일 (요청 작동하지 않을 수

    GzipHandler gzipHandlerRES = new GzipHandler(); 
    gzipHandlerRES.setMimeTypes("text/html,text/plain,text/xml,text/css,application/javascript,text/javascript"); 
    gzipHandlerRES.setHandler(resource_handler); 
    

    :

+1

감사합니다. 예, 서블릿을 사용하지 않기 때문에 동작이 혼합되었습니다. 일부 요청에는 자체 처리기를 사용하고 정적 파일에는 ResourceHandler를 사용합니다. gzip 압축을 위해 특별히 ServletContext를 추가했습니다. 솔루션의 서블릿 컨텍스트에 내 처리기를 추가 할 수있는 방법을 모르겠습니다. 나는 여러 가지를 시도하고 모두 실패했습니다. –