Необычная проблема кеширования Apache->Tomcat

Прямо сейчас у меня есть установка Apache, сидящая перед Tomcat для обработки кэширования. Эта настройка была предоставлена ​​для управления внешней службой, и с момента перехода я заметил странное поведение. В частности, когда я запрашиваю SWF- файл с веб-сервера, я попадаю в кэш Apache (хорошо), но иногда я получаю усеченный файл. Как только я получу этот усеченный файл, кеш НЕ будет обновляться до тех пор, пока я не удаляю кеш вручную и не позволю swf снова выйти из tomcat.

Внешняя служба утверждает, что с конфигурацией все в порядке, но я не вижу, чтобы это могло происходить, кроме как с неправильной конфигурацией. Теперь есть два сервера Apache и два сервера Tomcat под балансировщиком нагрузки, и иногда один кэш Apache будет поврежден, а другой - нет (что приведет к 50% всех запросов, получающих некорректные усеченные данные).

Где я должен начать искать для устранения этой проблемы? Что может быть причиной этого странного поведения?

Редактировать: осматривая логи, кот бросает это:

java.io.IOException: Bad file number
        at java.io.FileInputStream.readBytes(Native Method)
        at java.io.FileInputStream.read(FileInputStream.java:199)
        at java.io.BufferedInputStream.read1(BufferedInputStream.java:256)
        at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
        at java.io.FilterInputStream.read(FilterInputStream.java:90)
        at org.apache.catalina.servlets.DefaultServlet.copyRange(DefaultServlet.java:1968)
        at org.apache.catalina.servlets.DefaultServlet.copy(DefaultServlet.java:1714)
        at org.apache.catalina.servlets.DefaultServlet.serveResource(DefaultServlet.java:809)
        at org.apache.catalina.servlets.DefaultServlet.doGet(DefaultServlet.java:325)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:568)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.ha.session.JvmRouteBinderValve.invoke(JvmRouteBinderValve.java:209)
        at org.apache.catalina.ha.tcp.ReplicationValve.invoke(ReplicationValve.java:347)
        at org.terracotta.modules.tomcat.tomcat_5_5.SessionValve55.invoke(SessionValve55.java:57)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
        at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
        at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:283)
        at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:767)
        at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:697)
        at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:889)
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
        at java.lang.Thread.run(Thread.java:619)

followed by 

access_log.2009-12-14.txt:1.2.3.4 - - [14/Dec/2009:00:27:32 -0500] "GET /myApp/mySwf.swf HTTP/1.1" 304 -
access_log.2009-12-14.txt:1.2.3.4 - - [14/Dec/2009:01:27:33 -0500] "GET /myApp/mySwf.swf HTTP/1.1" 304 -
access_log.2009-12-14.txt:1.2.3.4 - - [14/Dec/2009:01:39:53 -0500] "GET /myApp/mySwf.swf HTTP/1.1" 304 -
access_log.2009-12-14.txt:1.2.3.4 - - [14/Dec/2009:02:27:38 -0500] "GET /myApp/mySwf.swf HTTP/1.1" 304 -

Так что apache кеширует неверный размер файла. Что может быть причиной этого и, возможно, отдельным, как я могу гарантировать, что это исключение не будет записано в кэш?

2 ответа

Решение

wget, curl или файл сохранить как этот файл?

Работают ли другие большие файлы?

Если есть контракт на поддержку, я бы посоветовал поставщику отладить это совместно.

Неспособность Tomcat обслуживать большие файлы была исправлена ​​в trunk, 5.5.x, и исправление, исправляющее ошибку, зафиксировано в 6.0.27.

Другие вопросы по тегам