我将build立一个Apache基础下载镜像,并开放公共和私人访问。 我想限制外部访问约650Mbps,但没有限制(最好是优先级)内部访问。 在有足够容量的情况下,我也希望尽可能快地为客户端服务,但是当连接了很多客户端(希望平均,但不是必需的)时,要分配带宽。 另外,服务器也将用于Ubuntu和Debian软件包镜像。 networking服务器将只提供静态内容,并且必须使用apache。
目前configuration:
Apache版本:Apache 2.4.18
操作系统:Ubuntu 16.04 LTS
CPU和RAM:现在最好是2个核心的4GB,但如果需要,可以扩展到4个核心32GB。Apache模块:默认
根据访问的便捷性排列的选项:
– apache模块
– 对运行apache服务器的服务器的根访问权限(对软件stream量整形/速率限制打开)
– Juniper EX4xxx系列交换机非常强大,99%闲置
这里是基于tc和iptables的工作示例。
步骤1:
用PRIO队列replace默认的pfifo_fast队列。
PRIO队列是一个有用的队列,可以让我们稍后连接filter来分类不同types的stream量。
检查现有队列
tc -s qdisc ls dev eth0
replace为PRIO。 这将创build3个默认的乐队。
tc qdisc add dev eth0 root handle 1: prio
其中可以看到如下
1: root qdisc / | \ / | \ / | \ 1:1 1:2 1:3 classes
现在让我们添加有趣的队列。 我们将把它们附加到乐队1:1,1:2和1:3
tc qdisc add dev eth0 parent 1:1 handle 10: sfq tc qdisc add dev eth0 parent 1:2 handle 20: tbf rate 20kbit buffer 1600 limit 3000 tc qdisc add dev eth0 parent 1:3 handle 30: sfq
其中可以看到如下
1: root qdisc / | \ / | \ / | \ 1:1 1:2 1:3 classes | | | 10: 20: 30: qdiscs qdiscs sfq tbf sfq 0 1 2 bands
基于数据包的TOSstream量将会到达
但是这并不是我们想要的,因为几个应用程序实际上会设置TOS值
我们希望将从80端口(运动= 80)发起的stream量分为1:2(我们决定限制速率)和剩余stream量为1:1。
通过这种方式,剩下的stream量不需要等待httpstream量,并且会有优先权。 否则,慢的httpstream量将阻止其他非交互式stream量。
那么如何做到这一点?
我们将标记我们从源端口80发起的数据包标记2通过iptables和非http通信标记1
iptables -t mangle -A OUTPUT -m tcp -p tcp --sport 80 -j MARK --set-mark 2 iptables -t mangle -A OUTPUT -m tcp -p tcp ! --sport 80 -j MARK --set-mark 1
我们将使用tcfilter,将标记有标签的数据包路由到特定的频段
tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 2 fw flowid 1:2 ### Send traffic from source port 80 to tbf queue tc filter add dev eth0 protocol ip parent 1:0 prio 2 handle 1 fw flowid 1:1 ### Send all other traffic to sfq queue 1:1
现在我们准备好testing了。 我将启动从http服务器下载CentOS iso,同时我将启动同一个服务器的同一个映像的sftp传输。 在下图中我们可以看到,虽然sftp传输速度约为13MB / s,但http传输限制在20kbit / s。
在这个例子中,频段1:3甚至没有被使用。
所以也许最好在band 1:3上使用tbf,并且使用sfq和默认优先级来设置1:1和1:2。 然而,这只是一个快速的testing,应该足以有希望澄清一些更好的复杂的tc文件。
使用的资源:
一个简单的方法可能是调出多个物理接口,每个接口可能都是1 Gbps。 把一个面向外部子网,另一个面向内部。 mirror.example.com是公共可访问的,但mirror.corp.example.com只在局域网上。
但是,在vNIC可以比其模拟的设备更快的虚拟机上,受限的接口技巧是不够的。
它也比你所要求的要less得多。 如果超过650 Mbps的目标是不安全的,你可能需要更复杂的东西。
因为Apache的体系结构将负载分散到许多不同的进程/线程中,所以我不认为在apache级别进行限制/优先级会有所帮助。
我期望最好的方法是在linux内核中使用stream量限制/优先级支持。
不幸的是,我自己并没有这样做,但我明白关于这个主题的文档是关于linux高级路由和stream量控制的。
我相信http://lartc.org/howto/lartc.qdisc.html是相关章节。
如果你得到这个工作,请回来,写一个答案,详细说明你是如何工作的。