nginx上传模块nginx_upload_module安装与使用教程

一.nginx_upload_module使用背景

利用nginx上传模块Nginx_upload_module可更有效实现大文件断点续传,还可安装nginx-upload-progress-module扩展显示文件上传进度。

二.nginx_upload_module工作原理

Nginx_upload_module通过nginx服务来接受用户上传的文件,自动解析请求体中存储的所有文件上传到upload_store指定的目录下。这些文件信息从原始请求体中分离并根据nginx.conf中的配置重新组装好上传参数,交由upload_pass指定的段处理,从而允许处理任意上传文件。每个上传文件中的file字段值被一系列的upload_set_form_field指令值替换。每个上传文件的内容可以从$upload_tmp_path变量读取,或者可以将文件转移到目的目录下。上传的文件移除可以通过upload_cleanup指令控制。如果请求的方法不是POST,模块将返回405错误(405 Not Allowed),该错误提示可以通过error_page指令处理。

三.nginx_upload_module安装过程

(1).检查是否安装nginx_upload_module模块
/usr/local/nginx/sbin/nginx -V

(2).下载nginx_upload_module
wget https://github.com/hongzhidao/nginx-upload-module/archive/master.zip
unzip master.zip

(3).进入nginx源码目录,重新编译安装nginx,并添加nginx_upload_module编译选项
--add-module=/模块源代码路径/nginx_upload_module

(4).配置nginx上传模块
在server的上下文中添加配置信息:
location /upload {
    upload_pass   /upload.php;#上传完成后端接受处理文件
    upload_store /data/uptmp;#上传文件夹
    upload_limit_rate 1024k;# 限制上传速度
    upload_set_form_field "${upload_field_name}_name" $upload_file_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_aggregate_form_field "${upload_field_name}_md5" $upload_file_md5;#md5
    upload_aggregate_form_field "${upload_field_name}_size" $upload_file_size;#文件大小
    upload_pass_form_field "^submit$|^description$";
    #如果希望把所有的表单字段都传给后端可以用upload_pass_form_field "^.*$";
}

四.nginx_upload_module配置参数(详情可见官方文档)
syntax: upload_pass <location>
default: none
severity: mandatory
context: server, location

指定传输请求到后端的服务器。文件字段将会被重新组织,包括处理文件的必要信息。

syntax: upload_resumable <on/off>
default: off
severity: mandatory
context: main, server, location

启用断点续传

syntax: upload_store <directory> [<level 1> [<level 2> ] ... ]
default: none
severity: mandatory
context: server, location

指定上传文件保存的目录。目录可以被散列化,启动nginx之前,所有的子目录都必须已经存在。

syntax: upload_state_store <directory> [<level 1> [<level 2> ] ... ]
default: none
severity: optional
context: server, location

指定断点续传文件所包含的状态文件的目录,目录可以被散列化,启动nginx之前,所有的子目录都必须已经存在。

syntax: upload_store_access <mode>
default: user:rw
severity: optional
context: server, location

指定上传文件的权限模式。

syntax: upload_set_form_field <name> <value>
default: none
severity: optional
context: server, location

在请求体中指定要生成的每个上传文件的表单字段,字段名和字段值可以包含在下列变量中。

$upload_field_name -- 源文件字段的名字
$upload_content_type -- 上传文件的Content-Type值
$upload_file_name -- 上传的源文件的文件名,文件名中的路径会被处理掉,比如路径 "D:\Documents And Settings\My Dcouments\My Pictures\Picture.jpg" 将会被转换为 "Picture.jpg" ,或者路径 "/etc/passwd" 将会被转换为 "passwd".
$upload_tmp_path -- 源文件的存储路径,输出的文件名由10个数字组成,使用的算法和proxy_temp_path 指定的路径算法一致。

这些变量只会在处理部分请求体的时候被校验,例如:

upload_set_form_field $upload_field_name.name "$upload_file_name";
upload_set_form_field $upload_field_name.content_type "$upload_content_type";
upload_set_form_field $upload_field_name.path "$upload_tmp_path";

syntax: upload_aggregate_form_field <name> <value>
default: none
severity: optional
context: server, location

指定表单的字段名和字段值, 字段名和字段值可以包含nginx标准的变量,变量由 upload_set_form_field 指定或者使用下面这些变量:

$upload_file_md5 -- MD5 checksum of the file
$upload_file_md5_uc -- MD5 checksum of the file in uppercase letters
$upload_file_sha1 -- SHA1 checksum of the file
$upload_file_sha1_uc -- SHA1 checksum of the file in uppercase letters
$upload_file_crc32 -- hexdecimal value of CRC32 of the file
$upload_file_size -- size of the file in bytes
$upload_file_number -- ordinal number of file in request body

