当服务器达到一定吞吐量时拒绝新的 HTTP 请求

当服务器达到一定吞吐量时拒绝新的 HTTP 请求

我有一个要求,即运行一个 HTTP 服务器,当当前 HTTP 响应的全局传输速率超过一定水平时,该服务器将拒绝新的 HTTP 请求(返回 503 或类似错误)。例如,如果 Web 服务器的传输速率为 98Mbps,并且有新的 HTTP 请求到达,我们会希望拒绝该请求(因为我们无法保证良好的速度)。

我研究过 Apache 的 mod_cband、nginx 的 limit_req 以及 lighttpd 的速率限制功能,但它们似乎都无法处理我的(相当做作的、理所当然的)用例。

我应该补充一点,我愿意使用几乎任何 Web 服务器,如果有人可以制定这样的规则,我也愿意在 iptables 规则中实现这一点!(拒绝 TCP 连接是可以的,它不必以 HTTP 503 进行响应)。

有什么建议么?

答案1

iptables 计费脚本,当带宽过高时,会将数据写入文件。mod_rewrite 规则使用 rewritemap 读取映射,映射文件将包含

已阻止 已阻止

(需要 lhs 和 rhs)

在您的 <VirtualHost> 容器中:

RewriteMap blockmap txt:/path/to/file/map.txt

在你的 .htaccess (或 <VirtualHost>) 中

RewriteEngine on
RewriteCond ${blockmap:blocked|NOTFOUND} ^blocked$
RewriteRule .*  http://www.google.com/ [R=301,L]

不要重定向,而是向他们提供稍后再回来的页面,将其作为错误 503 等。

答案2

为此,您可以在 Apache 前面设置一个 Haproxy。要配置 Haproxy 中的速率限制,请阅读这篇优秀的文章Kyle Brandt 的帖子

相关内容