ColdFusion 10实例/Tomcat以可预测的时间间隔死亡(白色死亡屏幕)

ColdFusion 10实例/Tomcat以可预测的时间间隔死亡(白色死亡屏幕),tomcat,coldfusion,coldfusion-10,Tomcat,Coldfusion,Coldfusion 10,在过去的几天里,我们的团队一直在努力解决一个正在进行的问题,其中一个ColdFusion实例每隔很长一段时间就会出现死亡的白屏 每三个小时,该网站就会开始返回任何url的空白白页。然后我们会重新启动实例,一切都会很好。。。又过了三个小时,几乎是一分钟。当然,这发生在一个星期五,所以整个周末,每当实例死机时,人们都轮流重新启动它 据我所知,在这之前,没有人对ColdFusion或我们的服务器环境做过任何更改。在此之前,该实例运行良好 从那以后,我们看到这个实例的isapi_redirect.log

在过去的几天里,我们的团队一直在努力解决一个正在进行的问题,其中一个ColdFusion实例每隔很长一段时间就会出现死亡的白屏

每三个小时,该网站就会开始返回任何url的空白白页。然后我们会重新启动实例,一切都会很好。。。又过了三个小时,几乎是一分钟。当然,这发生在一个星期五,所以整个周末,每当实例死机时,人们都轮流重新启动它

据我所知,在这之前,没有人对ColdFusion或我们的服务器环境做过任何更改。在此之前,该实例运行良好

从那以后,我们看到这个实例的isapi_redirect.log文件中充满了Tomcat/连接错误

我们遵循了上的优秀说明,并按照建议调整了连接器设置。虽然这可能很好地改善了总体性能,并将两次崩溃之间的时间间隔从3小时改为3.5小时,但它并没有解决这一问题

在此之前,我们甚至尝试将站点从一个虚拟服务器移动到另一个虚拟服务器,但没有成功

我们尝试重新启动IIS,甚至在一天晚上重新启动整个服务器,看看这是否有帮助,但仍然没有任何效果

下面是我从我们的日志和配置中看到的尽可能多的信息。任何帮助都将非常感谢,请让我知道我可以提供哪些其他有用的细节


我们正在运行IIS v7.5.7600.16385

这是唯一绑定到此实例的网站/IIS记录,它是专门绑定到此实例的,而不是“所有网站”

当问题发生时,我不认为任何请求都会导致实例。。。IIS日志显示连接仍在进行,但实例的http.log文件只是停止

我不确定tomcat相关错误是问题还是症状

当问题发生时,服务器运行正常,我们有几个其他CF实例与此并行运行,没有问题

有问题的实例的CF管理员会加载该实例,并且在出现问题时会完全响应(对于我来说,对于实例的其他过去问题,情况并非如此)

同样,据我们所知,在这个问题开始之前,没有人直接对我们的代码、CF实例配置或服务器配置进行任何更改

[Wed Jun 25 23:40:34.503 2014] [10012:912] [info] ajp_send_request::jk_ajp_common.c (1658): (Instance_Codebase) all endpoints are disconnected, detected by connect check (27), cping (0), send (0)

[Wed Jun 25 23:40:34.504 2014] [10012:1396] [info] ajp_connection_tcp_get_message::jk_ajp_common.c (1313): (Instance_Codebase) can't receive the response header message from tomcat, network problems or tomcat (127.0.0.1:8014) is down (errno=54)
[Wed Jun 25 23:40:34.820 2014] [10012:1396] [error] ajp_get_reply::jk_ajp_common.c (2190): (Instance_Codebase) Tomcat is down or refused connection. No response has been sent to the client (yet)
[Wed Jun 25 23:40:34.823 2014] [10012:1396] [info] ajp_service::jk_ajp_common.c (2692): (Instance_Codebase) sending request to tomcat failed (recoverable),  (attempt=1)

[Wed Jun 25 23:40:34.708 2014] [10012:7880] [error] ajp_get_reply::jk_ajp_common.c (2190): (Instance_Codebase) Tomcat is down or refused connection. No response has been sent to the client (yet)

[Wed Jun 25 23:40:40.477 2014] [10012:2296] [info] ajp_connect_to_endpoint::jk_ajp_common.c (1047): Failed opening socket to (127.0.0.1:8014) (errno=61)

