Web Application Server

Apache - JBoss 구조에서 2GB 이상 파일 요청 시 Response Header 에 Content-Length 표시되지 않는 이슈

강철지그·2014년 9월 12일·조회 7,543

1. 개요

Apache - JBoss 구조에서 2GB 이상 파일 요청 시 응답 헤더에 Content-Length가 표시되지 않는 이슈가 있다. 정확히 어느 구간의 문제인지 확인하기 위하여 여러 포인트에 직접 요청을 날려보았다.


2. 테스트 

2-1. Apache (2.2.27)

Accept-Ranges:bytes
Connection:Keep-Alive
Content-Length:2482044928
Content-Type:application/x-gzip
Date:Fri, 12 Sep 2014 01:07:48 GMT
ETag:"140032-93f10000-500e216017f6d"
Keep-Alive:timeout=3, max=100
Last-Modified:Mon, 18 Aug 2014 07:11:55 GMT
Server:Apache

2-2. JBoss EAP (6.2)

Accept-Ranges:bytes
Content-Length:2482044928
Content-Type:application/x-gzip
Date:Fri, 12 Sep 2014 01:04:24 GMT
ETag:W/"2482044928-1410483441000"
Last-Modified:Fri, 12 Sep 2014 00:57:21 GMT
Server:Apache-Coyote/1.1

2-3. Tomcat (7.0.55)

Accept-Ranges:bytes
Content-Length:2482044928
Content-Type:application/x-gzip
Date:Fri, 12 Sep 2014 01:15:06 GMT
ETag:W/"2482044928-1410483441000"
Last-Modified:Fri, 12 Sep 2014 00:57:21 GMT
Server:Apache-Coyote/1.1

2-4. Apache (2.2.27) - JBoss EAP (6.2)

Accept-Ranges:bytes
Connection:Keep-Alive
Content-Type:application/x-gzip
Date:Fri, 12 Sep 2014 01:00:25 GMT
ETag:W/"2482044928-1410483441000"
Keep-Alive:timeout=3, max=100
Last-Modified:Fri, 12 Sep 2014 00:57:21 GMT
Server:Apache
Transfer-Encoding:chunked

▶ Content-Length 정보 포함되지 않았다. 요청 시 파일 처리(다운로드)는 잘된다.

2-5. Apache (2.2.27) - Tomcat (7.0.55)

Accept-Ranges:bytes
Connection:Keep-Alive
Content-Length:2482044928
Content-Type:application/x-gzip
Date:Fri, 12 Sep 2014 01:13:21 GMT
ETag:W/"2482044928-1410483441000"
Keep-Alive:timeout=3, max=100
Last-Modified:Fri, 12 Sep 2014 00:57:21 GMT
Server:Apache


3. 결과

위의 테스트 결과에서 보면, 2G 이상 파일을 Apache - JBoss 연동하여 처리할 때만 Content-Length가 포함되어 있지 않다. (즉, 해당 파일을 JBoss 에서 처리할 때)

물론 다운로드는 잘 되지만, Content-Length 가 없어서 브라우저에서 다운로드 할 때 총 파일 용량이 표시되지 않고 현재 다운로드 받는 크기만 표시된다. 즉, 15MB/2.3GB 처럼 나오지 않고 15MB 만 나온다.

추가적으로 Apache - JBoss 연동에서 2GB 이하 파일로 테스트 해봤다.

Accept-Ranges:bytes
Connection:Keep-Alive
Content-Length:938882272
Content-Type:application/x-gzip
Date:Fri, 12 Sep 2014 01:32:36 GMT
ETag:W/"938882272-1410485435000"
Keep-Alive:timeout=3, max=100
Last-Modified:Fri, 12 Sep 2014 01:30:35 GMT
Server:Apache

이 경우는 정상적으로 Content-Length가 표시되었다. 결론적으로 Apache - JBoss 연동 시에만, 2GB 이상일 때 Content-Length가 없다.

Apache - Tomcat일 때는 잘 되기 때문에 mod_jk 문제라고 보기는 힘들다.


4. Content Length와 Chunked 방식의 차이

4-1. Content Length 방식

  • Content-Length에 본문의 길이를 기록하므로 수신자가 본문의 길이를 알 수 있게 하는 방식
  • Static Contents처럼 헤더 생성 시점에 본문의 길이를 알 수 있을 때 사용한다.

4-2. Chunked 방식

  • HTTP 헤더 중 Transfer-Encoding의 값이 Chunked
  • 헤더 생성 시점에 본문의 길이를 알 수 없을 때
  • Dynamic Contents의 경우 애플리케이션 수행 시작부터 HTTP Response 시작
  • 이 때 송신 버퍼 8K가 넘어가면 응답을 보내기 시작하는데 아직 애플리케이션이 끝나지 않았다면 response는 추가로 생성됨

댓글 2

로그인 후 댓글을 남길 수 있습니다.

  • stdio.hstdio.h· 2014년 9월 14일
    JEUS 같은 경우는 WEBMain.xml 의 webtob-listener 중간에 아래와 같은 옵션을 추가하면 chunked encoding 을 하지 않고 무조건 Content-Length 를 실어 보냅니다만, Jboss 의 경우는 잘 모르겠네요.. 0 (객체를 모두 heap 에 올리게 되어 메모리에 부담은 줍니다) 그런데 꼭 Content-Length 가 실려야 하는 요구사항이 있는건지요?
  • appsrootappsroot· 2014년 9월 14일
    언급하신 버전인 JBoss 6.2 EAP 기준으로 chunked encoding 을 disable 시키는 방법입니다. 1) cxf [code]import org.apache.cxf.endpoint.Client; import org.apache.cxf.frontend.ClientProxy; import org.apache.cxf.transport.http.HTTPConduit; import org.apache.cxf.transports.http.configuration.HTTPClientPolicy; //Get the JAX-WS proxy object ExampleWSPortType port = new ExampleWS().getExampleWSPortTypePort(); Client client = ClientProxy.getClient(port); HTTPConduit http = (HTTPConduit) client.getConduit(); HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy(); httpClientPolicy.setAllowChunking(false); http.setClient(httpClientPolicy);[/code] 2) MANIFEST.MF 혹은 jboss-deployment-strcuture.xml 에 dependency 추가 [code] [/code]