异常的Apache-> Tomcat缓存问题


2

现在,我在Tomcat前面有一个Apache设置来处理缓存。此设置已交给外部服务进行管理,并且自过渡以来,我注意到了奇怪的行为。具体来说,当我从Web服务器请求swf文件时,我命中了Apache缓存(很好),但是偶尔我会收到截断的文件。收到此截断的文件后,缓存将不会刷新,直到手动删除缓存并再次从tomcat下拉swf为止。

外部服务声称配置很好,但是除了配置不正确之外,我看不到任何其他可能的方式。现在,在负载平衡器下有两个Apache服务器和两个Tomcat服务器,偶尔一个apache缓存将中断,而另一个则不会(导致所有请求的50%变为错误的,被截断的数据)。

我应该从哪里开始调试此问题?是什么可能导致这种奇怪的行为?

编辑:检查日志,tomcat抛出此:

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正在缓存错误的文件大小。是什么可能导致这种情况,并且可能是分开的,如何确保不将此异常写入缓存?


这台机器上的内存使用情况如何?
马特·西蒙斯

非常低。服务器具有32GB的内存。
Stefan Kendall

Answers:


0

wget,curl或文件另存为该文件?

其他大文件还能用吗?

如果有支持合同,我会考虑要求供应商进行协作调试。



在6.0.20中仍然不能解决该问题吗?
Stefan Kendall

wget和Save as都将下拉缓存的apache文件并失败。服务器上没有多少其他文件像该文件一样经常被命中(实际上,该文件可能最常被命中)。
Stefan Kendall '01

如果仍在发生,我会要求服务提供商在启用了strace的情况下与apache交互运行一个沙箱。另外,我不会提及我们正在启动的相关服务,该服务是不合常规的。

0

Tomcat无法为大型文件提供服务已在5.5.x版主干中修复,该bug的修复程序已提交给6.0.27。


这真是个好消息。我听到6.0.32似乎是最稳定的。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.