Nginx分时段限制下载速度解决方案(原创)_于堡舰_新浪博客

Nginx分时段限制下载速度解决方案(原创)
    (2011-03-02 16:40:49)
    转载▼
    标签:
    nginx流量限制
    下载线程
    下载速度
    限制访问量
    杂谈
        分类: Java技术

最近服务器下载有些问题,主要是下载的人数爆发性增长造成的,原来的方案是限制下载线程为2,限制下载速度为64KB,还是不想,毕竟公司的网站才有10兆,而且有分时段限制的需求,晚上的访问量相对较大,夜里访问量低,白天相对居中,毕竟面向的都是白天工作的人群.

首先利用nginx限制并发数和下载速度,在http中配置,因为java中的下载做了多线程断点下载,没法限制速度和线程数,很是麻烦就用nginx来限制,这也算是nginx+tomcat必须合作的原因之一吧.

http中配置

#限制客户端下载速度
        limit_zone one $binary_remote_addr 10m;
        limit_req_zone $binary_remote_addr zone=rone:10m rate=1r/s;
        sendfile on;
        sendfile_max_chunk 1m;

server中配置

#管理下载线程
        location = /jsp/public/download.jhtml {

limit_req zone=rone burst=10;    
        limit_conn one 4;

limit_rate 64k;

}

现在有了新的需求需要改动,利用下载的不同时间来控制下载速度,比如23~9点可以大量下 9~17点中量下 晚上就要地量,但是nginx的全局变量中没有时间变量只有Log里面有时间变量$request_time、$time_local等没办法,只能想其他办法,在网上找了半天看到有用的是ngx_http_secure_download_module但是我感觉有些麻烦都是需要访问后台的java然后返回可以参考

http://wiki.nginx.org/NginxHttpSecureDownload

http://caibaohua.com/index.php/archives/27

我用的方法是利用访问的网页来判断时间然后重定向给nginx然后判断是否需要限速

jsp页面大体代码如下

............

String rt = request.getParameter("rt");
    {
     //验证流量控制
     String url = "/public/download.jhtml?opt="+opt+"&target="+target;
     int hours = ego.utils.StringUtils.getIntValue((new java.text.SimpleDateFormat("HH",java.util.Locale.CHINESE)).format(new java.util.Date()));
     boolean download = true;
     if(hours<9 || hours>=22){
      //晚上10点~早晨9点人流最少,可以给足够的下载流量
      url+="&rt=h";
      if(rt==null || !"h".equals(rt)){
       download = false;
      }
     }else
     if(hours>=9 && hours < 18){
      //早晨9点~下午六点访问人一般,可以限制一定量
      url+="&rt=m";
      if(rt==null || !"m".equals(rt)){
       download = false;
      }
     }else{
      //其他时间段访问量大,严格控制流量
      url+="&rt=l";
      if(rt==null || !"l".equals(rt)){
       download = false;
      }
     }
     if(!download){
      //如果rt为空或者限制流量不正确重新加载
      response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
      response.addHeader("Location",url);
      return;
     }
    }

....................

Nginx中改变控制下载限速的配置如下

#管理下载线程
     location = /jsp/public/download.jhtml {
         #这里是限速,省得下载占用太多线程
         limit_req zone=rone burst=10;   
         limit_conn one 4;
         if ($query_string ~ \&rt\=h) {
          #单个线程最大下载速度,单位KB/s limit_rate_after  3m;
          limit_rate 32k;
         }
         if ($query_string ~ \&rt\=m) {
          limit_rate 8k;
         }
         if ($query_string ~ \&rt\=l) {
          limit_rate 4k;
         }
         #限制IE及迅雷用户
         #if ($http_user_agent ~ "MSIE") {limit_rate 10k;}

rewrite ^/jsp/(.*)$Snbsp; /$1 break;
         proxy_pass  http://127.0.0.1:82;
         proxy_set_header        Host            $host;
         proxy_set_header        X-Real-IP       $remote_addr;
         proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header        Request-URL     $scheme://$host$request_uri;
      }
     这样就可以在一定程度上解决分时段下载限速问题,服务器访问正常,当然这里面如果有比较大的文件可能出现跨多个时间段 ,需要在java下载代码中控制定量重连的方式解决. 到此,基本控制住了下载访问量

