您好,登錄后才能下訂單哦!
這篇文章主要講解了“在容器中怎么使用nginx搭建上傳下載的文件服務(wù)器”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“在容器中怎么使用nginx搭建上傳下載的文件服務(wù)器”吧!
為了讓nginx支持文件上傳,需要下載并運(yùn)行帶有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
該容器同時(shí)帶有nginx-upload-module模塊和nginx-upload-progress-module模塊。
注意該容器是Alpine Linux
,沒(méi)有bash,有些命令與其它發(fā)行版本的Linux不一樣。
使用下面的命令進(jìn)入容器:
sudo podman exec -it nginx /bin/sh
作為文件服務(wù)器, 需要顯示本地時(shí)間,默認(rèn)不是本地時(shí)間。通過(guò)下面一系列命令設(shè)置為本地時(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
創(chuàng)建文件服務(wù)器的根目錄:
mkdir -p /nginx/share
配置文件的路徑為/etc/nginx/conf.d/default.conf
,作為
server { …… charset utf-8; # 設(shè)置字符編碼,避免中文亂碼 location / { root /nginx/share; # 根目錄 autoindex on; # 開啟索引功能 autoindex_exact_size off; # 關(guān)閉計(jì)算文件確切大?。▎挝籦ytes),只顯示大概大小(單位kb、mb、gb) autoindex_localtime on; # 顯示本地時(shí)間 } }
此時(shí)我們的文件服務(wù)就配置好了,需要使用下面的命令讓配置生效:
nginx -s reload
上面的配置已經(jīng)完成文件服務(wù)器的配置了,但是不能上傳文件,想要上傳文件,還需要做如下配置:
server { …… charset utf-8; # 設(shè)置字符編碼,避免中文亂碼 client_max_body_size 32m; upload_limit_rate 1M; # 限制上傳速度最大1M # 設(shè)置upload.html頁(yè)面路由 location = /upload.html { root /nginx; # upload.html所在路徑 } location /upload { # 限制上傳文件最大30MB upload_max_file_size 30m; # 設(shè)置后端處理交由@rename處理。由于nginx-upload-module模塊在存儲(chǔ)時(shí)并不是按上傳的文件名存儲(chǔ)的,所以需要自行改名。 upload_pass @rename; # 指定上傳文件存放目錄,1表示按1位散列,將上傳文件隨機(jī)存到指定目錄下的0、1、2、...、8、9目錄中(這些目錄要手動(dòng)建立) upload_store /tmp/nginx 1; # 上傳文件的訪問(wèn)權(quán)限,user:r表示用戶只讀,w表示可寫 upload_store_access user:r; # 設(shè)置傳給后端處理的表單數(shù)據(jù),包括上傳的原始文件名,上傳的內(nèi)容類型,臨時(shí)存儲(chǔ)的路徑 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$"; # 設(shè)置上傳文件的md5值和文件大小 upload_aggregate_form_field "${upload_field_name}_md5" "$upload_file_md5"; upload_aggregate_form_field "${upload_field_name}_size" "$upload_file_size"; # 如果出現(xiàn)下列錯(cuò)誤碼則刪除上傳的文件 upload_cleanup 400 404 499 500-505; } location @rename { # 后端處理 proxy_pass http://localhost:81; } }
上面的配置中,臨時(shí)存儲(chǔ)時(shí)是按1位散列來(lái)存儲(chǔ)的,需要在上傳目錄下手動(dòng)創(chuàng)建0~9幾個(gè)目錄。
mkdir -p /tmp/nginx cd /tmp/nginx mkdir 1 2 3 4 5 6 7 8 9 0 chown nginx:root . -R
<!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>
需要先安裝python及所需的庫(kù)
apk add python3 pip3 install bottle pip3 install shutilwhich
python服務(wù)源碼:
#!/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不會(huì)保持用戶歸屬,所以需要顯示修改,否則訪問(wèn)時(shí)會(huì)報(bào)403無(wú)訪問(wèn)權(quán)限 except Exception as e: print("Exception:%s" % e) redirect("50x.html") # 如果是在容器中部署的nginx且映射了不同的端口,需要指定IP,端口 redirect('/') # 如果是在容器中部署的nginx且映射了不同的端口,需要指定IP,端口 run(host='localhost', port=81)
# 開辟一個(gè)空間proxied來(lái)存儲(chǔ)跟蹤上傳的信息1MB upload_progress proxied 1m; server { …… location ^~ /progress { # 報(bào)告上傳的信息 report_uploads proxied; } location /upload { ... # 上傳完成后,仍然保存上傳信息5s track_uploads proxied 5s; } }
<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; /* 每隔一秒查詢一下上傳進(jìn)度 */ 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; /* 更新進(jìn)度條 */ if (upload.state == 'done' || upload.state == 'uploading') { var bar = document.getElementById('progressbar'); var w = 400 * upload.received / upload.size; bar.style.width = w + 'px'; } /* 上傳完成,不再查詢進(jìn)度 */ if (upload.state == 'done') { window.clearTimeout(interval); } if (upload.state == 'error') { window.clearTimeout(interval); alert('something wrong'); } } } } req.send(null); } </script>
感謝各位的閱讀,以上就是“在容器中怎么使用nginx搭建上傳下載的文件服務(wù)器”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)在容器中怎么使用nginx搭建上傳下載的文件服務(wù)器這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。