blog mail me! feed

在写tuna前的一点架构思考.

  1. 需要断点续传吗?
    断点续传需要HTTP服务器的支持, 之前是est大神实现的s1完成的对PUT协议的支持.
    client可以通过Google Gears, 不过服务器端还有很多可以考虑的地方.

    首先, 如何识别一个需要resume的upload request呢?
    我想用cookie应该是比较好的方法, 每次用户提出一个上传请求, 就建立一个cookie, 上传完成后删除此cookie.
    这样避免了在最初的demo中, 使用随机的nonce带来的关闭浏览器就无法继续的bug.

  2. 如何实现?
    我想把判断abortive的上传的部分交给前台和cookie去做, 而不是在nginx内部实现.
    否则不仅仅会使得开发效率降低, 而且还得额外引入SQLite的代码, 有些古怪.

    nginx的module应该是只负责处理PUT请求就可以了, 如果发现一个不存在的续传请求,
    简单的抛出 400 Bad Request就ok.

  3. 目标?
    tuna的目标是实现一个类似rapidshare这种下载站, 每个文件有一个默认的expiration,
    下载可以推迟这个deadline.

    下载被理解为一个dormforce id所发起的一个成功的GET行为.
    一个dormforce id在不同IP产生的多次request均计算为一次.

  4. 架构?
    准备采用nginx + php-fpm + php + mysql 实现, 因为是服务器上已经有的生产环境.

    从209的那块新的SCSI硬盘上再单独划出一个逻辑卷做repository,
    这样管理起来灵活方便些.

    nginx 挂上 upload module 和 accesskey module, 用作大文件上传的hash, 和防盗链的控制.
    下载的时候用php通过X-SendFile提供访问控制和请求转发.
    因为upload module把文件的文件名都命名为了数字格式, 没有extension,
    所以需要php提供Content-Type和Content-Disposition头.

    防盗链这块, 用referer做第一级的过滤.
    第二级用accesskey, 使用在GET参数里的nonce值, 请求文件, IP做一个MD5的accesskey保证这个地址在一个时间戳上, 对应一个文件和一个IP是唯一的.
    第三级在php这里, 判断这个做nonce值的timestamp是否已经过期(比如300s), 如果okay则放行.

整体上应该大体就是这样.
唯一需要更改的地方就是让nginx的upload module支持PUT协议和续传.
中间需要改的地方还需要仔细看下.

est said,

April 8, 2009 @ 1:01 pm

其实django基于WSGI可以直接实现了。得到HTTP请求头就可以异步读取HTTP的body了。

killkeeper said,

April 8, 2009 @ 1:41 pm

每次说学django最后又放弃了。主要nginx负载能力挺强的,配置也很方便。顺便想写点c…

RSS feed for comments on this post · TrackBack URI

Leave a Comment