Apache 中来自单个 IP 地址的 ESTABLISHED 连接过多

Apache 中来自单个 IP 地址的 ESTABLISHED 连接过多

netstat -ntp |grep 80ESTABLISHED显示来自单个 IP 地址的连接过多。300其中不是攻击并且用户正在使用 2G 连接访问 Apache。其他 2G 连接也是如此。因此,Apache 的子进程耗尽。

之前显示的太多close_wait,启用后就 tcp_tw_reuse不多tcp_tw-recycleclose_wait,但连接数ESTABLISHED增加了。

我们使用的是具有 48 GB RAM 的 Ubuntu 11.04

keepalive On
keepalive timeout 10
max clients 800
max-request-perchild 4000
timeout 300

我已设置syn_ack为 1 和syn_retries2。

在 wifi 上不存在这样的问题。连接可以正常关闭,但使用 2G 连接时,Apache 会耗尽子进程,并且ESTABLISHED连接过多。

我也尝试过设置暂停从默认的300到30,但由于我们的项目是手机图片托管,客户端无法正确上传图片,因为他们经常超时。此外还有很多408消息,所以将其更改为默认的 300

答案1

tcp_tw_reuse 和 tcp_tw-recycle 以及 tcp-fin_timeout 设置为 30

fin 超时在这里有帮助,但是重用和回收呢?为什么?

保持连接超时 10

这太荒谬了。即使使用拨号上网,这个数字也应该为 3 或更少。

超时 300

你知道这是做什么的吗?这可能是默认设置,但它又太高了。

您可以尝试使用 wireshark 捕获一些流量,以准确了解连接无法关闭的原因。

是否可以使用 mod_reqtimeout 选项

仅当客户端出现严重问题并且您不想为他们提供服务时才会发生这种情况。

我们应该转移到 ngnix 服务器吗

它肯定会更容易处理慢速连接,但是您可能希望将其用作代理(并且您可以使用 iptables 通过它有选择地/透明地路由特定子网)

答案2

问题与低速客户端有关。解决此问题的最佳方法是使用反向代理解决方案,例如 nginx、varnish 或类似软件(如果来自 Apache)。良好的反向代理服务器可以毫无问题地处理数千个连接。

为什么将 Nginx 设置为反向代理是一个好主意?

答案3

您是否尝试过将Timeout指令降低到更低的水平,例如105

或者,您可以尝试切换 prefork MPM(如果可能)并使用事件驱动模型(例如 Apache 2.4 中的事件 MPM)或其他 Web 服务器(例如 nginx)。

您还可以使用 nginx(或类似程序)作为 Apache 前面的反向代理。代理将等到收到整个请求后再向 Apache 发出上游请求。这样,此请求在中间就不会有延迟。

Apache 子进程耗尽的问题也可能由Keepalive您的设置导致或加剧。考虑关闭该设置或降低该keepalive timeout值。当然,将其设置得太低可能会使其变得毫无用处。

相关内容