上面指定的字段值只会在文件成功上传完毕后才会被计算,因此这些变量仅仅在最后一个请求体上传完毕后才会被校验。
警告: 变量 $upload_file_md5, $upload_file_md5_uc, $upload_file_sha1 和 $upload_file_sha1_uc 会耗用更多的资源来计算 MD5 和 SHA1 校验。

example:

upload_aggregate_form_field $upload_field_name.md5 "$upload_file_md5";
upload_aggregate_form_field $upload_field_name.size "$upload_file_size"; 

syntax: upload_pass_form_field <regex>
default: none
severity: optional
context: server, location

给字段名指定一个正则表达式,这将会被转发到后端服务器,每个指令都可以设置多个匹配模式。只要碰到了匹配的模式, 指令就会被立刻转发到后端服务器,如果是PCRE不能识别的模式,则会进行精确匹配字段名,匹配了则转发到后端服务器,如果指令被忽略,则不会转发到后端服务器。

例如:

upload_pass_form_field "^submit$|^description$";

PCRE-不能识别的情况:

upload_pass_form_field "submit";
upload_pass_form_field "description"; 

syntax: upload_cleanup <HTTP status/range> [<HTTP status/range>...]
default: none
severity: optional
context: server, location

指定当每一个文件都上传成功后的HTTP的状态,用于后端服务器失败后的清理,当后端服务器由于某种原因不需要上传文件时,后端服务器也可能会直接返回错误代码,HTTP的状态必须是一个数字,范围在400---599之间,可以指定一个破折号范围的状态。

例如:

upload_cleanup 400 404 499 500-505;

syntax: upload_buffer_size <size>
default: size of memory page in bytes
severity: optional
context: server, location

设置写缓冲区的尺寸,被用来累积文件数据,然后一次性写入硬盘。该值的使用是用来提高内存的使用效率和优化系统调用次数。

syntax: upload_max_part_header_len <size>
default: 512
severity: optional
context: server, location

指定头的最大长度,单位为bytes,该值被用来累积保存头的缓冲区大小。

syntax: upload_max_file_size <size>
default: off
severity: optional
context: main, server, location

指定文件的最大尺寸。 文件长度超过该值将会被忽略。该指令是一个软限制,当碰到文件长度超过指定的最大值时,nginx也会继续接收处理请求体。如果要让该值必须起作用,需要通过client_max_body_size的硬限制来设置。该值设置为0,代表没有任何限制。

syntax: upload_limit_rate <rate>
default: 0
severity: optional
context: main, server, location

指定上传速率,单位为bytes/秒,0代表速率无限制。

syntax: upload_max_output_body_len <size>
default: 100k
severity: optional
context: main, server, location

指定输出体的最大长度。这将会避免非文件表单数据占用内存。超过该值,将会返回413错误,代表请求体太大,该值为0,代表无限制。

syntax: upload_tame_arrays <on/off>
default: off
severity: optional
context: main, server, location

指定在字段名中的方刮号是否被丢弃 (需要 PHP 数组).。

syntax: upload_pass_args<on/off>
default: off
severity: optional
context: main, server, location

允许转发请求参数, 该参数由upload_pass指定  无效的命名位置,例如:

<form action="/upload?id=5">
...
location /upload {
    upload_pass /internal_upload;
    upload_pass_args on;
}
...
location /internal_upload {
    ...
    proxy_pass http://backend;
}

在这个例子中,后端服务器得到的请求地址为 "/upload?id=5". 该例子中,如果 upload_pass_args 设置为off ,则后端服务器得到的请求地址为 "/upload".

五.nginx_upload_module实现代码:
html代码:
<form method="post" enctype="multipart/form-data" action="/upload">
    <input type="file" name="myfile" />
    <input type="submit" />
</form>

PHP代码:
print_r($_POST);
 
if (rename($_POST['myfile_path'], $_POST['myfile_name'])) {
    echo 'ok';
}
 
/*
Array
(
    [myfile_name] => psb (2).jpg
    [myfile_content_type] => image/jpeg
    [myfile_path] => /data/uptmp/0000000012
    [myfile_md5] => 091fa303622a020dba0e57a5d36ca276
    [myfile_size] => 18364
)
*/

时间: 2024-08-01 09:45:30

nginx上传模块nginx_upload_module安装与使用教程的相关文章

解决nginx上传模块nginx_upload_module传递GET参数

