文档章节

文件上传从tornado迁移到nginx upload module

flyking
 flyking
发布于 2014/12/21 12:34
字数 895
阅读 970
收藏 1

行业解决方案、产品招募中!想赚钱就来传!>>>

工作中几个场景涉及到文件上传,原来的解决方案是由tornado直接处理带文件(multipart-form)的http请求,但是文件有些文件过大,超过100M,再由tornado来处理有些不合适,stackoverflow有评论指出tornado把文件读到一个StringIO中,这样是有风险的,另外tornado只用来处理大文件上传也不是一个优雅的做法,这种事情还是有nginx来做的好,所以文件上传迁移到nginx upload module。

nginx upload 模块的安装

下载nginx upload module,截止到1月27,建议下载github上2.2分支的源码,我从其官网下载2.2.0版本源码编译时有问题,直接从github拖代码下来编译正常。

找到原来nginx所在路径,比如/usr/local/nginx,查看当前安装的编译参数:/usr/local/nginx/sbin/nginx -V,然后进入nginx源码目录,执行configure,除了加上已有的参数外,再加上:

--add-module=/path/to/upload/module

然后执行make && make install完成安装。

nginx upload module 配置

再nginx配置文件的server节点增加如下配置,假设http://hostname/upload地址用户文件上传。

location /upload {
    upload_pass /api/upload;
    upload_cleanup 400 404 499 500-505;
    upload_store /tmp/upload_tmp;
    upload_store_access user:r;
    upload_limit_rate 0;
    upload_set_form_field "file_name" $upload_file_name;
    upload_set_form_field "content_type" $upload_content_type;
    upload_set_form_field "tmp_path" $upload_tmp_path;
    upload_aggregate_form_field "md5" $upload_file_md5;
    upload_aggregate_form_field "size" $upload_file_size;
    upload_pass_form_field "^.*$";
}

基本配置如下:

upload_pass 指明了需要后续处理的php/tornado地址

upload_cleanup 如果php出现400 404 499 500-505之类的错误,则删除上传的文件

upload_store 上传文件存放地址

upload_store_access 上传文件的访问权限,user:r是指用户可读

upload_limit_rate 上传限速,如果设置为0则表示不限制

upload_set_form_field 设定额外的表单字段。这里有几个可用的变量:

$upload_file_name 文件原始名字

$upload_field_name 表单的name值

$upload_content_type 文件的类型

$upload_tmp_path 文件上传后的地址

upload_aggregate_form_field 额外的变量,在上传成功后生成

$upload_file_md5 文件的MD5校验值

$upload_file_size 文件大小

upload_pass_form_field 从表单原样转到后端的参数,可以正则表达式表示。官方的例子是upload_pass_form_field "^submit$|^description$";意思是把submit,description这两个字段也原样通过upload_pass传递到后端php处理。如果希望把所有的表单字段都传给后端可以用upload_pass_form_field "^.*$";

可以看到,我们上传文件存储到临时目录后nginx立即会向后面的tornado服务的/api/upload发起一个表单请求,其中有五个表单项:

  • file_name 上传的文件名
  • content_type 文件的MIME类型
  • tmp_path 临时文件目录
  • md5 文件的md5值
  • size 文件大小

这时就已经可以在tornado中对文件进行处理了。

tornado对文件的后续处理

代码如下:

def upload(self):
    file_name = self.get_argument("file_name")
    tmp_path = self.get_argument("tmp_path")
    do_some_thing(tmp_path)
    self.finish("file uploaded!")

几个注意事项

  1. 最好从github上的2.2分支直接拉代码下来进行编译,如果采用官网给的2.2下载编译可能会有问题;
  2. nginx中的location配置项的地址不要和里面的upload_pass项相同,否则tornado不会收到请求。

-------------------2015-02-01-------------------

http://www.grid.net.ru/nginx/upload.en.html

How to use

Download sources from one of the links above. Unpack the archive:

tar xvzf nginx_upload_module-2.2.0.tar.gz

