沉睡Apache服务器拒绝连接,但不通过本地主机

我推送了一个适量的stream量(约20 req / s)到一个运行在Apache服务器上的简单PHP API。 Apache服务器瘫痪(mod_status几乎没有注册一个活动的请求),但是,我看到“连接被拒绝”的错误发生,尽pipe这样。 我尝试清理uname -nMinSpareServers ,但没有任何效果。

我在加载的时候运行了一个诊断脚本,我发现10个请求中有1个失败,连接被拒绝

 while [ 1 ]; do echo "" | telnet <server> 80; sleep 1; done 

但是,当在本地机器上运行一个类似的请求时,它很好。

 while [ 1 ]; do echo "" | telnet localhost 80; sleep 1; done 

最初我以为可能是所有的请求都来自同一个客户端,并且服务器被限制了。 但是,在负载下,尝试连接的所有其他主机将看到相同的间歇性问题。

本地主机的行为不同的事实表明,这是一个networking,而不是Apache的问题,但我不知道在哪里诊断。 是否有日志logging,我可以检查/启用,以查看连接拒绝是否在O / S(或可能是iptables)级别发生。

相关软件:

  • Ubuntu Lucid,2.6.33内核
  • Apache 2.2.14

更新:

在我们的iptablesconfiguration中,我可以在“Chain TCPACCEPT”下看到以下规则:

655K 34M ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x17/0x02 limit: avg 12/sec burst 24

似乎这个速度限制肯定会导致一些这些“连接被拒绝”的错误。 我可以在很短的时间内closures防火墙,看看是否能解决这个问题,但是我认为这个规则有助于应对DOS攻击。 目前的限制似乎太小,平均和爆裂。 什么是更明智的限制(我可以调整我们的iptablesconfiguration这些)?

如果定期发生,最有可能不是iptables,而是查看你的iptables规则,运行

 sudo iptables -L -n -v 

你的iptables日志将在/ var / log下,但是可以根据你的configuration而有所不同。 检查/etc/rsyslog.d目录下的iptables日志位置是否有configuration文件。

您也可以使用netstat或lsof来查看端口上发生了什么。

 netstat -an | grep "80.*LIST" lsof -i :80 

最后,您可能需要进行networking捕获,以查看是否有TCP RST被发回,或者没有响应返回 – 请使用tcpdump。

更新问题更新:

如果你禁用iptables规则会发生什么? 它做了一些事情,但其中一个似乎是限制tcp段,只有syn数据包设置为平均每秒12个/突发限制。 如果你平均发送20 /秒,我相信你超过了iptables规则中设置的限制。

因此,你可以closures防火墙上的这个规则来testing(我不build议完全closures防火墙),或者你可以修改它为22 /秒,突发36。

在修改之前,我会强烈地考虑修改你不熟悉的configuration,或者不确定为什么它在那里。