在ubuntu安装nginx还算是蛮容易的:sudo apt-get install nginx
一条命令就可以解决。
但是如果要使用上传模块就必须重新编译,这也就意味着原来使用apt-get安装的nginx需要卸载掉包括配置文件:
sudo apt-get autoremove --purge nginx
然后下载nginx上传所需要的模块:
下载源代码
1.下载上传模块和上传进度模块
cd
mkdir tmp && cd tmp
git clone -b 2.2 https://github.com/vkholodkov/nginx-upload-module.git
git clone https://github.com/masterzen/nginx-upload-progress-module.git
2.下载nginx的源码:
注意:这里用最新的1.12.0会报错(md5错误,没有解决),用1.10.x就可以
http://nginx.org/en/download.html
直接上上面那个网站下载后解压。
安装依赖:
sudo apt-get install libpcre3 libpcre3-dev
可能还需要
sudo apt-get install openssl libssl-dev
开始编译:
进入下载解压的nginx目录
sudo ./configure --add-module=/home/xxx/tmp/nginx-upload-module --add-module=/home/xxx/tmp/nginx-upload-progress-module
这里添加了两个模块,请对应自己下载的两个模块地址。
sudo make
make install
注意编译最后要加上:
可进行打包:(可忽略)
sudo apt-get install checkinstall #下载打包工具
sudo checkinstall -D -y -install=no -default make install
使用dpkg进行安装:
sudo dpkg -i nginx_1.4.6-1_amd64.deb
dpkg安装时可能会遇到这个问题
dpkg: error processing archive nginx_1.4.6-1_amd64.deb (--install):
trying to overwrite '/etc/nginx/win-utf', which is also in package nginx-common 1.10.0-0ubuntu0.16.04.4
Errors were encountered while processing:
nginx_1.4.6-1_amd64.deb
这样的话只要安装时加一个参数即可,这个做法会将之前的nginx覆盖:
sudo dpkg -i --force-overwrite nginx_1.4.6-1_amd64.deb
修改nginx
在配置nginx之前:
需要将其他服务器/etc/init.d/nginx 这个文件拷贝过来,因为编译安装的nginx并没有添加进service 启动较为麻烦:
考过来之后需要改的地方有:
在PATH最后添加/usr/local/nginx/sbin:
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/nginx/sbin:
DAEMON修改为:
DAEMON=/usr/local/nginx/sbin/nginx
NGINX_CONF_FILE修改
NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
修改nginx的权限:
sudo chmod 755 /etc/init.d/nginx
现在就可以重新启动nginx了
sudo /etc/init.d/nginx -s reload
配置nginx文件:
可以参照这里https://hui.lu/upload-file-with-nginx-upload-file/
location /upload {
65 upload_pass @test; # 后端处理文件的地址,此处地址不应和上面的/upload地址一样
66 upload_resumable on;
67 upload_cleanup 400 413 404 499 500-505;
68 upload_store /tmp 1;
69 upload_store_access user:rw all:rw;
70 # upload_limit_rate 0;
71 upload_set_form_field "file_name" $upload_file_name;
72 upload_set_form_field "content_type" $upload_content_type;
73 upload_set_form_field "tmp_path" $upload_tmp_path;
74 upload_aggregate_form_field "md5" $upload_file_md5;
75 upload_aggregate_form_field "size" $upload_file_size;
76 upload_pass_form_field "^.*$";
77 # upload_pass_args on; #打开开关,意思就是把前端脚本请求的参数会传给后端
78 # track_uploads proxied 30s; # 必须放最后一行
79 }
80 location @test {
81 proxy_pass http://localhost:8080;
82 }
使用upload module配置指令说明
upload_pass
文件上传结束后代理到的地址,同时将文件信息传递给此地址。
upload_resumble
是否开启续传,默认关闭
upload_store
上传文件的存放位置,文件存放路径被hash到子目录中,注意nginx不会自动创建子目录,必须使用前创建,否则会报错
upload_state_store
断点续传状态文件的存放位置,如果不配置,会与文件hash存放到一个目录下,名称为文件名.state,同上传目录一样,使用前必须创建子目录
upload_store_access
nginx user对上传文件的读写权限,默认同时拥有读写权限
upload_set_form_field
声名传递到后台的参数名和值,一个文件可使用的属性如下。
$upload_field_name:上传表单中文件所属的input输入框的name属性
$upload_content_type:文件类型
$upload_file_name:文件名
$upload_tmp_path:文件的存放路径
upload_aggregate_form_field
与upload_set_form_field指令类似,将文件上传结束后的属性传递到后台,可使用的属性如下。
$upload_file_md5:文件的md5sum值
$upload_file_md5_uc:大写形式的文件md5sum值
$upload_file_sha1:文件的sha1 sum值
$upload_file_sha1_uc:大写形式的文件sha1 sum值
$upload_file_crc32:16进制的CRC32文件校验码
$upload_file_size:文件大小,单位为bytes
$upload_file_number:文件体在请求体中的序号
upload_pass_form_field
声名被传递到后台的原表单字段,使用正则表达式
upload_cleanup
声名后台返回什么状态码时,nginx需要删除上传文件,状态码必须在400~500之间
upload_max_part_header_len
声名最大的http头长度,即buffer size
upload_max_file_size
声名允许上传的文件大小限制,官方文档解释为“软”限制,即超过此大小的文件仍将被接收,而client_max_body_size为“硬”限制。值为零表示无大小限制。
upload_limit_rate
声名最大的上传速度,0表示无限制
upload_max_output_body_len
声名最大的输出body大小,防止非file类型的输入堆积到memory,0表示无限制
upload_tame_array
参数名中的中括号是否被丢掉
配置实例
处理上传的路径为:/nginx-upload,此地址为上传表单的提交地址
文件上传完成后,nginx会将请求代理到后端,本例中为自定义的location upload,代理到的地址还是/nginx-upload,当然可以使用rewrite指令代理到例外一个地址。
后台会接收到的参数名和值自定义,在本例子中分别为name,content_type, path, md5, size, submit 和description
上传文件时,action="/upload?X-Progress-ID=FmN6gTEshAHCcUvR" 其中X-Progress-ID需要是唯一的id,用来上传时获取进度的id
获取上传进度需向/progress发送一个get请求 /process?X-Progress-ID=FmN6gTEshAHCcUvR即可获得上传的进度