使用mod_reqtimeout进行性能testing时出现Apache问题

我们有2个Apache Web服务器,通过mod ajp连接到2(JBoss)应用程序服务器。

对于这些networking服务器,移动设备通过REST API连接。

在我们的性能testing中,我们很快遇到了很多NonHttpResponse错误,我们确定它们来自mod_reqtimeout:

[Mon Mar 16 14:42:49.324705 2015] [reqtimeout:info] [pid 27914:tid 140628428449536] [client 1.2.3.4:48280] AH01382: Request header read timeout 

…configuration如下:

 <IfModule reqtimeout_module> RequestReadTimeout header=10-20,minrate=500 RequestReadTimeout body=10,minrate=500 </IfModule> 

我能够通过增加这些值来摆脱这些错误

 RequestReadTimeout header=20-60,minrate=100 

但是,这不是解决scheme,因为有更多的同时发生的用户再次出现问题(要求能够服务300个并发用户–100个工作相当好,300个我们有10,000个以上的请求头读取超时错误)。 我怀疑这是apaches KeepAlive,我们的mod_ajpconfiguration和mod_reqtimeout的相互作用,导致mod_reqtimeout的结论是有一个slowloris攻击正在进行(许多开放的连接什么都不做),我恳求你的帮助,调整这些参数。

其他问题是Web服务器和应用程序服务器之间的防火墙,我怀疑要打开空闲连接。 我读完closuresKeepAlive来解决这个问题,但正如我所说,我们所有的客户都是移动设备,所以这可能不是一个选项(?)。

以下是其他configuration(的一部分):

workers.properties:

 worker.list=server worker.maintain=60 worker.server.type=ajp13 worker.server.host=server worker.server.port=15869 worker.server.socket_keepalive=True worker.server.connection_pool_timeout=600 worker.server.ping_mode=A worker.server.connection_ping_interval=60 

mod_prefork:

 <IfModule prefork.c> StartServers 5 MinSpareServers 5 MaxSpareServers 10 #MaxClients 256 MaxClients 300 MaxRequestsPerChild 0 </IfModule> 

mainserver.conf:

 Timeout 300 KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 15 

ssl.conf(移动设备通过ssl连接):

 Timeout 1200 KeepAlive On MaxKeepAliveRequests 0 KeepAliveTimeout 10 

如果使用“prefork”MPM,这似乎是一个反向代理,而混合“worker”MPM具有更好的可扩展性,这是不寻常的,但这不是问题。

在终止客户端请求的前端设备上,DoS缓解通常是最好的(如果不是由ISP提供的话),从描述来看,这是一个负载均衡器,而不是Apache。 任何有能力的负载均衡器都会被HTTP感知(即“第7层”),这可能会导致HTTP请求的缓冲。 这也适用于负载平衡器正在终止HTTPS的情况,但是如果负载平衡器仅仅中继HTTPS连接(因为它不能看到HTTP请求来缓冲它们),情况就不那么明显了。 如果您的负载平衡器是一个简单的“Layer 3/4”NATtypes负载平衡器,也不适用。

至于超时的可能原因:

  • 您的SSL实例KeepAliveTimeoutRequestReadTimeout标头读取超时相同,有可能存在传入客户端请求/标头中途到达keepalive超时的竞赛。 如果我试图重现这一点,除了AH01382错误,我也得到AH01991(SSLinputfilter读取失败)和AH00567(请求失败:读取头错误)。 这可能不能解释所有的问题。
  • 格式错误的客户端请求,在过去并不罕见(例如POST之后的额外CR / LF,错误后重试时请求不完整)。 我不知道什么是最新的,这取决于你的客户群,更重要的是它们的连通性。
  • 可能会有一个类似于最近这个错误的错误,导致“事件”MPM虚假超时。

重现超时:

  $ openssl s_client -connect myhost:443 GET / HTTP/1.1 Host: myhost.whatever.com [server reply goes here] GET / HTTP/1.1 Host: 

您可以编写脚本以使其更容易,否则您必须在已configuration的10秒内键入/粘贴第一个请求和标题,然后在接下来的10秒内键入但不完成第二个请求,您必须至less有一个完整行(请求)提交第二个请求,然后等待。

减lessKeepAliveTimeout(默认值是5秒)可能会有所帮助。 请注意,KeepAliveTimeout是接收完整请求的时间。 我想下一步可​​能是mod_log_forensic

关于通过AJP连接到后端,您是否在Apache Balancerconfiguration上使用“ping”? 如果我正确理解您的系统,则您所提供的Tomcatconfiguration将不适用于从Apache httpd到Tomcat的连接。 看到这里的选项 。

  /-> apache httpd + ajp -\ /-> tomcat/jboss client -> load-balancer < > firewall < \-> apache httpd + ajp -/ \-> tomcat/jboss