解决nginx上传模块nginx_upload_module传递GET参数的方法总结   最近用户反映我们的系统只能上传50M大小的文件, 希望能够支持上传更大的文件. 很显然PHP无法轻易实现大文件上传, 因为会有各种各样的郁闷问题, 比如服务器超时等, 那么如何解决呢? 我想到了nginx_upload_module!!! 如何安装nginx_upload_module? 请看这里:nginx_upload_module安装使用教程 解决了大文件上传之后又遇到了新问题, 我们希望通过ngin

nginx上传模块nginx_upload_module和nginx_uploadprogress_module模块进度显示,如何传递GET参数等。

ownload:http://www.grid.net.ru/nginx/download/nginx_upload_module-2.2.0.tar.gzconfigure and make : ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module   --add-module=/data/software/lnmp1.

nginx上传模块—nginx upload module

nginx上传模块 一. nginx upload module原理 官方文档: http://www.grid.net.ru/nginx/upload.en.html Nginx upload module通过nginx服务来接受用户上传的文件,自动解析请求体中存储的所有文件上传到upload_store指定的目录下.这些文件信息从原始请求体中分离并根据nginx.conf中的配置重新组装好上传参数,交由upload_pass指定的段处理,从而允许处理任意上传文件.每个上传文件中的file字段

Nginx的Upload上传模块

前段时间做一个项目,需要上传文件,差不多需要20M左右,普通用php处理会比较麻烦,经常超时,而且大量占用资源.于是搜索了下,决定用nginx的upload上传模块来处理. 你可以在这里:http://www.grid.net.ru/nginx/upload.en.html 获取源码.下载以后需要重新编译nginx 1 2 3 ./configure –add-module=/usr/local/nginx_upload_module-* make make install 重启nginx即可以

服务器-nginx上传后的文件怎么合并?

问题描述 nginx上传后的文件怎么合并? 按照网上的做法,在下载了1.3.8以后的版本继承upload_module的时候安装了一个补丁文件,导致上传都是分片上传的,怎么合并? 解决方案 用现在最新稳定版本1.6.2试试呢

java编程小说上传-java语言编程小说的上传模块不会做了,请指点

问题描述 java语言编程小说的上传模块不会做了,请指点 用java语言在编程小说的上传功能出现了问题,还请问下一步咋搞? 解决方案 报错的是什么部分错误代码帖出来,上传可以找些io方面的看看 解决方案二: 错误的地方会有信息,可以看看 解决方案三: novel没定义,还是外面定义好了,没传参进来?

C# 通用文件上传模块该怎么写?想写个没思路

问题描述 最近要做个通用的上传模块把文件上传到服务器!但是上传服务器要服务的吧,一时之间没什么头绪.哪位大神能指点下啊小弟感激不尽啊 解决方案 本帖最后由 gongyq_627 于 2011-06-02 09:28:06 编辑解决方案二:但是上传服务器要服务的吧?不明白你的意思文件上传本没什么复杂的,想要比较好的效果可以考虑使用第三方插件,比如基于Jquery的js插件:Uploadify--解决方案三:usingSystem;usingSystem.Collections.Generic;us

《JavaScript设计模式》——第11章 牛郎织女——代理模式 11.1无法获取图片上传模块数据

第11章 牛郎织女--代理模式 代理模式(Proxy):由于一个对象不能直接引用另一个对象,所以需要通过代理对象在这两个对象之间起到中介的作用. 由于用户相册模块上传的照片量越来越大,导致服务器端需要将图片上传模块重新部署到另外一个域(可理解为另一台服务器)中,这样对于前端来说,用户上传图片的请求路径发生变化,指向其他服务器,这就导致跨域问题. 11.1 无法获取图片上传模块数据 "小铭,你帮我看看,为什么我向咱们图片上传模块所在的服务器发送的请求,得不到数据呢?"小白问小铭. //

Yii2组件之多图上传插件FileInput的详细使用教程_php实例

在前面给大家写个有关文件上传的文章,包括最基本的yii2文件上传.异步上传到又拍云以及百度编辑器图片上传的问题,貌似不说点多图上传的就不完美. 今天介绍一款多图上传的插件 FileInput,至于为什么选中了TA作为我们上传的插件,一来这货跟Yii2有一腿,用起来方便:二来嘛,用这个插件不仅添加的时候好操作,修改的时候也可以直接通过异步的方式将图片悄无声息的删掉:最值得一提的是,界面效果融合了bootstrap,清爽简洁美观,看起来舒服. 说重点,看具体步骤 首先还是先安装组件 复制代码 代码如