我有一个网站,主要是由静态html页面偶尔ajax请求。 该网站在Apache上运行,ajax由Tomcat处理。
如果Tomcat的响应速度很慢(java无法连接到数据库服务器,或者只是需要很长时间来处理请求),它会导致整个站点停机:所有静态html页面都需要很长时间才能加载(相同与图像,CSS,JS)。
现在,如果我只是手动停止Tomcat的一切工作仍然正常 – 该网站是快速和响应,只是Ajax请求无法正常工作。
我怎样才能使响应慢的Tomcat不使用所有的Apache资源,所以静态页面总是可以工作,不pipeTomcat发生了什么事情? 在我的情况下,响应式html页面比不工作ajax更重要。
httpd.conf :
Timeout 120 KeepAlive Off MaxKeepAliveRequests 100 KeepAliveTimeout 15 <IfModule prefork.c> StartServers 16 MinSpareServers 10 MaxSpareServers 40 ServerLimit 512 MaxClients 512 MaxRequestsPerChild 4000 </IfModule>
workers.properties
worker.worker1.port=8888 worker.worker1.reply_timeout=120000 worker.worker1.socket_timeout=150000
server.xml中
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8081" /> <Connector port="8888" scheme="http" protocol="AJP/1.3" redirectPort="8889" minSpareThreads="100" maxThreads="400" connectionTimeout="20000" acceptorThreadCount="2"/>
如果出于某种原因,tomcat不能快速处理你的ajax请求,这会减less你的apache可以处理的请求数量。 Tomcat被configuration为并行处理400个请求,并且还有一个默认的acceptCount为100.所以你的tomcat能够吃掉500个请求 – 至less:jvm和依赖于平台的甚至可能有更多的连接请求排队。
worker.worker1.reply_timeout=120000 worker.worker1.socket_timeout=150000
..tells mod_jk等待大约1.7 天 (socket_timeout以秒为单位)进行套接字操作,2分钟后从tomcat单个networking数据包。 你应该调整这些值,让mod_jk尽可能早地返回一个错误,如果tomcat很慢。
让我们假设你的ajax请求通常在一秒钟内处理,最多两秒钟。 处理结束后,回复立即发回。 然后可以设置worker.worker1.reply_timeout=2500 ,只需要半秒钟。 socket_timeout甚至可以省略,因为它只是一个粗略的值。 socket_connect_timeout定义了从apache / mod_jk连接到tomcat可能需要多长时间,应该被添加到worker.properties中,并设置为非常低的值,例如100,因为它们都位于同一台服务器上。 有关更多详细信息,请参阅Apache Tomcat连接器参考 。
每个从apache到tomcat的请求都会计算您在httpd.conf中使用MaxClientsconfiguration的内容。 更多的请求被困在tomcat中,可能由apache处理的静态内容更less。 如果你在这种情况下closurestomcat,静态内容就会被快速传递,因为它可以释放mod_jk和apache中的请求处理资源。
您已经在httpd.conf中同时configuration了prefork.c和worker.c 。 我猜prefork.c是活跃的,因为MaxClients设置为512,这将匹配您的观察和我的解释.. 😉
告诉mod_jk早些时候放弃对tomcat的长时间运行请求可能会有很大的帮助,但是你也应该考虑调整由apache处理的客户端请求的数量( MaxClients )以及tomcat进程的请求数量( <connector maxThreads=... )并行。 这些数字必须与正常操作中发生的情况相平衡。 页面加载的一些跟踪可能会有助于了解这些值应以多大的比例。 绝对值取决于您的服务器规格,networking状况,客户端数量等。
如果可能的并行请求的绝对数量较低,用户将抱怨页面加载速度缓慢,而您不会看到您的服务器用于容量。 如果这个数字太高了,它会占用比真正需要的更多的内存,甚至会减速,并且不能很快从子系统的问题(例如数据库)中恢复。 如果apache发送更多的请求到tomcat,因为它会及时处理,你会看到其中一些超时,而其他人在可以接受的时间处理。 在apache和tomcat中开始使用相似的值是不错的,只要超时设置确保一个缓慢或无反应的tomcat不是apache的磨合。
你似乎只定义了一个工人。 这意味着Apache只能通过一个实例与Tomcat交谈。 正常的JKconfiguration包含8-16名工人。 看看你可以下载的默认JKconfiguration文件。