我推送了一个适量的stream量(约20 req / s)到一个运行在Apache服务器上的简单PHP API。 Apache服务器瘫痪(mod_status几乎没有注册一个活动的请求),但是,我看到“连接被拒绝”的错误发生,尽pipe这样。 我尝试清理uname -n和MinSpareServers ,但没有任何效果。
我在加载的时候运行了一个诊断脚本,我发现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)级别发生。
相关软件:
更新:
在我们的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,或者不确定为什么它在那里。