关于使用Nginx做流量分流的问题

519 views
Skip to first unread message

G_will

unread,
May 23, 2012, 11:33:40 PM5/23/12
to open...@googlegroups.com
大家好,

遇到一个问题,我们有下载服务器,现在用了CDN服务,两边文件同步。但是CDN费用较高,如果直接用DNS轮询,在下载流量很低的时候CDN也会分到流量。
我们想,让请求都先到下载服务器,如果带宽过高再将请求跳转给CDN。如果用Nginx怎么实现这样的流程?

先谢谢大家了。

Weiqiang

unread,
May 24, 2012, 12:39:41 AM5/24/12
to open...@googlegroups.com
看上去你们需要的是一个反向代理+带权重的负载均衡器

可以用openresty放在前端做反向代理和负载均衡。用lua编写负载均衡的规则,比如说可以再shdict实现一个令牌桶,令牌够用的时候把proxy_pass的目的地址设置成内网地址,如果令牌不够了,则把目的地址设成CDN地址

:-)
李伟强



2012/5/24 G_will <gwill...@gmail.com>

cnhack TNT

unread,
May 24, 2012, 12:41:41 AM5/24/12
to open...@googlegroups.com
带宽占用高的时候就别proxy_pass了,直接返回一个307转到CDN去吧

2012/5/24 Weiqiang <lwei...@gmail.com>

Weiqiang

unread,
May 24, 2012, 12:50:56 AM5/24/12
to open...@googlegroups.com
呵呵,cnhack TNT说得对。

proxy_pass的话,流量还是从openresty经过的

谢谢指正。

李伟强

2012/5/24 cnhack TNT <cnha...@gmail.com>

G_will

unread,
May 24, 2012, 12:56:28 AM5/24/12
to open...@googlegroups.com

在 2012年5月24日 下午12:41,cnhack TNT <cnha...@gmail.com>写道:
带宽占用高的时候就别proxy_pass了,直接返回一个307转到CDN去吧


现在简单配置了下载服务器404以后301到CDN去,(CDN文件比较全,同步到文件服务器中间有一个时间差,所以会出现CDN存在,下载服务器不存在的情况。)
现在的问题是,用什么工具配合Nginx,可以监控流量,做请求转发?

我能想到的方法感觉都比较繁琐。比如:
用一个定时任务(30秒跑一次)查询带宽,如果带宽超标,给redis一个键值1,没有超标为0,然后lua每次请求去查那个键,如果键值为1,触发301跳转。
这样感觉不太好。

kindy

unread,
May 24, 2012, 4:05:15 AM5/24/12
to open...@googlegroups.com
是不是可以搞个频度控制,当触发频度控制就认为流量过大,
把 403 转成 302 如何。


2012/5/24 G_will <gwill...@gmail.com>



--

林青(Kindy Lin)

G_will

unread,
May 26, 2012, 11:47:15 AM5/26/12
to open...@googlegroups.com
我还想到一种思路:

机子出口带宽100M,也就是总下载速度能达到12M/s的样子。假设有50个人同时下载,那么每个人的速度大概是200多K/s,下载体验不错。

所以当同时下载人数超过50人的时候nginx就给请求跳转到其他机子,或者是CDN。

不知道这个思路是否合理、可行?

如果可行,那么同时下载人数用ngx_status种的哪个数值呢?是Active connections,还是Writing数?

而这些变量可以在ngx_lua脚本中直接读出来吗?或者用内部请求去获取变量?

期待各位大牛解答。。

G_will

unread,
May 27, 2012, 2:03:12 AM5/27/12
to open...@googlegroups.com
大家帮忙看一下吧。确实很想知道是否可行。

刘太华

unread,
May 27, 2012, 3:36:52 AM5/27/12
to open...@googlegroups.com
后面说得方案,已经是可以从req limit角度做到了。ngx 有现成的req limit和conn limit模块,超过部分用error_page内部跳转,然后302到cdn,这样应该可行.
刘太华


liseen

unread,
May 29, 2012, 10:14:58 PM5/29/12
to open...@googlegroups.com
Hi, all

2012/5/27 刘太华 <def...@gmail.com>

后面说得方案,已经是可以从req limit角度做到了。ngx 有现成的req limit和conn limit模块,超过部分用error_page内部跳转,然后302到cdn,这样应该可行.

我觉得这个是正解, 呵呵

G_will

unread,
May 29, 2012, 11:29:18 PM5/29/12
to open...@googlegroups.com
在 2012年5月30日 上午10:14,liseen <lisee...@gmail.com>写道:
Hi, all

2012/5/27 刘太华 <def...@gmail.com>
后面说得方案,已经是可以从req limit角度做到了。ngx 有现成的req limit和conn limit模块,超过部分用error_page内部跳转,然后302到cdn,这样应该可行.

我觉得这个是正解, 呵呵

嗯,准备去实现了,就是让nginx获取实时网速不是很容易,现在是用python脚本去读snmp,算出网速,然写到redis里,nginx里用这个值做判断。

再配合limit_rate限速。这样就达到目标了。

Zoom.Quiet

unread,
May 29, 2012, 11:49:24 PM5/29/12
to open...@googlegroups.com
在 2012年5月30日 上午11:29,G_will <gwill...@gmail.com> 写道:
> 在 2012年5月30日 上午10:14,liseen <lisee...@gmail.com>写道:
>> 2012/5/27 刘太华 <def...@gmail.com>
>>>
>>> 后面说得方案,已经是可以从req limit角度做到了。ngx 有现成的req limit和conn
>>> limit模块,超过部分用error_page内部跳转,然后302到cdn,这样应该可行.
>>
>>
>> 我觉得这个是正解, 呵呵
>
>
> 嗯,准备去实现了,就是让nginx获取实时网速不是很容易,现在是用python脚本去读snmp,算出网速,然写到redis里,nginx里用这个值做判断。
>
> 再配合limit_rate限速。这样就达到目标了。
>

参考: Nginx简单的防盗链和带宽限制 | Jansfer - 长风破浪会有时,直挂云帆济沧海
http://www.82cs.com/201012/07/nginx-simple-anti-hotlinking-and-bandwidth-constraints/
等等吧,识别带宽的方法,其实不少,只是如何可以简洁的作到,不简易,,


--
人生苦短, Pythonic! 冗余不做,日子甭过!备份不做,十恶不赦!
俺: http://about.me/zoom.quiet
文字协议: http://creativecommons.org/licenses/by-sa/2.5/cn/

Reply all
Reply to author
Forward
0 new messages