[Wed Jun 25 23:40:40.364 2014] [10012:8256] [error] ajp_service::jk_ajp_common.c (2711): (Instance_Codebase) connecting to tomcat failed.

[Wed Jun 25 23:40:40.825 2014] [10012:7060] [error] HttpExtensionProc::jk_isapi_plugin.c (2309): service() failed with http error 503

[Wed Jun 25 23:40:40.877 2014] [10012:10364] [error] ajp_send_request::jk_ajp_common.c (1669): (Instance_Codebase) connecting to backend failed. Tomcat is probably not started or is listening on the wrong port (errno=61)
[Wed Jun 25 23:40:40.965 2014] [10012:10364] [info] ajp_service::jk_ajp_common.c (2692): (Instance_Codebase) sending request to tomcat failed (recoverable), because of error during request sending (attempt=1)

[Wed Jun 25 23:40:40.857 2014] [10012:1020] [error] HttpExtensionProc::jk_isapi_plugin.c (2309): service() failed with http error 503


工人财产:

worker.list=Instance_Codebase
worker.Instance_Codebase.type=ajp13
worker.Instance_Codebase.host=localhost
worker.Instance_Codebase.port=8014
worker.Instance_Codebase.max_reuse_connections=250
worker.Instance_Codebase.connection_pool_size=250
worker.Instance_Codebase.connection_pool_timeout=60

server.xml

<Server port="8009" shutdown="SHUTDOWN">
    <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on"></Listener>
    <Listener className="org.apache.catalina.core.JasperListener"></Listener>
    <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"></Listener>
    <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"></Listener>
    <GlobalNamingResources>
        <Resource description="User database that can be updated and saved" name="UserDatabase" pathname="conf/tomcat-users.xml" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" type="org.apache.catalina.UserDatabase" auth="Container"></Resource>
    </GlobalNamingResources>
    <Service name="Catalina">
        <Executor name="tomcatThreadPool" minSpareThreads="4" maxThreads="150" namePrefix="catalina-exec-"></Executor>
        <Connector port="8014" protocol="AJP/1.3" redirectPort="8447" tomcatAuthentication="false" maxThreads="250" connectionTimeout="60000"></Connector>
        <Engine jvmRoute="Instance_Codebase" name="Catalina" defaultHost="localhost">
            <Realm className="org.apache.catalina.realm.LockOutRealm">
                <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"></Realm>
            </Realm>
            <Host name="localhost" autoDeploy="false" unpackWARs="true" appBase="webapps">
                <!--<Valve pattern="%h %l %u %t &quot;%r&quot; %s %b" directory="logs" prefix="localhost_access_log." className="org.apache.catalina.valves.AccessLogValve" suffix=".txt" resolveHosts="false"></Valve>-->
            </Host>
        </Engine>
        <Connector port="8501" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443" executor="tomcatThreadPool"></Connector>
    </Service>
</Server>

您可以忽略日志中的大多数条目,因为它们是来自Tomcat的信息。我注意到的共同点是错误502(坏网关)和503(服务不可用)。日志仍然包含信息/错误,而不是调试信息。您是否可以将日志级别从“info”更改为“debug”并重新启动IIS


此外,站点的连接器也需要调整。你可以参考。这也适用于CF10。您可以启用度量记录(调试和记录>调试输出设置),然后调整连接器。使用当前线程计数作为连接池大小的输入,然后设置最大重用连接。

尝试在Application.cfc中注释onError()方法。然后,您的白色死亡屏幕将显示一条错误消息,这可能会帮助您调试正在发生的事情。

我相信这可能与Tomcat有关,而不是与ColdFusion有关。当Tomcat出现错误时,互联网上有很多帖子都是关于Tomcat的空响应。即使是Tomcat(2011)早期版本中的一个bug修复。ColdFusion定制了Tomcat,所以所有的更改都要由Adobe来实现,并以热修复的形式发布出来。我不确定他们开始定制Tomcat Adobe时使用的是哪个版本(可能是在2010年或2011年),也不确定他们改装补丁有多容易。Adobe论坛上的应用程序池和Tomcat也存在类似的问题,Tomcat在这些论坛上有补丁,但Adobe没有将其集成到他们的Tomcat版本中。

下面是tomcat上的错误修复示例:

