【上传】Nginx 上传文件

2023-05-16

本文包含知识点:

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 {

	# 开启gzip
	gzip 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;        #文件md5
            upload_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服务处理

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【上传】Nginx 上传文件 的相关文章

  • NGINX 与 Tomcat 配置

    我是 Nginx 新手 我需要你的帮助 根据很多论坛我了解到我们所有的静态页面都存储在Nginx中 当有请求到来时 我必须将该请求传递给 tomcat 获取数据 并在 tomcat 生成响应后生成响应 目前 我刚刚做到了 我将请求直接传递给
  • Nginx反向代理(proxy_pass)不传递子文件夹

    我想在子文件夹配置中运行应用程序 Mattermost 例如 https www example com mattermost https www example com mattermost location mattermost gzi
  • 如何将多个域路由到多个节点应用程序?

    我习惯了典型的 Lamp Web 托管环境 您只需单击 cpanel 中的几个按钮 您的域就会被分区并映射到 htdocs 中的文件夹 我经常使用 Node js 但做同样的事情似乎并不那么简单 如果我有多个节点应用程序 并且我想将doma
  • NGinx 域名重定向

    假设我有一个名为 xyz co 的网站 我还有其他具有相同前缀的域名 例如 xyz com xyz it xyz co it 现在 nginx 与端口 80 的 nginx conf 中的 server name xyz co 配合得很好
  • Docker:Nginx 和 php5-fpm docker 不说话

    我想进行完全 Docker 化的 Drupal 安装 我的第一步是让容器与 Nginx 和 php5 fpm 一起运行 两者都基于 Debian 我在 CoreOS alpha 频道 使用 Digital Ocean 我的 Dockerfi
  • Nginx反向代理返回404

    我的 Nginx 安装并运行 下面是配置 etc nginx nginx conf 我要全部转发 api 到我的 tomcat 服务器 该服务器在同一服务器上的端口 9100 上运行 类型http myhost 9100 api apps有
  • 错误:从上游读取响应标头时上游过早关闭连接 [uWSGI/Django/NGINX]

    我目前在用户正在进行的查询中总是得到 502 它通常返回 872 行 在 MySQL 中运行需要 2 07 然而 它返回了大量信息 每一行包含很多东西 有任何想法吗 运行 Django tastypie Rest API Nginx 和 u
  • nginx server_name 在流块内可能吗?

    目前设置如下 stream server listen 9987 udp server name subdomain EXAMPLE com this line is resulting in an error proxy pass loc
  • 为什么 opcache 没有刷新?

    我用guzzlehttp guzzle封装在拉拉维尔 8 升级到后PHP 8 I get Symfony Component ErrorHandler Error FatalError Invalid opcode 117 2 0 in f
  • Beanstalk 部署忽略 .ebextensions 中的 nginx 配置文件

    我在单实例 Elastic Beanstalk 环境中托管 Java Web 应用程序 并添加了几个 ebextension 文件 这些文件在每次部署时成功为我创建配置文件 然而 我无法找到一种方法让 Beanstalk 在 etc ngi
  • 抑制 nginx 访问被拒绝错误日志

    我在 nginx 中设置了一些规则来拒绝 IP 访问 这很有效 但对于来自被拒绝 IP 的每个请求 都会记录以下开头的错误 error 7325 0 5761 access forbidden by rule client 有没有办法抑制这
  • Django + nginx + uwsgi 无法登录

    我有非常简单的登录逻辑 类似于官方 Django 解决方案 class Login FormView template name login html form class AuthenticationForm def get self a
  • Rails/Nginx 中的超时——最佳实践

    我正在开发一个应该在 Nginx 服务器上运行的 Rails 应用程序 根据输入 应用程序可能需要很长时间来处理请求 或者在出现错误时挂起 因此我想防止进程永远运行 除了确保客户端收到超时信号的 Nginx 配置之外 我想我可能仍然需要确保
  • Logrotate - nginx 日志不在 docker 容器内旋转

    我有一个运行 nginx 的 docker 容器 它正在将日志写入 var log nginxLogrotate 安装在 docker 容器中 并且 nginx 的 logrotate 配置文件已正确设置 尽管如此 logrotate 仍不
  • Nginx docker容器代理传递到另一个端口

    我想在 docker 容器中运行 Nginx 它监听端口 80 并且当 url 以 word 开头时 我希望它 proxy pass 到端口 8080api 我有一些网络应用程序侦听端口 8080 这在没有 docker 的情况下对我来说一
  • 重定向而不是 404 错误页面 - 状态代码不起作用 (Nginx)

    我目前正在迁移到 nginx 服务器 我尝试将其放入名为的 404 ErrorDocument 中404 php 如果我现在尝试访问http mydomain com 404 php 这按预期工作 它将我重定向到 Google 但是一旦我尝
  • 如何避免 nginx“上游发送太大的标头”错误?

    我正在运行 nginx Phusion Passenger 和 Rails 我遇到了以下错误 upstream sent too big header while reading response header from upstream
  • Flask 或 Pyramid 中的简单网络 UDP 监听

    我需要创建一个 Web 应用程序来显示通过定期传入 UDP 数据包提供的数据 该站点可能位于 Flask 可能是 Pyramid 中 部署在 Nginx 下 如何创建一个非常简单的后台任务 基本上只是 socket recv 来侦听任何传入
  • 使用代理协议的 kubernetes nginx 入口最终出现损坏的标头

    我尝试使用代理协议在 google 容器上设置 nginx 入口 nodeport 以便可以将真实 IP 转发到后端服务 但最终导致标头损坏 2017 02 05 13 48 52 error 18 18 2 broken header H
  • nginx + php-fpm = 找不到文件

    当我尝试访问时info php我得到一个File not found error 我尝试了一些教程但无济于事 配置 默认 server listen 80 listen 80 default ipv6only on server name

随机推荐

  • Ubuntu下安装Inode后双击InodeClient无反映解决方法

    由于比较喜好linux编程环境 xff0c 所以准本一直使用linux 学校无线有时有有时没很不爽 xff0c 所以准本安装Inode xff0c 但是安装完Inode后双击是一直没反映 最后求助万能的百度 xff0c 谁知道百度的搜索不得
  • 使用GitHub托管网站,自定义域名

    1 如何使用GitHub托管 官网链接 xff1a 点击跳转 官网首页就有详细的搭建步骤 xff0c 总共5步便可搭建成功 访问 github用户名 github io 便可看到自己的网站 2 自定义域名的方法 1 申请一个域名 xff0c
  • ElasticsearchRestTemplate 基本使用

    随着数据量的增加和数据结构的复杂化 xff0c 传统的关系型数据库已经不能满足用户的需求 xff0c 而搜索引擎则成为了一种更加高效 可扩展的数据检索方案 而 Elasticsearch 则是一个流行的搜索引擎 xff0c 在 Java 生
  • Navcat无法连接mysql报错1449

    把mysql从5升级成8后第二次连接mysql就报错1449 不清楚什么原因 xff0c 反正肯定是升级数据库之后mysql用户被动了 xff0c 看了很多博客都没有用 xff0c 什么在navcat里新建用户 xff0c 数据库都连不上怎
  • Kafka —— java实现一生产者多消费者实例

    架构图 xff1a xff08 网图 xff0c 很通俗易懂了 xff0c 就不自己画了 xff0c 这里实现的是一个Producer 两个Consumer xff09 前提 xff1a 已经开启zookeeper 和kafka xff0c
  • 程序员玩游戏之三--天天爱消除非暴力脚本

    评论 xff1a 此款游戏成功在其好友排名上 好友的分数超过了你无疑会增加你的斗志 中级策略 xff1a 七手八脚多人一起点 这相当于多个CPU处理一个大任务了 xff0c 哈哈 终极策略 xff1a 自动化 机器总是比人快的多 你两个人一
  • 程序员玩游戏之四--娱网棋牌大连打滚子记牌器

    话说大连人都爱打滚子 xff0c 所以本人就做了一个打滚子记牌器 基本原理同 程序员玩游戏之一 自动对对碰 xff0c 故此处不再赘述 xff0c 只留下一张截图吧 代码请见资源地址 xff1a http download csdn net
  • 为SIGSEGV设置handler有用吗?

    背景 最近几天看到先辈们30年前留下了一块代码 xff0c 为SIGSEGV设置了handler xff0c 所以心中有了两个疑问 xff1a 为SIGSEGV设置handler有没有用 xff1f 能否跳过引起崩溃的那一句指令 xff1f
  • GDB调试技巧实战--为优化版release版本的函数寻找参数值

    在上一篇 GDB调试技巧实战 为release版本的函数寻找参数值 中 xff0c 我们探讨了一种为函数找参数的办法 xff0c 但是 xff0c 那是最理想的情况 编译时没有使用 fomit frame pointer 编译时没有开启优化
  • 通过实例了解uprobe及其对性能的影响

    前言 uprobe是用户空间探针的意思 xff0c 可以用来给用户程序的任何地方下探针 xff0c 不仅仅是函数粒度层级的 所以异常灵活 如果不熟悉ftrace uprobe 可参考以下文档 xff1a https www kernel o
  • bpftrace各维度捕捉SIGKILL信号

    一 问题 Ftrace 几乎适配任何主流内核版本 xff09 和 bpftrace xff08 要求内核版本4 1以上 xff09 中都有两个现成的脚本execsnoop bt killsnoop bt 我经常用他们从外部 xff08 不去
  • 图形化VS201x工程中的项目依赖关系

    目录 1 背景 2 入手 2 1 分析sln文件 2 2 给出正则表达式 3 程序 4 demo 5 补充 另外一种情况 6 补充 完整代码 1 背景 初次接手一个大工程时 往往因为复杂的项目依赖而遇到各种编译问题 同时如果能图形化其中的依
  • 深入应用python关键字yield--实现任务调度

    在此假设读者了解yield关键字的基本用法 如不了解请参照python文档或google之 大家知道遇到yield关键字时python会把当前的环境 xff0c 比如局部变量 全局变量等 xff0c 给记录下来以便以后能正确的继续向下运行
  • 刘慈欣(三体作者)写给200年以后的女儿的一封信

    原文地址 xff1a http blog sina com cn s blog 540d5e800101lcsb html 亲爱的女儿 xff0c 你好 xff01 这是一封你可能永远收不到的信 xff0c 我将把这封信保存到银行的保险箱中
  • 程序员玩游戏之二--篡改植物大战僵尸2的阳光值

    植物大战僵尸1几年前曾经风靡一时 xff0c 妇孺皆知 xff01 其续作奇幻时空之旅千呼万唤始出来 xff0c 不过从首发到目前都1月有余 xff0c 本人竟然还没玩过 于是昨晚下载了一个汉化版 本人系统为IOS5 0 1 xff0c a
  • 设计模式:生产者消费者模式

    在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题 该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度 为什么要使用生产者和消费者模式 xff1f 在线程世界里 xff0c 生产者就是生产数据的线程 xff0c
  • activemq 应用实践——queue

    首先创建发送端程序SenderTestBase和接收端程序ReceiveTestBase 发送端 xff1a SenderTestBase java package test import java util Date import jav
  • swig包装c++步骤

    使用Swig封装C 43 43 到Python的心得 01 收藏 一 xff0e 简述 前一段时间由于工作需要重点学习了一下用Swig来封装C 43 43 代码到Python的知识 xff0c 期间遇到一些问题 xff0c 也有一些心得体会
  • PS CC2019 安装过程中遇到 Command line option syntax error. Type Command /? for Help.

    背景前言 昨天买了一块高漫WH850 的数位板 手绘板 板子都买了 肯定要安装PSCC 2019 了 但是在安装过程中遇到一个问题 那就是Command line option syntax error Type Command for H
  • 【上传】Nginx 上传文件

    本文包含知识点 xff1a 1 nginx服务搭建 2 nginx文件上传模块搭建 3 文件重命名服务搭建 3 nginx整体配置 4 测试 引言 一般可以应用在上传不是跟频繁的场景 xff0c 都可以采用Nginx上传文件 我们都知道 x