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는 추가로 생성됨