Configure nginx with additional module:

For nginx versions other than 0.7.44-51:
cd <path to nginx sources>
./configure --add-module=<path to upload module sources>
make
make install
For nginx versions 0.7.44-51:
cd <path to nginx sources>
CFLAGS="-Dnginx_version=7052" ./configure --add-module=<path to upload module sources>
make
make install

flyking
粉丝 65
博文 229
码字总数 85959
作品 0
东城
程序员
私信 提问
加载中
请先登录后再评论。
记一次失败的Perl + Nginx + FastCGI 配置过程

这两天心血来潮,不知道为什么和 Perl + Nginx + FastCGI 配置 耗上了。但是失败了,记录如下: 1)安装Nginx 1.4.3 ,我的是WINDOWS 7 系统,修改配置文件如下: location ~ .(pl|cgi|perl)?...

通吃岛-低手哥
2013/10/27
1.6K
7
用vertx实现高吞吐量的站点计数器

工具:vertx,redis,mongodb,log4j 源代码地址:https://github.com/jianglibo/visitrank 先看架构图: 如果你不熟悉vertx,请先google一下。我这里将vertx当作一个容器,上面所有的圆圈要...

jianglibo
2014/04/03
4.1K
3
基于 ThinkPHP 的内容管理系统--歪酷CMS

歪酷网站管理系统(歪酷CMS)是一款基于THINKPHP框架开发的PHP+MYSQL网站建站程序,本程序实现了文章和栏目的批量动态管理,支持栏目无限分类,实现多管理员管理,程序辅助功能也基本实现了常见的文...

鲁大在线
2013/02/19
7K
1
Web 的 SSH 控制台--KeyBox

KeyBox 是一个基于 Web 的 SSH 控制台,用于同步管理多个系统并且可执行远程命令。允许你共享终端命令并上传文件到所有系统。但连接会话打开时你可选择在其中一个终端或者多个终端上执行命令...

匿名
2013/02/28
8.3K
0
Steam Installer for Wheezy

Linux游戏最近因为Valve旗下Steam平台的支持而获得快速增长。最初Steam只承诺支持最流行的桌面发行版Ubuntu,但最近它已向其它流行发行版开放了大门。但如果你使用的是不那么流行的发行版呢?...

匿名
2013/03/06
862
0

没有更多内容

加载失败,请刷新页面

加载更多

禁用win10无用服务,提高Win10系统游戏性能!

长按二维码关注网络杀手 分享有态度的最好应用 分享干货满的学习教程 网络杀手 公众号的发展离不开大家的支持,非常感谢各位的关注!小编以后会继续努力加油,为大家分享更多更好的教程和应用...

whiteshds
今天
5
0
聊聊dubbo-go的forkingCluster

序 本文主要研究一下dubbo-go的forkingCluster forkingCluster dubbo-go-v1.4.2/cluster/cluster_impl/forking_cluster.go type forkingCluster struct{}const forking = "forking"func......

go4it
今天
13
0
如何在Vim中进行不区分大小写的搜索 - How to do case insensitive search in Vim

问题: I'd like to search for an upper case word, for example COPYRIGHT in a file. 我想搜索大写单词,例如文件中的COPYRIGHT。 I tried performing a search like: 我尝试过执行搜索:......

富含淀粉
今天
17
0
Flutter+FaaS一体化任务编排的思考与设计

简介: 闲鱼flutter faas一体化提升研发体验+研发质量 作者:闲鱼技术-古风 Flutter+Serverless三端一体研发架构,客户端不仅仅是编写双端的代码,而是扩展了客户端的工作边界,形成完整的业...

一肥仔
今天
21
0
lodash和下划线之间的差异[关闭] - Differences between lodash and underscore [closed]

问题: Why would someone prefer either the lodash.js or underscore.js utility library over the other? 为什么有人更喜欢lodash.js或underscore.js实用程序库而不是另一个? Lodash see......

fyin1314
今天
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部