[转帖]nginx上传模块—nginx upload module-

nginx,上传,模块,upload,module · 浏览次数 : 0

小编点评

**上传界面#** ```
``` **upload_pass处理内容#** ``` cat test.php ``` **测试http://192.168.41.129/upload.html输出内容如下所示:** ``` Array([ file1_name] => Learning Perl, Sixth Edition.pdf[file1_content_type] => application/pdf[file1_path] => /www/web/upload/tmp/4/0000000014[file1_md5] => 87032cc58109f5c6bb866d2684f9b48c[file1_size] => 8927511[file2_name] => Programming Perl, 4th Edition.pdf[file2_content_type] => application/pdf[file2_path] => /www/web/upload/tmp/5/0000000015[file2_md5] => 82a52df177a8912c06af276581cfd5e4[file2_size] => 21146356[submit] => Upload) ``` **注意:**需要修改php.ini以下参数file_uploads on 是否允许通过http上传upload_max_filesize 8m 允许上传文件的最大大小post_max_size 8m 通过表单POST给php所能接收的最大值另外nginx.conf中设置上传文件大小upload_max_file_size 软限制client_max_body_size 硬限制 分类: nginx。归纳总结以上内容,生成内容时需要带简单的排版

正文

https://www.cnblogs.com/lidabo/p/4171515.html

 

一. nginx upload module原理

官方文档: http://www.grid.net.ru/nginx/upload.en.html

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指令处理。

具体的过程如下:

1. 用户访问能够选择上传文件的页面

2. 用户提交表单

3. 浏览器把文件和有关文件的信息作为请求的一部分发送给服务器

4. 服务器把文件保存到临时存储目录下upload_store

5. upload_pass指定的处理表单提交的php页面将文件从upload_store拷贝到持久存储位置

 

P.S.

安装编译方法

1.下载

1
wget http://www.grid.net.ru/nginx/download/nginx_upload_module-2.2.0.tar.gz

 

2.编译(在NGINX编译目录执行以下命令, 其中 --add-module=你下载解压的上传插件目录)

 

1
2
./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 指明后续处理的php地址。文件中的字段将被分离和取代,包含必要的信息处理上传文件。

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$|^description$”;

意思是把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 是否转发参数。

 

三. nginx配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#wget http: //www.nginx.org/download/nginx-1.2.2.tar.gz
#wget http: //www.grid.net.ru/nginx/download/nginx_upload_module-2.2.0.tar.gz
#tar zxvf nginx_upload_module - 2.2.0.tar.gz - c.. / software /
#tar zxvf nginx_upload_module - 2.2.0.tar.gz - C.. / software /
#. / configure–prefix = /usr/local / nginx–add - module = .. / nginx_upload_module - 2.2.0–with - http_secure_link_module
#make
#make install  #vi nginx.conf
user www - data;
worker_processes 20;
error_log logs / error.log notice;
working_directory / usr / local / nginx;  events {
worker_connections 1024;
}  http {
include mime.types;
default_type application / octet - stream;
root / www / web / upload;
server {
listen 80;
server_name 192.168.41.129;
error_page 405 = 200@405; //处理405错误
 location / {
index index.html index.htm index.php;
}
location@405 {
root / www / web / upload;
}  location~\.php$ {
try_files $uri / 404.html;
fastcgi_pass 127.0.0.1 : 9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}  client_max_body_size 100m; #上传页面提交到这个location  location / upload {
#文件上传以后转交给后端的php代码处理
upload_pass@test;
#上传文件的临时存储位置,目录是散列的,应该存在子目录0 1 2 3 4 5 6 7 8 9
upload_store /www/web/upload/tmp 1;
upload_store_access user: r;
#设置请求体的字段  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;
# 指示后端关于上传文件的md5值和文件大小
upload_aggregate_form_field "${upload_field_name}_md5"$upload_file_md5;
upload_aggregate_form_field "${upload_field_name}_size"$upload_file_size;
# 指示原样转到后端的参数,可以用正则表达式表示
upload_pass_form_field "^submit$|^description$";
upload_pass_args on;
#将请求转到后端的地址处理
location@test {
rewrite ^ (. * ) $ / test.php last;
}
}
}

 

 

四. 上传界面

# cat /www/web/upload/upload.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<html>  
<head>  
<title>Test upload</title>  
</head>  
<body>  
<h2>Select files to upload</h2>  
<form enctype=”multipart/form-data” action=”/upload” method=”post”>  
<input type=”file” name=”file1″><br>  
<input type=”file” name=”file2″><br>  
<input type=”file” name=”file3″><br>  
<input type=”file” name=”file4″><br>  
<input type=”file” name=”file5″><br>  
<input type=”file” name=”file6″><br>  
<input type=”submit” name=”submit” value=”Upload”>  
<input type=”hidden” name=”test” value=”value”>  
</form>  
</body>  
</html>

 

五. upload_pass处理内容

# cat test.php //这里只是简单的打印出来,便于先理解上传原理。请对着输出内容理解下nginx upload module配置参数。

<?php

print_r($_POST);

?>

对上传文件的处理请参考:http://cn.php.net/manual/en/features.file-upload.php

六. 测试

http://192.168.41.129/upload.html

输出内容如下所示:

Array

(

[file1_name] => Learning Perl, Sixth Edition.pdf

[file1_content_type] => application/pdf

[file1_path] => /www/web/upload/tmp/4/0000000014

[file1_md5] => 87032cc58109f5c6bb866d2684f9b48c

[file1_size] => 8927511

[file2_name] => Programming Perl, 4th Edition.pdf

[file2_content_type] => application/pdf

[file2_path] => /www/web/upload/tmp/5/0000000015

[file2_md5] => 82a52df177a8912c06af276581cfd5e4

[file2_size] => 21146356

[submit] => Upload

)

注意:需要修改php.ini以下参数

file_uploads on 是否允许通过http上传

upload_max_filesize 8m 允许上传文件的最大大小

post_max_size 8m 通过表单POST给php所能接收的最大值

另外nginx.conf中设置上传文件大小

upload_max_file_size 软限制

client_max_body_size 硬限制

 
分类: nginx

与[转帖]nginx上传模块—nginx upload module-相似的内容:

[转帖]nginx上传模块—nginx upload module-

https://www.cnblogs.com/lidabo/p/4171515.html 一. nginx upload module原理 官方文档: http://www.grid.net.ru/nginx/upload.en.html Nginx upload module通过nginx服务来

[转帖]Nginx(3):上手Nginx,从配置文件开始

https://cloud.tencent.com/developer/article/1886147?areaSource=&traceId= 其实吧,我配置 tcp 负载均衡的时候也就弄了一下配置文件,也没了解太多的东西。 文章目录 组成部分 main 全局配置 events模块 stream

[转帖]记一次压测引起的nginx负载均衡性能调优

https://xiaorui.cc/archives/3495 这边有个性能要求极高的api要上线,这个服务端是golang http模块实现的。在上线之前我们理所当然的要做压力测试。起初是 “小白同学” 起头进行压力测试,但当我看到那压力测试的结果时,我也是逗乐了。 现象是,直接访问Golang

[转帖]专注于GOLANG、PYTHON、DB、CLUSTER 记一次压测引起的nginx负载均衡性能调优

https://xiaorui.cc/archives/3495 rfyiamcool2016年6月26日 0 Comments 这边有个性能要求极高的api要上线,这个服务端是golang http模块实现的。在上线之前我们理所当然的要做压力测试。起初是 “小白同学” 起头进行压力测试,但当我看到

[转帖]Nginx系列之nginx四层反向代理

https://cloud.tencent.com/developer/article/2013908 上集说到nginx的http七层代理,其实它工作在OSI七层模型的应用层。由于其可以解析http协议,我们可以根据URI进行请求的分发,具有很大的灵活性,但是协议的解析存在性能的消耗。为了能获取更

[转帖]Nginx上传文件大小限制(请求报文过大)413 Request Entity Too Large

在nginx使用过程中,上传文件的过程中,通常需要设置nginx报文大小限制。避免出现413 Request Entity Too Large。 于是奇葩的问题被我们遇到了,详细配置请参考下面。我们的问题是,无论client_max_body_size设置在哪里,nginx -s reload后,依

[转帖]Nginx之ngx_http_realip_module

https://www.jianshu.com/p/80a779b3bf20 问题描述 今日在线上查询nginx日志文件的用户真实IP时,发现remote_addr和XFF地址一模一样,这点让我很是不理解,正常来讲remote_addr应该获取到的是上一个节点转发的IP地址,我们却是获得了用户的真实

[转帖]k8s nginx-ingress上的配置优化

https://cloud.tencent.com/developer/article/1932188?areaSource=&traceId= 自建K8s上,如果部署了Nginx-Ingress,通常一些默认的参数有些可能需要优化下以便提升它的性能(阿里云之类的云厂商提供的Ingress是优化过的

[转帖]nginx的proxy_next_upstream使用中的一个坑

https://zhuanlan.zhihu.com/p/35803906 今天线上系统出了点问题,机房的电信出口突然不通了,原本以为能自动切换的nginx配置,居然没有生效,导致了业务告警,手工紧急处理了才解决了。 当时的设想是,如果这个服务的访问,出现了500或者超时的情况,会自动重试到下一个服

[转帖]Nginx应用调优案例

https://bbs.huaweicloud.com/blogs/146367 【摘要】 1 问题背景nginx的应用程序移植到TaiShan服务器上,发现业务吞吐量没有达到硬件预期,需要做相应调优。 2 原因分析l 网卡配置该应用场景下网络吞吐量大,网卡的配置能对性能提升起到很大的作用。l 操作