我想在运行 RHEL 5.8 的 Apache 2.2.3 服务器上强制所有 HTTP 请求保持活动或持久连接。出于某种原因,很多网络爬虫都在使用 HTTP 1.0,我想强制持久连接,或者以某种方式强制这些连接使用 HTTP 1.1,以便 Apache 配置中的 Keep Alive On 设置将导致持久 HTTP。这是因为我想减少打开的 TCP 连接数。我该如何实现这一点?
答案1
HTTP 1.0 不支持保持连接(又称持久连接),而且没有系统要求他们使用 HTTP 1.1。您可以返回 400x,但他们仍然已经创建了连接,而且没有标准方法告诉他们改用 HTTP 1.1。即使您的所有客户端都正常工作,他们都需要 HTTP1.1,您也无法在服务上采取任何措施来阻止他们在保持连接标头中发送“close”或断开连接,并且仍然对每个请求执行单个连接。
有一些 Linux 内核选项(特别是DEFER_ACCEPT
和TIME_WAIT
)可以帮助减少 TCP 连接表,但我不建议沿着这条路走下去,除非你知道自己在做什么,因为它很容易让事情变得更糟而不是更好。
但从更广泛的角度来看,我认为你试图以错误的方式解决问题。互联网是黑暗的,充满了恐怖,如果随机机器人导致你的 TCP 连接限制问题,那么你绝对容易受到 SYN 洪水或其他 DDOS 类型事件的攻击,而机器人只是一个信号,表明你的网络服务器要么规模不足,要么受到攻击,要么配置错误。无论哪种方式都是有问题的。
如果您真的想控制到达 Apache 的请求类型,则需要在 Apache 前面安装 WAF(Web 应用程序防火墙)或负载均衡器,以便在不良请求消耗昂贵的 Apache 连接之前将其过滤掉。在许多情况下,您还可以卸载执行 SSL/TLS 加密的 CPU 密集型工作。
我知道这不是一个快速的解决方案,也不是您想要的答案,但无论问题是什么,您都不太可能通过这种方式解决它。
答案2
您只需将 KeepAliveTimeout 设置为一个较高的数字即可。
以下是该指令的手册条目: http://httpd.apache.org/docs/2.4/mod/core.html#keepalivetimeout
请注意,“将 KeepAliveTimeout 设置为较高的值可能会导致负载过重的服务器出现性能问题。超时值越高,等待与空闲客户端的连接而占用的服务器进程就越多。”