I am LAZY bones ? all linux

nginx 对某些 User_Agent 进行限速的方法

本文为nginx 禁止某个 User_Agent 的方法的姊妹篇,不知所云的话,建议先看看这文。
由于之前已经将某个特别疯狂的迅雷的User_Agent给封掉了,所以最近一段时间,我的那源服务器也运行地比较稳定,但是今天,Linux Deepin 9.12正式发布了,由于我给Deepin做了一个iso的镜像,所以服务器又经历了一个访问高峰,如下图:

从这里也可以看出Linux Deepin的受欢迎程度,哈哈。
可以看到从11:00以后,100M的带宽就已经被完全撑满了。。。一看日志,大部分又是迅雷干的,但这次迅雷不是用某个特定的UA来访问了,而是各有变化,但是却都包含MSIE,哈哈。
当然IE用户直接访问的话,也会有这个MSIE,但是没办法,为了保全Ubuntu APT-HTTP的合法权益,只能限制一下MSIE了。
但是怎么限制呢?总不能人家用MSIE的连主页面都打不开吧?哈哈,最好的办法就是限速,于是,有了这个配置:

server {
        listen   80;
        server_name  ubuntu.srt.cn;
        access_log  /var/log/nginx/mirror.access.log;
        location / {
                root   /data/mirrors;
                autoindex on;
                index  index.html index.htm;
                if ($http_user_agent ~ "MSIE") {
                        limit_rate 2k;
                }
                if ($http_user_agent ~ "Mozilla/4.0\ \(compatible;\ MSIE\ 6.0;\ Windows\ NT\ 5.1;\ SV1;\ .NET\ CLR\ 1.1.4322;\ .NET\ CLR\ 2.0.50727\)") {
                        return 404;
                }
        }
 
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
                root   /var/www/nginx-default;
        }
}

让我们邪恶的看一下效果,哈哈:
wget的默认UA的时候:

$ wget --no-cache http://u.srt.cn/ubuntu/ls-lR.gz -O /dev/null
--14:08:28--  http://u.srt.cn/ubuntu/ls-lR.gz
           => `/dev/null'
正在解析主机 u.srt.cn... 211.155.227.167
Connecting to u.srt.cn|211.155.227.167|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:8,051,367 (7.7M) [text/plain]
 
100%[====================================>] 8,051,367      6.34M/s             
 
14:08:29 (6.33 MB/s) - `/dev/null' saved [8051367/8051367]

UA里含有MSIE的时候:

$ wget --no-cache --user-agent="Something with MSIE; bla bla" http://u.srt.cn/ubuntu/ls-lR.gz -O /dev/null
--14:07:59--  http://u.srt.cn/ubuntu/ls-lR.gz
           => `/dev/null'
正在解析主机 u.srt.cn... 211.155.227.167
Connecting to u.srt.cn|211.155.227.167|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:8,051,367 (7.7M) [text/plain]
 
 0% [                                     ] 49,152         2.08K/s  ETA 1:02:38

某个该死的特定UA:

$ wget --no-cache --user-agent="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)" http://u.srt.cn/ubuntu/ls-lR.gz -O /dev/null
--14:09:22--  http://u.srt.cn/ubuntu/ls-lR.gz
           => `/dev/null'
正在解析主机 u.srt.cn... 211.155.227.167
Connecting to u.srt.cn|211.155.227.167|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 404 Not Found
14:09:22 错误 404:Not Found。

从上图也可以看到,做了这个设置以后,从14:00左右开始,服务器的流量虽然还是比较大,但是已经趋于正常了。
所以,偶尔要从我源里下东西的同学,可以用firefox直接下载,也可以用axel或者wget之类的工具下,但是千万别用IE相关的工具,不然,后果自负,哈哈~

最后修改时间: 2009年12月30日 16:55

本文章发表于: 2009年12月30日 16:52 | 所属分类:经验技巧. | 您可以在此订阅本文章的所有评论. | 您也可以发表评论, 或从您的网站trackback.

15 个评论 关于: “nginx 对某些 User_Agent 进行限速的方法”

  1. yegle 在 2009年12月30日 16:56 说:回复

    我发现nginx的配置真的很强大…
    不过也可能是因为我没学过apache的配置…

  2. Rei 在 2009年12月30日 17:06 说:回复

    nginx的配置文件好看。apache的一头雾水……

  3. xLight 在 2009年12月30日 18:01 说:回复

    太邪恶了。。。

  4. levon 在 2009年12月30日 18:07 说:回复

    这里真神奇,居然还有yegle
    貌似这里牛人很多啊
    骨头怎麼会说,订阅你的blog的人少呢

    • bones7456 在 2009年12月31日 08:40 说:回复

      呃。。。应该不多吧~呵呵~

  5. Tweets that mention I am LAZY bones ? : nginx 对某些 User_Agent 进行限速的方法 -- Topsy.com 在 2009年12月30日 21:33 说:回复

    […] This post was mentioned on Twitter by 骨头, corrie. corrie said: nginx 对某些 User_Agent 进行限速的方法 http://j.mp/6H00Tx […]

  6. 合金 在 2009年12月30日 22:22 说:回复

    Mozilla/4.0?why?

  7. xiooli 在 2009年12月31日 00:10 说:回复

    你那个叫啥主页哦, windows 的去你那里搀和个啥,直接把 windows 平台的浏览器都给禁止了吧。省的迅雷又搞什么花样。

    • bones7456 在 2009年12月31日 08:41 说:回复

      比如,有个windows的朋友,本来很有可能转到linux的,用IE打开我的地址,想下载个Deepin用,结果死活打不开,结果他继续windows了,那我不是罪过了吗?所以,还是不要太暴力,哈哈。

  8. wd 在 2009年12月31日 14:03 说:回复

    ua 应该不是很靠谱。之前看过一个文章说的就是 ua 这些事情,开始时 msie 标记,后来 firefox 出来,就加一个 mozilla 然后呢,也声明一下是 msie compatiable ,再后来就 etc ,那边个 ua 就越变越长。一些下载工具为了不被封掉,也就开始模仿这个 ua,尤其那些无得的下载工具。

    • bones7456 在 2009年12月31日 14:38 说:回复

      UA本来就不靠谱,你看我那wget都随便换UA,哈哈。
      不过,话说回来,那些无德的工具,基本上都是含有MSIE的,而APT-HTTP没有MSIE,而且我相信也没有哪个下载工具会为我这站点特意去修改UA,所以,我的目的也就达到了,是吧?

  9. yegle 在 2010年01月03日 00:23 说:回复

    在http context里不能用if?不能做全局限制了…

    • bones7456 在 2010年01月03日 13:48 说:回复

      放在 /etc/nginx/conf.d 里也不行吧?

  10. Druggo 在 2010年01月04日 17:04 说:回复

    灭了迅雷那个UA清净多了,哈哈

  11. Nginx: UserAgent based transfer rate limit | Planet Admon 在 2010年01月28日 12:13 说:回复

    […] that the User-Agent for a web client can be easiliy modified. The Chinese version for this post is available here, and if you have any issues, welcome to our webmaster forums, thanks! Share […]

发表评论