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

Jer*_*oen 2 linux hosting bandwidth-control apache-2.2

我正在托管一个公共的 CPU 网络服务,我想将 Apache2 配置为每个 IP 地址只允许 1 个同时连接到手头的位置,以防止单个客户端使用太多资源。

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

rvs*_*rvs 7

我不确定 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
Run Code Online (Sandbox Code Playgroud)

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


小智 5

您可以使用 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>
Run Code Online (Sandbox Code Playgroud)