Nginx支持http文件上传的配置

来源:互联网 发布:工资管理系统 数据库 编辑:程序博客网 时间:2024/05/17 23:21
一. 相关模块安装
查看Nginx是否安装了这两个模块(nginx_upload_module和nginx_uploadprogress_module),
使用命令:
$ nginx -V (注意是大写),可以
查看Nginx当时编译时候的参数,如果发现有上述两个模块,说明Nginx已经安装了这两个模块。
如果没有的话,就需要安装这两个Nginx模块。


1. 下载nginx_upload_modul
下载链接:
http://www.grid.net.ru/nginx/upload.en.html
$ wget http://www.grid.net.ru/nginx/download/nginx_upload_module-2.2.0.tar.gz
$ tar xvzf nginx_upload_module-2.2.0.tar.gz


2. 下载nginx_uploadprogress_module
网址:
http://wiki.nginx.org/HttpUploadProgressModule
下载链接:
https://github.com/masterzen/nginx-upload-progress-module/tree/master
$ unzip nginx-upload-progress-module-master.zip 


二、Nginx添加编译选项
由于这两个模块不在Nginx源代码中,需要重新编译Nginx,在编译选项中加上
--add-module=/模块源代码路径/nginx_upload_module-2.2.0 
--add-module=/模块源代码路径/nginx-upload-progress-module-maste 。 


$ make
$ make install


1. 编译时的错误提示
/opt/nginx_http_rtmp/nginx_upload_module-2.2.0/ngx_http_upload_module.c: In function 'ngx_http_read_upload_client_request_body':
/opt/nginx_http_rtmp/nginx_upload_module-2.2.0/ngx_http_upload_module.c:2628: error: 'ngx_http_request_body_t' has no member named 'to_write'
/opt/nginx_http_rtmp/nginx_upload_module-2.2.0/ngx_http_upload_module.c:2687: error: 'ngx_http_request_body_t' has no member named 'to_write'
/opt/nginx_http_rtmp/nginx_upload_module-2.2.0/ngx_http_upload_module.c: In function 'ngx_http_do_read_upload_client_request_body':
/opt/nginx_http_rtmp/nginx_upload_module-2.2.0/ngx_http_upload_module.c:2769: error: 'ngx_http_request_body_t' has no member named 'to_write'
/opt/nginx_http_rtmp/nginx_upload_module-2.2.0/ngx_http_upload_module.c:2785: error: 'ngx_http_request_body_t' has no member named 'to_write'
/opt/nginx_http_rtmp/nginx_upload_module-2.2.0/ngx_http_upload_module.c:2877: error: 'ngx_http_request_body_t' has no member named 'to_write'
make[1]: *** [objs/addon/nginx_upload_module-2.2.0/ngx_http_upload_module.o] Error 1
make[1]: Leaving directory `/opt/nginx_http_rtmp/nginx-1.6.0'
make: *** [build] Error 2
解决办法:




三、配置Nginx,实现上传模块来接收页面上传的文件。
把下面配置添加到Nginx的配置文件中,注意是加在server的上下文中。
        location = /upload {
                upload_pass     /service.php?path=uploadfile&a=upload_server;//表示Nginx接收完上传的文件后,然后交给后端处理的地址
                upload_cleanup 400 404 499 500-505; //表示当发生这些http status代码的情况下,会把上传的文件删除
                upload_store    /tmp/upload_tmp 1;//上传模块接收到的文件临时存放的路径, 1 表示方式,该方式是需要在/tmp/upload_tmp下创建以0到9为目录名称的目录,上传时候会进行一个散列处理。
                upload_store_access user:r; //指定访问模式
                upload_limit_rate 128k; //设定上传速度上限
                upload_set_form_field "${upload_field_name}_name" $upload_file_name; //设定后续脚本语言访问的变量,其中${upload_field_name}对照本例子就是addfile。比如后台PHP就可以通过$_POST['addfile_name']来获取上传文件的名称。
                upload_set_form_field "${upload_field_name}_content_type" $upload_content_type;//同上
                upload_set_form_field "${upload_field_name}_path" $upload_tmp_path;//由于在upload_store设置了临时文件存放根路径,该路径就是经过散裂后上传文件存在真实路径,比如后续处理可以根据这值把上传文件拷贝或者移动到指定的目录下。
                upload_pass_form_field "^.*$";//
                upload_pass_args on;// 打开开关,意思就是把前端脚本请求的参数会传给后端的脚本语言,比如:http://192.168.1.203:7100/upload/?k=23.PHP脚本可以通过$_POST['k']来访问。
        }


上述配置完了,就可以实现上传的功能了。
但是,要获取上传的进度,那还是需要配置另外一个模块nginx_uploadprogress_module。
其实,获取当前进度原理比较简单,就是通过javascript以异步方式定时给特定地址发送请求,
这个模块会以json格式返回上传的进度。配置比较简单。
1)、首先打开这个模块功能,在Nginx配置文件中http上下文里面,增加upload_progress proxied 5m;
     其中,proxied表示名称(zone_name官方文档),5m表示每次链接存放跟踪信息的大小。
     另外,再设置返回格式为json,upload_progress_json_output;
2)、在上述的location = /upload中增加一个配置项track_uploads proxied 30s; 
     其中,proxied就是刚才在第一步设置的名字,30s表示每次链接处理完毕后,链接会保持30s。
3)、设置一个location来处理javascript发送请求。
location ^~ /progress {
  report_uploads proxied;    #GET此地址得到上传进度
}
4)、还有一个参数考虑设置upload_progress_header ,这个值缺省是X-Progress-ID。
有点类似SessionID,主要用在前台需要在上传文件的时候需要设置这个参数值,比如设置为uuid值。
这样javascript每次发送请求要获取上传进度时候,都需要带上这个参数,
这样上传进度跟踪模块才知道是返回那个链接的进度。
经过这三步骤,就把上传进度跟踪模块配置好了。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果5s蓝屏死机怎么办 苹果6s突然黑屏怎么办? 苹果6s经常死机怎么办 苹果6s没有背光怎么办 苹果7白屏死机怎么办 苹果6p屏膜失灵怎么办 苹果7p屏幕卡死怎么办 苹果7p手机死机怎么办 苹果6s死机了怎么办啊 6s死机了关不了怎么办 爱疯7死机了怎么办 苹果11.4系统老死机怎么办 苹果6震动坏了怎么办 苹果6手机死机了怎么办 苹果x耗电太快怎么办 苹果6升级11.3卡怎么办 苹果6splus耗电快怎么办 苹果手机系统升级后反应慢怎么办 苹果8听筒声音小怎么办 苹果6s通话声音小怎么办 苹果手机通讯录丢失了怎么办 苹果换id通讯录没有了怎么办 华为p7 更新重启怎么办 打电话的图标没了怎么办 苹果手机wifi信号弱怎么办 没电脑想装wifi怎么办 阿巴町手表二维码丢了怎么办 儿童手表二维码丢了怎么办 电话手表二维码丢了怎么办 360儿童手表二维码丢了怎么办 喜书郎电话手表二维码丢了怎么办 微信充话费充错号码怎么办 话费冲到了副卡怎么办 冲话费冲错了怎么办 微信支付未到账怎么办 速卖通修补配件到国外怎么办 速卖通流量低怎么办 速卖通被判定重复铺货怎么办 拼多多商品降权怎么办 运满满有了差评怎么办 房贷款还清后该怎么办