教你在容器中使用nginx搭建上传下载的文件服务器
目录
- 一、安装nginx容器
- 二、配置nginx
- 三、支持文件上传
- 1. 配置nginx
- 2. 添加upload.html
- 3. 添加后面的处理服务
- 四、获取上传进度
- 1.修改配置
- 2. 修改上传页面
一、安装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; # 根目录autoindexon; # 开启索引功能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 {# 限制上传文件最大30MBupload_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 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.dictfilenames = 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 {...# 上传完成后,仍然保存上传信息5strack_uploads proxied 5s; }}
2. 修改上传页面
(progress)
文章图片
参考:
https://breeze2.github.io/blog/scheme-nginx-php-js-upload-process
https://www.tiantanhao.com/34031.html
https://blog.csdn.net/scugxl/article/details/107180138
https://octocat9lee.github.io/2020/03/11/Nginx%E6%90%AD%E5%BB%BA%E6%96%87%E4%BB%B6%E6%9C%8D%E5%8A%A1%E5%99%A8/
到此这篇关于容器中使用ngnix搭建支持上传下载的文件服务器的文章就介绍到这了,更多相关ngnix文件服务器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- qq聊天记录删除了怎样恢复,本文教您恢复qq聊天记录删除的办法
- 隐藏文件夹,本文教您电脑隐藏文件夹怎样恢复
- 电脑出现蓝屏,本文教您如何迅速修好
- 黑鲨,本文教您黑鲨如何安装win7系统
- 显示器驱动程序已停止响应,本文教您怎样处理win7显示器驱动程序已停止响应
- 红心大战规则,本文教您红心大战怎样玩
- win7企业版激活工具,本文教您激活工具如何激活win7企业版
- 笔记本电脑如何分区,本文教您笔记本电脑怎样分区
- 笔记本屏幕闪烁,本文教您笔记本电脑屏幕闪烁怎样处理
- ahci驱动,本文教您ahci驱动