使用Squid作为反向代理,并进行流量限制

前言

Squid是一个比较老的网络转发工具,功能类似于Nginx或者HAProxy(个人理解)。

之所以尝试了Squid是因为Squid原生支持delay_pools可以用来做流控。

正文

目的

有一个后端服务部署在本机http://localhost:10000,需要对该服务做一个带宽限制,所有用户访问的带宽总和为1MB/s。

Squid安装

使用的是centOS7.9,通过yum install squid可以直接安装。

安装完成后可通过systemctl start squid即可启动。

但是此时安装完先不要启动,先进行配置

Delay Pool 说明

Delay Pool代表一个桶,桶有一个初始容量,和每秒补充的容量。

每通过1个字节需要消耗一个桶的容量。

所以一边是客户端不停消耗桶容量,另一边根据桶的容量补充速度,实现了动态的带宽限制。

Squid配置

配置内容如下:

# 定义一个后端访问规则,名为backedn1_acl,这里定义为域名backend1.example.com
acl backend1_acl dstdomain backend1.example.com
http_access allow backend1_acl

# 定义一个后端的服务,在本机10000端口上,别名是backend1
cache_peer localhost parent 10000 0 no-query originserver name=backend1
# 将backedn1_acl流量配置到backend1后端上
cache_peer_access backend1 allow backend1_acl
cache_peer_access backend1 deny all

# 创建一个delay pool
delay_pools 1

# Delay Pool 配置,标识1号pool采用2类限流配置
delay_class 1 2
# 限流单位为字节,格式为 [每秒重新填充的容量]/[最大容量],这里每秒条虫1024*1000 Byte,差不多是1MB/s
# 后一个none其实也可以限制,是限制的每个链接的单独的桶
# 也就是说既可以控制总的带宽,也可以控制每个连接使用的带框
delay_parameters 1 1024000/2024000 none
#配置访问权限
delay_access 1 allow backend1_acl
delay_access 1 deny all

# 拒绝其他进入的流量
http_access deny all


# 使用80端口作为对外端口
# accel表示作为反向代理
# vhost表示使用请求的Host头作为选择后端服务的Host
http_port 80 accel vhost

# 缓存文件
cache_dir ufs /etc/squid/logs 100 16 256

# coredump文件
coredump_dir /var/spool/squid

# 日志格式
logformat squid %{%d %H:%M:%S}tl %6tr %>a %Ss/%03>Hs %<st %rm %ru "%{Referer}>h" "%{User-Agent}>h" %mt

配置完成后重启squid服务:

systemctl restart squid

功能验证

需要预先配置好host文件,在/etc/hosts中增加一条

[本机ip] backend1.example.com

通过curl可测试限速效果(注意,这里要求原本后端localhost:10000可提供test.txt大文件的下载,否则请求一下就结束了,速度不准确)

curl http://backend1.example.com/test.txt > /dev/null

也可以尝试修改配置中delay_parameters 1 1024000/2024000 none限速配置,调整大小,或配置为none,重新测试。

注意重新测试前,需要重新启动squid服务,以加载配置

遗留问题

配置中1024000/2024000,前一个是填充速度,后一个是容量。

测试发现如果填充速度和容量相等时,理论上应该带宽就是填充速度,但测试只有实际的一半左右。

增加桶的总容量可以缓解这一问题,但是具体原理不太清楚

posted @ 2024-12-10 14:16  mosakashaka  阅读(17)  评论(0编辑  收藏  举报