我记得看到另一篇关于tomcat的帖子,它的默认错误页面被错误地设置为“”(errorPage=“”),而不是一个实际的错误页面,这将弹出一个空响应

这也解释了为什么不能在ColdFusion中捕获错误,而IIS只提供了一个200

因此,本例中的答案有点神秘,您可以自动让web服务器层重试空响应,希望它们能够正常工作,因为它们通常在页面刷新时表现良好,但这也有可能加剧任何灾难。然而,这仍然是一个很好的解决办法。您还可以尝试找出Adobe是否有更新Tomcat的解决方案


我的答案主要是猜测。

感谢大家的投入和帮助。到今天为止,我们已经免费运行WSOD超过4天了

我们仍然不确定是什么引发了这个问题,它可能只是网络流量的一个转折点,但我很有信心我们现在已经控制住了它

在很大程度上,我认为这是一个连接器调整的问题。 默认情况下,当使用Web服务配置工具(wsconfig.exe)创建连接器时,连接池设置为250个连接,但默认情况下,这也不会反映在server.xml配置中。我们更改了AJP/1.3连接器,以指定匹配的最大线程值,并添加了60秒的连接超时,否则它们将不确定

我们还调整了workers.properties文件,以指定要匹配的连接池大小和连接池超时

以前的默认设置似乎与isapi_redirect.log相匹配,在这里我们可以看到,每次我们得到大约200个tomcat w连接
[Wed Jun 25 23:40:34.503 2014] [10012:912] [info] ajp_send_request::jk_ajp_common.c (1658): (Instance_Codebase) all endpoints are disconnected, detected by connect check (27), cping (0), send (0)

[Wed Jun 25 23:40:34.504 2014] [10012:1396] [info] ajp_connection_tcp_get_message::jk_ajp_common.c (1313): (Instance_Codebase) can't receive the response header message from tomcat, network problems or tomcat (127.0.0.1:8014) is down (errno=54)
[Wed Jun 25 23:40:34.820 2014] [10012:1396] [error] ajp_get_reply::jk_ajp_common.c (2190): (Instance_Codebase) Tomcat is down or refused connection. No response has been sent to the client (yet)
[Wed Jun 25 23:40:34.823 2014] [10012:1396] [info] ajp_service::jk_ajp_common.c (2692): (Instance_Codebase) sending request to tomcat failed (recoverable),  (attempt=1)

[Wed Jun 25 23:40:34.708 2014] [10012:7880] [error] ajp_get_reply::jk_ajp_common.c (2190): (Instance_Codebase) Tomcat is down or refused connection. No response has been sent to the client (yet)

[Wed Jun 25 23:40:40.477 2014] [10012:2296] [info] ajp_connect_to_endpoint::jk_ajp_common.c (1047): Failed opening socket to (127.0.0.1:8014) (errno=61)

[Wed Jun 25 23:40:40.364 2014] [10012:8256] [error] ajp_service::jk_ajp_common.c (2711): (Instance_Codebase) connecting to tomcat failed.

[Wed Jun 25 23:40:40.825 2014] [10012:7060] [error] HttpExtensionProc::jk_isapi_plugin.c (2309): service() failed with http error 503

[Wed Jun 25 23:40:40.877 2014] [10012:10364] [error] ajp_send_request::jk_ajp_common.c (1669): (Instance_Codebase) connecting to backend failed. Tomcat is probably not started or is listening on the wrong port (errno=61)
[Wed Jun 25 23:40:40.965 2014] [10012:10364] [info] ajp_service::jk_ajp_common.c (2692): (Instance_Codebase) sending request to tomcat failed (recoverable), because of error during request sending (attempt=1)

[Wed Jun 25 23:40:40.857 2014] [10012:1020] [error] HttpExtensionProc::jk_isapi_plugin.c (2309): service() failed with http error 503
<Connector port="8014" protocol="AJP/1.3" redirectPort="8446" tomcatAuthentication="false">
<Connector port="8014" protocol="AJP/1.3" redirectPort="8447" tomcatAuthentication="false" maxThreads="250" connectionTimeout="60000">
worker.Instance_Codebase.max_reuse_connections=250
worker.Instance_Codebase.connection_pool_size=250
worker.Instance_Codebase.connection_pool_timeout=60