我正在托pipe一个公共的大型CPU Web服务,我想configurationApache2只允许每个IP地址同时连接到手边的位置,以防止单个客户端使用太多的资源。
有没有一个整洁的apache2解决scheme来做到这一点? 我已经看着mod_bw,但这似乎并没有这样做(MaxConnections只适用于所有用户,而不是每个IP)。 还有一个叫做apache2-mod-limitipconn的模块,但是这个模块没有预编译的软件包,而且我认为在网站已经死了的情况下,这个模块的维护时间更长。 我更喜欢一些可以在Ubuntu中作为正式依赖的东西。
从我的经验来看,这比仅限于“一个IP地址的连接”要复杂一点,我害怕(不是总是:-))。
然而,还有其他可configuration的参数,例如“MinSpareServers,MaxSpareServers和StartServers”(我不确定这些参数是否仍然存在,但它们当然在Apache 2.0中)。
显然,压缩输出可以改善带宽需求,如果有帮助,可以使用“mod_deflate”将响应时间缩短高达75%。
“mod_bandwidth”可能会提供一些帮助,而不是试图限制一个单一的连接,而且可能是我在查看压缩之后下的路线。
或者如果你可以写C,那么你可以自己创build一个模块来统计每个IP的连接数。
要注意的是当一个IP被服务一个连接时会发生什么。 我们只是说通常这不是一个美丽的景象! 你可以下载到“服务器繁忙”页面或类似的页面,但我会沿着优化你的服务器的路线,所以这是一个好的,因为它可以比令人沮丧的访问者。
我不知道有关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的ISP /组织,并为大量用户共享单个IP地址。
我只是有相反的需要 – apache2每次只能为一个页面服务一个IP。 如果这花了很长时间,另一个选项卡上的另一个页面加载将不会开始加载,直到任何其他人已经完成我所要求的服务器。
我知道这是相关的会议,并在 这里和这里find了完整的答案。
你可以使用mod_qos httpd模块。
QS_SrvMaxConnPerIP<number>[<connections>]
定义此服务器(虚拟主机)的每个源IP地址的最大连接数。 “连接”参数定义了服务器(所有虚拟主机)的繁忙连接数,以启用此限制,默认值为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>
每个IP地址一个连接是不行的。 一个networking浏览器将使用一个连接下载网页,然后10 +同时连接,以获得所有的图像,CSS,JavaScript等,所以如果你通过IP进行限制,用户将获得主页,也许一些图像,这是全部。
IP限制唯一的用例是如果你有一个专门的下载服务器,你不希望人们使用下载加速器。 又名,RapidShare。
您需要查看网站滥用者如何滥用您的服务并将其定位。 如果你限制每个人,那么每个人都会受到伤害。
如果stream量过大,则需要优化网站或者使用更多/更快的硬件来增加更多的CPU周期。