在容器中怎么使用nginx搭建上传下载的文件服务器

发布时间 - 2023-05-15 00:00:00    点击率:

一、安装nginx容器

为了让nginx支持文件上传,需要下载并运行带有nginx-upload-module模块的容器:

sudo podman pull docker.io/dimka2014/nginx-upload-with-progress-modules:latest
sudo podman -d --name nginx -p 83:80 docker.io/dimka2014/nginx-upload-with-progress-modules

该容器同时带有nginx-upload-module模块和nginx-upload-progress-module模块。

注意该容器是Alpine Linux ,没有bash,有些命令与其它发行版本的Linux不一样。

使用下面的命令进入容器:

sudo podman exec -it nginx /bin/sh

作为文件服务器, 需要显示本地时间,默认不是本地时间。通过下面一系列命令设置为本地时间:

apk update
apk add tzdata
echo "Asia/Shanghai" > /etc/timezone
rm -rf /etc/localtime
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
apk del tzdata

创建文件服务器的根目录:

mkdir -p /nginx/share

二、配置nginx

配置文件的路径为/etc/nginx/conf.d/default.conf,作为

server {
    ……
    charset utf-8; # 设置字符编码,避免中文乱码
    location / {
            root   /nginx/share; # 根目录
            autoindex   on;  # 开启索引功能
            autoindex_exact_size off; # 关闭计算文件确切大小(单位bytes),只显示大概大小(单位kb、mb、gb)
            autoindex_localtime on; # 显示本地时间
        }
}

此时我们的文件服务就配置好了,需要使用下面的命令让配置生效:

nginx -s reload

三、支持文件上传

1. 配置nginx

上面的配置已经完成文件服务器的配置了,但是不能上传文件,想要上传文件,还需要做如下配置:

server {
    ……
    charset utf-8; # 设置字符编码,避免中文乱码
    client_max_body_size 32m; 
    upload_limit_rate 1M; # 限制上传速度最大1M
    
    # 设置upload.html页面路由
    location = /upload.html {                                                        
            root /nginx;  # upload.html所在路径                                                       
    }

    location /upload {
            # 限制上传文件最大30MB
            upload_max_file_size 30m;
            # 设置后端处理交由@rename处理。由于nginx-upload-module模块在存储时并不是按上传的文件名存储的,所以需要自行改名。
            upload_pass @rename;
            # 指定上传文件存放目录,1表示按1位散列,将上传文件随机存到指定目录下的0、1、2、...、8、9目录中(这些目录要手动建立)
            upload_store /tmp/nginx 1;
            # 上传文件的访问权限,user:r表示用户只读,w表示可写
            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";
            upload_pass_form_field "^submit$|^description$";

            # 设置上传文件的md5值和文件大小
            upload_aggregate_form_field "${upload_field_name}_md5" "$upload_file_md5";
            upload_aggregate_form_field "${upload_field_name}_size" "$upload_file_size";

            # 如果出现下列错误码则删除上传的文件
            upload_cleanup 400 404 499 500-505;
     }

    location @rename {
            # 后端处理
            proxy_pass http://localhost:81;
    }
}

上面的配置中,临时存储时是按1位散列来存储的,需要在上传目录下手动创建0~9几个目录。

 mkdir -p /tmp/nginx
 cd /tmp/nginx
 mkdir 1 2 3 4 5 6 7 8 9 0
 chown nginx:root . -R

2. 添加upload.html




上传



3. 添加后面的处理服务

需要先安装python及所需的库

apk add python3
pip3 install bottle
pip3 install shutilwhich

python服务源码:

#!/usr/bin/python3
# -*- coding: utf-8 -*-

from bottle import *
import shutil

@post("/upload")
def postExample():
    try:
        dt = request.forms.dict
        filenames = dt.get('file.name')
        tmp_path = dt.get("file.tmp_path")
        filepaths = dt.get("file.path")
        count = filenames.__len__()
        dir = os.path.abspath(filepaths[0])
        for i in range(count):
            print("rename %s to %s" % (tmp_path[i],  os.path.join(dir, filenames[i])))
            target = os.path.join(dir, filenames[i])
            shutil.move(tmp_path[i], target)
            shutil.chown(target, "nginx", "root") # 由于shutil.move不会保持用户归属,所以需要显示修改,否则访问时会报403无访问权限
    except Exception as e:
        print("Exception:%s" % e)
        redirect("50x.html") # 如果是在容器中部署的nginx且映射了不同的端口,需要指定IP,端口
    redirect('/') # 如果是在容器中部署的nginx且映射了不同的端口,需要指定IP,端口

run(host='localhost', port=81)

四、获取上传进度

1.修改配置

# 开辟一个空间proxied来存储跟踪上传的信息1MB
upload_progress proxied 1m;
server {
    ……
    location ^~ /progress {
        # 报告上传的信息
        report_uploads proxied;
    }
    location /upload {
        ...
        # 上传完成后,仍然保存上传信息5s
        track_uploads proxied 5s;
    }
}

2. 修改上传页面

(progress)


# nginx  # 上传  # 上传文件  # 是在  # 后端  # 文件服务器  # 文件上传  # 访问权限  # 几个  # 好了  # 目录下 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  网站图片在线制作软件,怎么在图片上做链接?  如何破解联通资金短缺导致的基站建设难题?  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  Bootstrap整体框架之CSS12栅格系统  PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  如何用PHP快速搭建CMS系统?  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  如何在橙子建站中快速调整背景颜色?  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  Bootstrap整体框架之JavaScript插件架构  Laravel如何升级到最新版本?(升级指南和步骤)  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  手机网站制作与建设方案,手机网站如何建设?  Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】  Laravel模型事件有哪些_Laravel Model Event生命周期详解  如何确保FTP站点访问权限与数据传输安全?  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  Linux系统命令中tree命令详解  大同网页,大同瑞慈医院官网?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  高端网站建设与定制开发一站式解决方案 中企动力  如何在万网ECS上快速搭建专属网站?  Python3.6正式版新特性预览  IOS倒计时设置UIButton标题title的抖动问题  油猴 教程,油猴搜脚本为什么会网页无法显示?  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  如何快速搭建高效可靠的建站解决方案?  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  详解CentOS6.5 安装 MySQL5.1.71的方法  制作电商网页,电商供应链怎么做?  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  浅谈Javascript中的Label语句  html5的keygen标签为什么废弃_替代方案说明【解答】  香港服务器部署网站为何提示未备案?  Laravel如何处理文件下载请求?(Response示例)  UC浏览器如何设置启动页 UC浏览器启动页设置方法  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  JavaScript中的标签模板是什么_它如何扩展字符串功能  夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化  如何快速上传建站程序避免常见错误?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  JavaScript模板引擎Template.js使用详解