【上传】Nginx 上传文件
本文包含知识点:
1、nginx服务搭建
2、nginx文件上传模块搭建
3、文件重命名服务搭建
3、nginx整体配置
4、测试
引言
一般可以应用在上传不是跟频繁的场景,都可以采用Nginx上传文件。我们都知道,上传文件几乎是每个项目必备,nginx在web项目中又是不可缺的,如果能将上传功能附在nginx上,可以省掉一个文件服务系统的搭建,大大降低维护部署成本和维护成本。
文件树
nginx服务搭建
参照之前的文章:Nginx 离线安装,基于centos7 --^_^-- Linux服务启动脚本范例_cyzz谭 的博客-CSDN博客
在此基础上需要安装 openssl
参考:安装openssl和openssl-devel_thanklife的专栏-CSDN博客
nginx文件上传模块搭建
1、下载nginx-upload-module模块:
https://github.com/fdintino/nginx-upload-module
注:来源 nginx-upload-module模块使用_MyBlog-CSDN博客_nginx-upload-module
2、编译与安装
cd /usr/local/nginx/nginx-1.17.2
./configure --prefix=/usr/local/nginx/ --add-module=../nginx-upload-module-master --with-openssl=../openssl-1.0.2h --with-http_gzip_static_module --with-http_ssl_module --with-pcre=../pcre-8.43/ --with-zlib=../zlib-1.2.11
make
make install
文件重命名服务搭建
因为nginx上传的文件会自动命名,而且还没有扩展名。所以需要有个重命名的服务来处理。这里采用简单的node服务。
1、安装node
参考:Linux nodejs 安装以及配置环境 - huangenai - 博客园
2、创建 rename.js 文件
目录 :/usr/local
内容:
const http = require('http');
const fs = require('fs');
/*** 服务入口*/
http.createServer((req, res) => {var emp = new Object;try {let body = '';req.on('data', chunk => {body += chunk; // 获取form-data});// 返回结果;ip需要配置, emp.data 地址与nginx配置匹配emp.resultCode = "10000";emp.resultMsg = "接口请求成功";emp.data = "http://192.168.1.1:8087/upload/public/";req.on('end', () => {const params = parseForm(body); // json化参数if (params.file_name != null) {var index = params.file_name.lastIndexOf(".");var suffix = params.file_name.substring(index);//没有扩展名就不需要加到名称中if (index == -1) {suffix = "";}//文件名 = 时间戳 + 原文件md5 + 文件大小let filename = Date.now() + "_" + params.file_md5 + "_" + params.file_size + suffix;rename(params.file_path, filename);//JSON.stringify用于将对象转成JSON文本,JSON.parse用于将JSON文本转成对象emp.data = emp.data + filename;} else {emp.resultCode = "99999";emp.resultMsg = "上传文件异常";emp.data = "";}var retval = JSON.stringify(emp);res.end(retval);console.log(params.file_name + " result:");console.log(retval);console.log("==================================================================================\n");})} catch (err) {emp.resultCode = "99999";emp.resultMsg = "异常";emp.data = "";var retval = JSON.stringify(emp);res.end(retval);}}).listen(8288)// 格式化参数
function parseForm(data) {const reg = /name="([\w_]+)"\s+(.+)\s/g;const params = {};let matched;while ((matched = reg.exec(data))) {params[matched[1]] = matched[2];}console.log("params:");console.log(params);return params;
}// 重命名方法
function rename(source, name) {const path = require('path');const dir = path.dirname(source);fs.renameSync(source, path.join(dir, name));
}
启动:
nohup node rename.js >> rename.log &
关闭:直接 kill
注意:有伙伴发现关掉终端以后js程序自己就断了,需要用tmux起一个后台运行的终端去跑。
nginx整体配置
nginx安装完毕后,修改nginx.conf 文件。主要配置的地方
1、暴露外部的端口:这里采用 8087 (和 rename.js 里面的 返回地址 对应)
2、指向重命名服务的配置,端口这里用 8288 (和 rename.js 的监听端口对应)
3、文件上传模块 nginx-upload-module 的配置
nginx.conf 内容如下(文件目录:/usr/local/nginx/conf)
#user nobody;
user heandev;
worker_processes 1;#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;#pid logs/nginx.pid;events {worker_connections 1024;
}http {# 开启gzipgzip on;# 启用gzip压缩的最小文件;小于设置值的文件将不会被压缩gzip_min_length 1k;# gzip 压缩级别 1-10 gzip_comp_level 2;# 进行压缩的文件类型。gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;# 是否在http header中添加Vary: Accept-Encoding,建议开启gzip_vary on;include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;client_max_body_size 100M;client_body_buffer_size 128k;upstream nodes {# 本机地址server 192.168.2.2:8087;}server {# 暴露端口listen 8087;# 本机地址server_name 192.168.2.2;location /upload {client_max_body_size 100m;default_type application/json;if ($request_method ~* "OPTIONS") {return 200 '{"code": -1,"msg": "正在处理中..."}';}upload_pass /rename_js;upload_resumable on; #断点续传upload_store /program/nginx_file; #文件保存地址upload_limit_rate 0; #上传限速 0 表示不限速upload_store_access user:rw; #临时文件权限upload_set_form_field "${upload_field_name}_name" $upload_file_name; #表单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; #文件md5upload_aggregate_form_field "${upload_field_name}_size" $upload_file_size; #文件大小#upload_pass_form_field "^submit$|^description$";upload_pass_form_field "^.*$"; #表单参数upload_pass_args on; #转发参数upload_cleanup 400 404 499 500-505; #如果出现这些错误将删除保存的文件}# 重命名js服务location /rename_js {proxy_pass http://localhost:8288;}# 外部访问文件服务location /upload/public/ {alias /program/nginx_file/;# 能看到目录所有文件autoindex on;}} }
整体结构与运行步骤
测试
1、测试工具是postman,模拟文件上传测试
2、rename.js服务日志
注意:
1、如果上传的文件访问不到,可能是nginx配置的使用用户没权限,两个方法解决
①修改/home 文件夹以及下面的所有文件的所属用户组为 fan
sudo chgrp -R fan /home
② 修改nginx配置
找到安装nginx的目录进去找到配置文件执行:vim nginx.conf
进入编辑模式将配置文件头部注释行:# user nobody;的注释去掉并改为user root;
2、如果 上传文件请求是 OPTIONS
上传后跳转到java程序重命名,这个需要自己写 java服务处理
【上传】Nginx 上传文件相关推荐
- Mac上使用nginx访问本地文件夹报403的问题
Mac上使用nginx访问本地文件夹报403的问题 就是没有权限访问你配置的文件夹在 nginx.conf头行加入下面配置 user root wheel; 不过我的电脑在启动nginx访问的时候会发 ...
- nginx 上传 文件超时设置_Nginx大文件上传413和500问题排查总结
背景 前几天上传一个300MB的文件,发现报错,这里说明一下,用户的请求会通过Nginx代理(负载均衡)到应用服务器. 413问题解决 错误信息为"413 Request Entity To ...
- nginx 上传文件漏洞_文件上传及解析漏洞
注:本文仅供学习参考 文件上传定义: 文件上传漏洞是指网络攻击者上传了一个可执行的文件到服务器并执行.这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等. 这种攻击方式是最为直接和有效的, ...
- nginx 服务器大文件上传时500错误
采用nginx作反向代理,出现了一个诡异的问题,小文件可以提交,大文件会报500内部错误.这个是什么原因导致的呢? 查wiki可知,上传文件大小相关的有三个配置 client_body_buff ...
- nginx 上传文件漏洞_浅谈文件上传漏洞(其他方式绕过总结)
前言 上一篇文章简单的介绍了绕过客户端检测,现在总结一下其他方式绕过. 正文 1.1 服务端MIME类型检测绕过 检测原理:用户上传文件时,服务器会获取这个文件的MIME值,与事先设置好的进行比对,如 ...
- Nginx 上传大文件超大超时解决办法
问题:用nginx作代理服务器,上传大文件时(本人上传8M左右的文件),提示上传超时或文件过大. 浏览器调试报413 (Request Entity Too Large)错误,如下图所示 原因是ngi ...
- nginx 上传文件漏洞_文件上传漏洞小结
1 概念 上传文件时,服务器端脚本语言,未对上传的文件进行严格的验证和过滤,就有可能上传恶意的脚本文件,从而控制整个网站,甚至是服务器. 2 危害 • 网站被控制,对文件增删改查,执行命令,链接数据库 ...
- 解决因nginx配置导致文件上传失败的问题 The filed file exceeds its maximum permitted size of 1048576 bytes
解决因nginx配置问题导致文件上传失败的问题 1.问题背景 2.问题截图 3.问题分析 4.问题解决(修改nginx的配置) 5.解决之后的"后遗症"(截图) 6.分析并解决&q ...
- Nginx 上传大文件配置
Nginx 配置大文件上传 nginx问题 解决方法 重启nginx nginx问题 遇到的问题: Nginx: 413 – Request Entity Too Large Error and So ...
最新文章
- 企业合理避税三大技巧
- Codeforces 768E:Game of Stones
- 【final】评价①
- 六十七、二分查找算法及其四个变形问题
- 量子力学到底神奇在哪里?看完这个,我的认知彻底坍塌了
- 360浏览器一打开就是瑞星安全网址怎么办
- Java面试之什么是GCRoots,能做什么?
- linux中的权限管理,Linux中的用户和权限管理
- js 读取json文件_JavaScript 项目中常见配置文件介绍
- CentOS 8,凛冬将至
- fire.php,php代码调试利器firephp安装与使用方法分析
- 入门必学 | R语言程序包的安装与使用指南
- 面试官:说说什么是 Java 内存模型(JMM)?
- 探索汽车行业大数据应用
- mysql 报错Incorrect string value: '\xF0\x9F\x98\x84' 解决方案
- NTL的安装、连接与使用(基于CentOS、Clion)
- 知识众筹第9期 一个经典案例学会数据分析 | 开始分红报名
- 【用Python学习Caffe】7. 网络结构的修剪
- C语言基础ask‖码一些知识
- java吃货联盟app讲解_java吃货联盟订餐系统