Nginx分时段限制下载速度解决方案(原创)_于堡舰_新浪博客的更多相关文章

  1. Canvas之动态波浪效果_陈在真Sunny_chen_新浪博客

    Canvas之动态波浪效果_陈在真Sunny_chen_新浪博客 Canvas之动态波浪效果 (2012-04-26 09:04:51) 转载▼

  2. python datetime模块strptime/strptime format常见格式命令_施罗德_新浪博客

    python datetime模块strptime/strptime format常见格式命令_施罗德_新浪博客     python datetime模块strptime/strptime form ...

  3. 关于Windows文件读写_暗涌_新浪博客

    关于Windows文件读写_暗涌_新浪博客     这几天在研究怎么才能加快windows文件读写速度,搜了很多文章,MSDN也看了不少.稍微给大家分享一下.     限制windows文件读写速度的 ...

  4. 基于samba实现win7与linux之间共享文件_阳仔_新浪博客

    基于samba实现win7与linux之间共享文件_阳仔_新浪博客 然后启动samba执行如下指令: /dev/init.d/smb start 至此完成全部配置.

  5. 2.2.2 胸腰差和胸臀差的应用_米人NOONE_新浪博客

    2.2.2  胸腰差和胸臀差的应用_米人NOONE_新浪博客 腰差和胸臀差的应用(2009-06-16 19:24:57)转载▼标签:校园         前面已经对这两个概念作了简单的讲解.这两个概 ...

  6. python中multiprocessing.pool函数介绍_正在拉磨_新浪博客

    python中multiprocessing.pool函数介绍_正在拉磨_新浪博客     python中multiprocessing.pool函数介绍    (2010-06-10 03:46:5 ...

  7. boost/lexical_cast.hpp的简单使用方法_行动_新浪博客

    boost/lexical_cast.hpp的简单使用方法_行动_新浪博客     boost/lexical_cast.hpp的简单使用方法    (2010-03-19 16:31:13)    ...

  8. 每周日与周四《红酒屋》探戈舞会"Wine Bar" Milonga_原生态拉丁_新浪博客

    每周日与周四<红酒屋>探戈舞会"Wine Bar" Milonga_原生态拉丁_新浪博客     每周日与周四<红酒屋>探戈舞会"Wine Bar ...

  9. linux下动态连接变为静态打包,使用statifier_S展翅飞_新浪博客

    linux下动态连接变为静态打包,使用statifier_S展翅飞_新浪博客 linux下动态连接变为静态打包,使用statifier (2013-04-27 14:38:19) 转载▼

随机推荐

  1. php的var关键字

    public和var的作用差不多 因为 var定义的变量如果没有加protected 或 private则默认为public php4 中一般是用 varphp5 中就一般是用 public了 现在基 ...

  2. 双绞线的制作,T568A线序,T568B线序

    双绞线的制作 1.1 实验目的 双绞线是组建局域网时常常使用的通信传输介质,通过本实验,让学生学会制作双绞线. 1.2 实验任务 (1)了解双绞线的特性及屏蔽与非屏蔽双绞线的区别. (2)了解EIA/ ...

  3. IT段子,娱乐一下

    1.我是个程序员,一天我坐在路边一边喝水一边苦苦检查bug.这时一个乞丐在我边上坐下了,开始要饭,我觉得可怜,就给了他1块钱,然后接着调试程序.他可能生意不好,就无聊的看看我在干什么,然后过了一会,他 ...

  4. 可执行程序的入口点在那里?(强化概念:程序真正的入口是mainCRTstartup)

    今天终于有时间来研究一下一个很大很大的工程编译成一个exe和若干dll后,程序是如果执行它的第一条指令的?操作系统以什么规则来找到应该执行的第一条指令(或说如何找到第一个入口函数的)? 我们以前写wi ...

  5. listbox多选实现上下移动 js版和服务器版

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="X200906021128.as ...

  6. poj 2299 逆序数

    http://poj.org/problem?id=2299 坑:答案是long long 输出……!!!!! 题意是:求一个数组进行冒泡排序交换的次数 题解:求逆序数 题解Ⅰ: 归并排序求逆序数 归 ...

  7. HTTP协议结构

    HTTP报文=从客户机到服务器的请求+从服务器到客户机的响应 1.请求报文的格式如下: 请求头   通用信息头    请求头    实体头    报文主体 请求行的格式为: Method[分隔符]Re ...

  8. Kendo UI开发教程(21): Kendo MVVM 数据绑定(十) Source

    Source绑定可以把ViewModel的值和由Kendo模板定义的目标元素绑定,如果ViewModel的值发生变化,被绑定的目标元素也随之发生变化.模板由属性data-template指定,它的值为 ...

  9. 逻辑与(&&、&)和逻辑或(||、|)

    这四个逻辑运算符,大家都知道,但是有时候会凌乱,这里用程序来解释一下,以免忘了.(根据大家反应说:这文章没有解释清楚它们的区别.用法,其实文章主要说的是,如果将这四个运算符用于条件判断,那么它们会是什 ...

  10. 怎样写Makefile文件(C语言部分)

    本文摘抄自"跟我一起写Makefile ",只是原文中我自己感觉比较精要的一部分,并且只针对C语言,使用GCC编译器. 原文请看这里:http://wiki.ubuntu.org. ...