squid

使用squid实现按源ip选择分流[原创]

先简单介绍一下情况,拓扑图是这样的

        ip-class-1                           ip-class-2
(192.168.21.0、24~25.0、24)          (192.168.31.0~35.0、24)
                          |                                  |
                             |                         |
                               |                   | 
                                   squid-3.0
                                 (192.168.1.1)
                                 |             |
                               |                  |
                            |                        |
                 web-class-1                web-class-3
大概拓扑是这个样子的,可能实际情况比这个更加的负载
我为了实现这样一个拓扑,使用的环境
vmvare6.0,起3个虚拟机,ip分别211.128(squid),211.129(nginx),211.130(apache)
其中两台web又做服务端,又做client
squid的关键配置
                

acl a src 192.168.211.129/32
acl b src 192.168.211.130/32
cache_peer 192.168.211.130 parent 80 0 no-query originserver name=www1 round-robin
cache_peer 192.168.211.129 parent 80 0 no-query originserver name=www2 round-robin
cache_peer_domain www1 a.b.c
cache_peer_domain www2 a.b.c
cache_peer_access www1 allow a
cache_peer_access www2 allow b

第1,2行定义两个client,真实环境请自行更改

第3,4行定义后端的两台RS,并做了round-robin,如果RS很多请自行添加,如果需要做会话保持,请使用sourcehash替换round-robin

第5,6行定义域名走哪个RS,示例中的a.b.c域名使用rr方式投递到两台RS上
第7行定义a过来的请求都投递到www1的RS上
第8行定义b过来的请求都投递到www2的RS上

配置好了后启动squid和web,接下来进行测试
模拟client的两台机器我都用的是wget这个参数,由于我没有仔细研究wget的参数,所以不知道哪个参数包含no-cache头,所以每次wget前我都会用squidclient+purge参数清除缓存,以达到测试的准确性

现在a上进行,wget -S –spider http://a.b.c/,返回的结果是头中包含apache的版本号,而且每次都是apache的版本号,说明,从a ip过来的请求都投递到了www1的RS上
再在b上进行,使用相同的wget命令,返回结果的头中包含nginx的版本号,而且每次都是,说明,从b ip过来的请求都投递到www2的RS上了

如此,如果真实环境,你可以把a的请求或b的请求投递到一组RS上按不同的需求,使用RR或者sourcehash的负载均衡方式。

Related Post

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.