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


    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下载代码中控制定量重连的方式解决. 到此,基本控制住了下载访问量
  • 相关阅读:
    使用VSCode创建简单的Razor Webapp--1.入门
    ASP.NET Razor 常用示例
    ASP.NET Razor 语法
    ASP.NET Razor简介
    EF CodeFirst 一对一、一对多、多对多关系
    mysql外键
    EF CodeFirst 之 Fluent API
    替换JDK 对eclipse的影响?
    mysql数据库,安装 !创建!...详解!
    Apache的commons工具类
  • 原文地址:https://www.cnblogs.com/lexus/p/3288548.html
Copyright © 2020-2023  润新知