流量整形¶
人们希望限制连接从您的Web服务器下载数据的速率,原因有很多。
这些原因从服务质量(QoS)到为付费客户提供更好的速度不等。
流量整形是使用 mod_throttle 实现的。
基本上,lighttpd 中有三种限流类别,它们在可用带宽共享方式上有所不同
- 按连接
- 按客户端IP地址
- 按“池”
按连接限制带宽¶
io.throttle 100kbyte;
通过使用此方法,每个连接被限制在一定的下载速率。
不同的连接不共享可用带宽配额(除了您的上行链路的物理限制)。
例如,如果您有一个视频流媒体网站,并且希望限制视频流的速率,这会很有用
限制为 1mbit/s,以节省流量,以防客户端决定不观看整个视频,因此不需要预加载完整文件。
连接限流还支持初始的 burst
(突发),这使得在向客户端发送指定量的流量之前,不应用该限制。
io.throttle 1mbyte => 100kbyte;
上述示例将连接限制为在发送 1 兆字节后每秒 100 千字节。这对于视频流媒体特别有用。
然而,这种技术对于纯文件下载服务没有意义,因为客户端可以简单地打开多个连接以规避每连接限制。这正是下一种方法发挥作用的地方。
按客户端IP地址限制带宽¶
if req.path =^ "/downloads/" { io.throttle_ip 1mbit; # All requests for files in /downloads/ are limited to 1mbit per IP }
对于允许每个IP多个连接的下载服务,按IP限制下载速率至关重要,以防止客户端通过打开多个连接来规避限制。
来自同一IP地址的所有连接共享分配给它们的带宽。
按“池”限制带宽¶
if req.path =^ "/downloads/" { io.throttle_pool 90mbit; }
第三种也是最后一种技术不像前两种那样不言自明。它允许您将连接分组,然后这些连接从特定于此组的池中获得公平的带宽份额。
一个例子很好地说明了这一点:假设您有一台服务器,上行连接为 100mbit/s,并且您的网站上有一个由许多大文件组成的流行下载区。
这些下载将大大占用您的大部分带宽,但您不希望它们占用所有带宽,导致主页加载非常缓慢。
为了防止这种情况,您可以将下载区中所有文件的请求分组,并将它们分配到一个限制为 90mbit/s 的池中,从而保证所有其他请求有 10mbit/s 的可用带宽。
连接不能同时属于多个限流池。
混合方法¶
io.throttle_pool 5mbit; # Server limit for all connections if req.path =^ "/downloads/" { io.throttle_ip 1mbit; # All requests for files in /downloads/ are limited to 1mbit per IP }
上面解释的三种限流方法并非互斥,这意味着您可以组合使用它们。
例如,您可以将每个连接限制为 1mbit/s,并将整个服务器(通过使用全局限流池)限制为 50mbit/s。
池和IP限制具有最高优先级,然后考虑每个连接的限制。
这意味着,如果您的连接在一个限制为 50mbit/s 的池中,当前有 24 个其他连接,并将连接限制为 10mbit/s,则活动连接将获得大约 2mbit/s(如果池中的其他连接速度不太慢)。
下面是可视化上述配置的图表。在此示例中,我们有 3 个连接
一个来自 127.0.0.1 的 /file1.tar,以及两个来自 127.0.0.2 的 /downloads/file2.tar 和 /downloads/file3.tar。
由于来自 127.0.0.2 的连接按 IP 限速为 1mbit/s,因此它们每个都获得 0.5mbit/s。
这为第一个连接留下了 4mbit/s。