文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-06-30 12:46

关注

这篇文章主要讲解了“在容器中怎么使用nginx搭建上传下载的文件服务器”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“在容器中怎么使用nginx搭建上传下载的文件服务器”吧!

一、安装nginx容器

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

sudo podman pull docker.io/dimka2014/nginx-upload-with-progress-modules:latestsudo 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 updateapk add tzdataecho "Asia/Shanghai" > /etc/timezonerm -rf /etc/localtimecp /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeapk 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

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

三、支持文件上传

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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><title>上传</title></head><body><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><form name="upload" method="POST" enctype="multipart/form-data" action="upload"><input type="file" name="file"/><input type="submit" name="submit" value="上传"/></form></body></html>

3. 添加后面的处理服务

需要先安装python及所需的库

apk add python3pip3 install bottlepip3 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来存储跟踪上传的信息1MBupload_progress proxied 1m;server {    ……    location ^~ /progress {        # 报告上传的信息        report_uploads proxied;    }    location /upload {        ...        # 上传完成后,仍然保存上传信息5s        track_uploads proxied 5s;    }}

2. 修改上传页面

<form id="upload" enctype="multipart/form-data" action="/upload" method="post" onsubmit="openProgressBar(); return true;">    <input name="file" type="file" label="fileupload" />    <input type="submit" value="Upload File" /></form><div>    <div id="progress" >        <div id="progressbar" > </div>    </div>   <div id="tp">(progress)</div></div><script type="text/javascript">    var interval = null;    var uuid = "";    function openProgressBar() {        for (var i = 0; i < 32; i++) {            uuid += Math.floor(Math.random() * 16).toString(16);        }        document.getElementById("upload").action = "/upload?X-Progress-ID=" + uuid;                interval = window.setInterval(function () {            fetch(uuid);        }, 1000);    }    function fetch(uuid) {        var req = new XMLHttpRequest();        req.open("GET", "/progress", 1);        req.setRequestHeader("X-Progress-ID", uuid);        req.onreadystatechange = function () {            if (req.readyState == 4) {                if (req.status == 200) {                    var upload = eval(req.responseText);                    document.getElementById('tp').innerHTML = upload.state;                                        if (upload.state == 'done' || upload.state == 'uploading') {                        var bar = document.getElementById('progressbar');                        var w = 400 * upload.received / upload.size;                        bar.style.width = w + 'px';                    }                                        if (upload.state == 'done') {                        window.clearTimeout(interval);                    }                    if (upload.state == 'error') {                        window.clearTimeout(interval);                        alert('something wrong');                    }                }            }        }        req.send(null);    }</script>

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

感谢各位的阅读,以上就是“在容器中怎么使用nginx搭建上传下载的文件服务器”的内容了,经过本文的学习后,相信大家对在容器中怎么使用nginx搭建上传下载的文件服务器这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-服务器
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