使用 Apache2 限制每个 IP 的同时连接数

使用 Apache2 限制每个 IP 的同时连接数

我正在托管一个公共的 CPU 密集型 Web 服务,我想将 Apache2 配置为仅允许每个 IP 地址与当前位置建立 1 个同时连接,以防止单个客户端使用过多资源。

有没有一个简洁的 apache2 解决方案可以做到这一点?我研究过 mod_bw,但这似乎不起作用(MaxConnections 仅适用于所有用户,而不是每个 IP)。还有一个名为 apache2-mod-limitipconn 的模块,但这个模块没有预编译的包,我认为由于网站已经关闭,它不再维护。我更喜欢可以作为 Ubuntu 中的正式依赖项包含的东西。

答案1

从我的经验来看,这比仅仅限制“每个 IP 一个连接”要复杂一些(难道不是一直如此吗 :-))。

但是还有其他可配置参数,例如“MinSpareServers、MaxSpareServers 和 StartServers”(我不确定这些是否仍然存在,但它们肯定存在于 Apache 2.0 中)。

另外显然,如果有帮助的话,使用“mod_deflate”压缩输出可以改善带宽需求并将响应时间加快多达 75%。

“mod_bandwidth” 可能提供一些帮助,而不是试图限制单个连接,这可能是我在研究压缩后会走的路线。

或者,如果您会编写 C 语言,那么您可以自己创建一个模块来计算每个 IP 的连接数。

需要注意的是,当一个 IP 只被服务于一个连接时会发生什么。通常情况下,情况并不乐观!您可以转到“服务器繁忙”页面或类似页面,但我会选择优化您的服务器,让它尽可能好,而不是让访客感到沮丧。

答案2

我不太确定 apache 模块,但你可以使用 iptables。以下是有关 connlimit 模块的操作方法:http://www.cyberciti.biz/faq/iptables-connection-limits-howto/

在你的情况下,类似下面的操作会起作用:

/sbin/iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 -j REJECT --reject-with tcp-reset

但是,正如其他问题中提到的那样,请小心:此规则可能会阻止一些合法机器人(例如谷歌爬虫)或使用 NAT 并为大量用户共享单个 IP 地址的 ISP/组织。

答案3

您可以使用 mod_qos httpd 模块。

QS_SrvMaxConnPerIP <number> [<connections>]

定义此服务器(虚拟主机)每个源 IP 地址的最大连接数。“connections”参数定义服务器(所有虚拟主机)的繁忙连接数以启用此限制,默认值为 0(这意味着即使服务器处于空闲状态,限制也始终启用)。

更多详情http://mod-qos.sourceforge.net

例子:

LoadModule qos_module path_to_module/mod_qos.so
<IfModule mod_qos.c>
        # max connection per IP is
        QS_SrvMaxConnPerIP 15 
</IfModule>

<VirtualHost *:80>
...
</VirtualHost>

答案4

每个 IP 地址一个连接是行不通的。网络浏览器将使用一个连接下载网页,然后使用 10 多个同时连接来获取所有图像、css、javacripts 等。因此,如果您确实通过 IP 进行限制,用户将获得主页,也许还有几张图片,仅此而已。

IP 限制的唯一适用情况是,如果您有专用的下载服务器,并且不希望人们在其上使用下载加速器。又称 RapidShare。

您需要调查网站滥用者如何滥用您的服务并针对他们。如果您限制每个人,那么每个人都会受到伤害。

如果只是流量太大,那么您需要优化网站或使用更多/更快的硬件来增加一些 CPU 周期。

相关内容