这两天刚好在做上传文件的功能,趁机系统地整理一下nginx的upload模块。
一、upload模块的工作原理
upload模块通过nginx server来接受用户上传的文件,解析请求体中的文件并将其存放在upload_store指定的路径下。之后,从请求体中解析出文件信息,并按照nginx.conf中的upload模块的配置对请求信息进行一些处理,然后传递给upload_pass指定的段处理。
处理过程如下:
1、用户提交表单;
2、浏览器将文件和文件信息作为请求的一部分发送给服务器;
3、服务器将该请求定位到upload模块;
4、将文件暂存在upload_store指定的路径下;
5、文件信息经过处理传送给upload_pass指定的段;
6、对文件进行处理,拷贝到永久存储位置;
安装编译方法(我没试过,因为环境是配置好的,记录下)
1.下载
wget http://www.grid.net.ru/nginx/download/nginx_upload_module-2.2.0.tar.gz
2、2.编译(在NGINX编译目录执行以下命令, 其中 --add-module=你下载解压的上传插件目录)
./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_s
sl_module --with-http_gzip_static_module --add-module=/data/downfile/nginx_upload_module-2.2.0
二.nginx upload module配置参数
upload_pass 指明后续处理的后端逻辑。文件中的字段将被分离和取代,包含必要的信息处理上传文件。
upload_resumable 是否启动可恢复上传。
upload_store 指定上传文件存放地址(目录)。目录可以散列,在这种情况下,在nginx启动前,所有的子目录必须存在。
upload_state_store 指定保存上传文件可恢复上传的文件状态信息目录。目录可以散列,在这种情况下,在nginx启动前,所有的子目录必须存在。
upload_store_access 上传文件的访问权限,user:r是指用户可读
upload_pass_form_field 从表单原样转到后端的参数,可以正则表达式表示。:
$upload_field_name — 原始文件中的字段的名称
upload_pass_form_field “^submit”;
意思是把submit,description这两个字段也原样通过upload_pass传递到后端php处理。如果希望把所有的表单字段都传给后端可以用upload_pass_form_field “^.*$”;
upload_set_form_field 名称和值都可能包含以下特殊变量:
$upload_field_name 表单的name值
$upload_content_type 上传文件的类型
$upload_file_name 客户端上传的原始文件名称
$upload_tmp_path 文件上传后保存在服务端的位置
upload_aggregate_form_field 可以多使用的几个变量,文件接收完毕后生成的并传递到后端
$upload_file_md5 文件的MD5校验值
$upload_file_md5_uc 大写字母表示的MD5校验值
$upload_file_sha1 文件的SHA1校验值
$upload_file_sha1_uc 大写字母表示的SHA1校验值
$upload_file_crc32 16进制表示的文件CRC32值
$upload_file_size 文件大小
$upload_file_number 请求体中的文件序号
这些字段值是在文件成功上传后计算的。
upload_cleanup 如果出现400 404 499 500-505之类的错误,则删除上传的文件
upload_buffer_size 上传缓冲区大小
upload_max_part_header_len 指定头部分最大长度字节。
upload_max_file_size 指定上传文件最大大小,软限制。client_max_body_size硬限制。
upload_limit_rate 上传限速,如果设置为0则表示不限制。
upload_max_output_body_len 超过这个大小,将报403错(Request entity too large)。
upload_tame_arrays 指定文件字段名的方括号是否删除
upload_pass_args 是否转发参数。