当前位置:   article > 正文

【上传】Nginx 上传文件_nginx上传文件

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、编译与安装

  1. cd /usr/local/nginx/nginx-1.17.2
  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
  3. make
  4. make install

文件重命名服务搭建

因为nginx上传的文件会自动命名,而且还没有扩展名。所以需要有个重命名的服务来处理。这里采用简单的node服务。

1、安装node 

参考:Linux nodejs 安装以及配置环境 - huangenai - 博客园

2、创建 rename.js 文件

目录 :/usr/local

内容:

  1. const http = require('http');
  2. const fs = require('fs');
  3. /**
  4. * 服务入口
  5. */
  6. http.createServer((req, res) => {
  7. var emp = new Object;
  8. try {
  9. let body = '';
  10. req.on('data', chunk => {
  11. body += chunk; // 获取form-data
  12. });
  13. // 返回结果;ip需要配置, emp.data 地址与nginx配置匹配
  14. emp.resultCode = "10000";
  15. emp.resultMsg = "接口请求成功";
  16. emp.data = "http://192.168.1.1:8087/upload/public/";
  17. req.on('end', () => {
  18. const params = parseForm(body); // json化参数
  19. if (params.file_name != null) {
  20. var index = params.file_name.lastIndexOf(".");
  21. var suffix = params.file_name.substring(index);
  22. //没有扩展名就不需要加到名称中
  23. if (index == -1) {
  24. suffix = "";
  25. }
  26. //文件名 = 时间戳 + 原文件md5 + 文件大小
  27. let filename = Date.now() + "_" + params.file_md5 + "_" + params.file_size + suffix;
  28. rename(params.file_path, filename);
  29. //JSON.stringify用于将对象转成JSON文本,JSON.parse用于将JSON文本转成对象
  30. emp.data = emp.data + filename;
  31. } else {
  32. emp.resultCode = "99999";
  33. emp.resultMsg = "上传文件异常";
  34. emp.data = "";
  35. }
  36. var retval = JSON.stringify(emp);
  37. res.end(retval);
  38. console.log(params.file_name + " result:");
  39. console.log(retval);
  40. console.log("==================================================================================\n");
  41. })
  42. } catch (err) {
  43. emp.resultCode = "99999";
  44. emp.resultMsg = "异常";
  45. emp.data = "";
  46. var retval = JSON.stringify(emp);
  47. res.end(retval);
  48. }
  49. }).listen(8288)
  50. // 格式化参数
  51. function parseForm(data) {
  52. const reg = /name="([\w_]+)"\s+(.+)\s/g;
  53. const params = {};
  54. let matched;
  55. while ((matched = reg.exec(data))) {
  56. params[matched[1]] = matched[2];
  57. }
  58. console.log("params:");
  59. console.log(params);
  60. return params;
  61. }
  62. // 重命名方法
  63. function rename(source, name) {
  64. const path = require('path');
  65. const dir = path.dirname(source);
  66. fs.renameSync(source, path.join(dir, name));
  67. }

启动:

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

  1. #user nobody;
  2. user heandev;
  3. worker_processes 1;
  4. #error_log logs/error.log;
  5. #error_log logs/error.log notice;
  6. #error_log logs/error.log info;
  7. #pid logs/nginx.pid;
  8. events {
  9. worker_connections 1024;
  10. }
  11. http {
  12. # 开启gzip
  13. gzip on;
  14. # 启用gzip压缩的最小文件;小于设置值的文件将不会被压缩
  15. gzip_min_length 1k;
  16. # gzip 压缩级别 1-10
  17. gzip_comp_level 2;
  18. # 进行压缩的文件类型。
  19. 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;
  20. # 是否在http header中添加Vary: Accept-Encoding,建议开启
  21. gzip_vary on;
  22. include mime.types;
  23. default_type application/octet-stream;
  24. sendfile on;
  25. keepalive_timeout 65;
  26. client_max_body_size 100M;
  27. client_body_buffer_size 128k;
  28. upstream nodes {
  29. # 本机地址
  30. server 192.168.2.2:8087;
  31. }
  32. server {
  33. # 暴露端口
  34. listen 8087;
  35. # 本机地址
  36. server_name 192.168.2.2;
  37. location /upload {
  38. client_max_body_size 100m;
  39. default_type application/json;
  40. if ($request_method ~* "OPTIONS") {
  41. return 200 '{"code": -1,"msg": "正在处理中..."}';
  42. }
  43. upload_pass /rename_js;
  44. upload_resumable on; #断点续传
  45. upload_store /program/nginx_file; #文件保存地址
  46. upload_limit_rate 0; #上传限速 0 表示不限速
  47. upload_store_access user:rw; #临时文件权限
  48. upload_set_form_field "${upload_field_name}_name" $upload_file_name; #表单name值
  49. upload_set_form_field "${upload_field_name}_content_type" $upload_content_type; #上传文件的类型
  50. upload_set_form_field "${upload_field_name}_path" $upload_tmp_path; #文件上传后保存在服务器上的地址
  51. upload_aggregate_form_field "${upload_field_name}_md5" $upload_file_md5; #文件md5
  52. upload_aggregate_form_field "${upload_field_name}_size" $upload_file_size; #文件大小
  53. #upload_pass_form_field "^submit$|^description$";
  54. upload_pass_form_field "^.*$"; #表单参数
  55. upload_pass_args on; #转发参数
  56. upload_cleanup 400 404 499 500-505; #如果出现这些错误将删除保存的文件
  57. }
  58. # 重命名js服务
  59. location /rename_js {
  60. proxy_pass http://localhost:8288;
  61. }
  62. # 外部访问文件服务
  63. location /upload/public/ {
  64. alias /program/nginx_file/;
  65. # 能看到目录所有文件
  66. autoindex on;
  67. }
  68. }
  69. }

整体结构与运行步骤

测试

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服务处理

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/232398
推荐阅读
相关标签
  

闽ICP备14008679号