1. 程式人生 > >nginx upload模組+python 後端處理模仿fastdfs實現檔案存取

nginx upload模組+python 後端處理模仿fastdfs實現檔案存取

前提條件:
1.編譯安裝帶有nginx upload 模組的nginx,安裝指令碼如下。
2.配置nginx的conf檔案,一個server配置upload上傳,一個server配置download下載
3.使用django快速部署python後端服務,對nginx存入的檔案進行處理,並返回下載的url
註釋:如果不適用後端處理,nginx也可以實現將檔案上傳,但是由於upload模組將檔案存入時會自己命名存入,無法記錄相關檔案型別。如果直接從nginx儲存目錄下載,會導致檔案的字尾丟失,無法獲取檔案型別。

####nginx安裝指令碼

[[email protected]
~]# cat autonginx #!/bin/bash #install nginx/1.10.3 #Installation path INSTALL_DIR=/usr/local/ SRC_DIR=/opt/package [ ! -d ${INSTALL_DIR} ] && mkdir -p ${INSTALL_DIR} [ ! -d ${SRC_DIR} ] && mkdir -p ${SRC_DIR} # Check if user is root if [ $(id -u) != "0" ]; then echo "Error: You must be root to run this script!!"
exit 1 fi #Install dependency package for Package in wget gcc gcc-c++ autoconf automake zlib zlib-devel openssl openssl-devel pcre pcre-devel unzip do yum -y install $Package done function Install_Nginx() { #update version NGINX="nginx-1.10.3" PCRE="pcre-8.40" ZLIB="zlib-1.2.11" OPENSSL="openssl-1.1.0e"
PURGE="ngx_cache_purge-2.3" UPLOAD="nginx-upload-module-2.2" NGINXFEATURES="--prefix=${INSTALL_DIR}nginx \ --user=nginx \ --group=nginx \ --with-http_ssl_module \ --with-http_gzip_static_module \ --with-http_stub_status_module \ --with-http_realip_module \ --with-stream \ --with-stream_ssl_module \ --pid-path=/var/run/nginx.pid \ --with-pcre=${SRC_DIR}/${PCRE} \ --with-zlib=${SRC_DIR}/${ZLIB} \ --with-openssl=${SRC_DIR}/${OPENSSL} \ --add-module=${SRC_DIR}/${PURGE} \ --add-module=${SRC_DIR}/${UPLOAD} " cd ${SRC_DIR} #download package echo 'Downloading NGINX' if [ ! -f ${NGINX}.tar.gz ] then wget -c http://nginx.org/download/${NGINX}.tar.gz else echo 'Skipping: NGINX already downloaded' fi echo 'Downloading PCRE' if [ ! -f ${PCRE}.tar.gz ] then wget -c https://ftp.pcre.org/pub/pcre/${PCRE}.tar.gz else echo 'Skipping: PCRE already downloaded' fi echo 'Downloading ZLIB' if [ ! -f ${ZLIB}.tar.gz ] then wget -c http://zlib.net/${ZLIB}.tar.gz else echo 'Skipping: ZLIB already downloaded' fi echo 'Downloading OPENSSL' if [ ! -f ${OPENSSL}.tar.gz ] then wget -c http://www.openssl.org/source/${OPENSSL}.tar.gz else echo 'Skipping: OPENSSL already downloaded' fi echo 'Downloading PURGE' if [ ! -f 2.3.tar.gz ] then wget -c https://github.com//FRiCKLE/ngx_cache_purge/archive/2.3.tar.gz else echo 'Skipping: PURGE already downloaded' fi if [ ! -f 2.2 ] then wget -c https://codeload.github.com/vkholodkov/nginx-upload-module/zip/2.2 else echo 'Skipping: nginx-upload-module already downloaded' fi echo '----------Unpacking downloaded archives. This process may take serveral minutes---------' echo "Extracting ${NGINX}..." tar xzf ${NGINX}.tar.gz echo 'Done.' echo "Extracting ${PCRE}..." tar xzf ${PCRE}.tar.gz echo 'Done.' echo "Extracting ${ZLIB}..." tar xzf ${ZLIB}.tar.gz echo 'Done.' echo "Extracting ${OPENSSL}..." tar xzf ${OPENSSL}.tar.gz echo 'Done.' echo "Extracting ${PURGE}..." tar xzf 2.3.tar.gz echo 'Done.' echo "Extracting ${UPLOAD}..." unzip 2.2 echo 'Done.' #add new user groupadd -r nginx useradd -r -g nginx nginx #make echo '###################' echo 'Compile NGINX' echo '###################' cd ${SRC_DIR}/${NGINX} ./configure ${NGINXFEATURES} make make install echo '###################' echo 'ok' echo '###################' } Install_Nginx

在此前,建立/www/web/upload/tmp目錄。然後配置一下內容重啟nginx。

####nginx配置檔案


#####upload所需要的server


server {
    listen 99;

    client_max_body_size 20m;
    client_body_buffer_size 512k;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE_ADD $remote_addr;


    error_page 405 =200 @405;

        location / {
            index index.html index.htm index.php;
        }

        location @405
        {
            root /www/web/upload;
        }


    location /upload {
        # 轉到後臺處理URL,表示Nginx接收完上傳的檔案後,然後交給後端處理的地址
        upload_pass @python;

        # 臨時儲存路徑, 可以使用雜湊
        # 上傳模組接收到的檔案臨時存放的路徑, 1 表示方式,該方式是需要在/tmp/nginx_upload下建立以0到9為目錄名稱的目錄,上傳時候會進行一個雜湊處理。
        upload_store /www/web/upload/tmp 1;

        # 上傳檔案的許可權,rw表示讀寫 r只讀
        upload_store_access user:rw group:rw all:rw;

        set $upload_field_name "file";
        # upload_resumable on;

        # 這裡寫入http報頭,pass到後臺頁面後能獲取這裡set的報頭欄位
        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模組自動生成的一些資訊,如檔案大小與檔案md5值
        upload_aggregate_form_field "${upload_field_name}_md5" $upload_file_md5;
        upload_aggregate_form_field "${upload_field_name}_size" $upload_file_size;

        # 允許的欄位,允許全部可以 "^.*$"
        upload_pass_form_field "^.*$";
        # upload_pass_form_field "^submit$|^description$";

        # 每秒位元組速度控制,0表示不受控制,預設0, 128K
        upload_limit_rate 0;

        # 如果pass頁面是以下狀態碼,就刪除此次上傳的臨時檔案
        upload_cleanup 400 404 499 500-505;

        # 開啟開關,意思就是把前端指令碼請求的引數會傳給後端的指令碼語言,比如:http://192.168.1.251:9000/upload/?k=23,後臺可以通過POST['k']來訪問。
        upload_pass_args on;
    }

    location @python {
        proxy_pass http://localhost:9999;
        # return 200;  # 如果不需要後端程式處理,直接返回200即可
    }
}


#######download所需要的server#############


 server {
        listen 88;
        root /tmp/nginx_upload/;
        location /nginx_upload {
                root /tmp;

        }

     }

此刻,你已經完成了nginx的配置,可以使用小程式進行一下上傳測試,看看nginx是否可以上傳檔案。

import requests


file_dir = 'images/logo.png'
file = open(file_dir, 'rb')
files = {'attachment_file': (file_dir, file, 'image/png', {})}
r1 = requests.post('http://172.18.3.183:99/upload', files=files)
print(r1.text)
file.close()

通過python模擬post請求,將圖片上傳到剛才nginx開放的介面,然後在剛才建立的目錄查詢檔案

接下來,進行後端伺服器的部署,可以使用django進行部署。
1.pip install Django==1.8.9
2. django-admin.py startproject UPload
3. cd UPload/
4. python manage.py startapp file_parse
5. cd file_parse
6. 將下面的view.py新增到view.py中
7. 在settings.py中新增file_parse
8. 在url.py中新增 url(r’^upload’,file_parse_views.upload),
9. python manage.py runserver 0.0.0.0:9999

#django中的view.py
import os
import json
import time


from django.views.decorators.csrf import csrf_exempt

date = time.strftime('%Y%m%d')
UPLOAD_FILE_PATH = '/tmp/nginx_upload/%s/' %date
isExists=os.path.exists(UPLOAD_FILE_PATH)
if not isExists:
         os.makedirs(UPLOAD_FILE_PATH)
else:
        print('path isexist!')


from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.


def index(request):
    return HttpResponse("Hello Django!")

@csrf_exempt
def upload(request):
    request_params = request.POST
    print(request_params)
    file_name = request_params['file_name']
    file_content_type = request_params['file_content_type']
    file_md5 = request_params['file_md5']
    file_path = request_params['file_path']
    file_size = request_params['file_size']

    ip_address = request.META.get('HTTP_X_REAL_IP') or request.META.get('HTTP_REMOTE_ADD')

    # save file to tmp
    new_file_name = '%s_%s' % (file_md5,file_name)
    new_file_path = ''.join([UPLOAD_FILE_PATH, new_file_name])
    with open(new_file_path, 'a') as new_file:
        with open(file_path, 'rb') as f:
            new_file.write(f.read())

    content = json.dumps({
        'name': file_name,
        'content_type': file_content_type,
        'md5': file_md5,
        'path': file_path,
        'size': file_size,
        'ip': ip_address,
    })

    print(new_file_path)
    path_dir = new_file_path.split('/')[2:]
    res = '/'.join(path_dir)
    download_url = '/'.join(('http://172.18.3.183:88',res))

    response = HttpResponse(download_url, content_type='application/json; charset=utf-8')


    return response

實現效果圖:
這裡寫圖片描述

相關推薦

nginx upload模組+python 處理模仿fastdfs實現檔案存取

前提條件: 1.編譯安裝帶有nginx upload 模組的nginx,安裝指令碼如下。 2.配置nginx的conf檔案,一個server配置upload上傳,一個server配置download下載 3.使用django快速部署python後端服務,對

Nginx利用ngx_http_upstream_module模組定義伺服器組

Nginx四層負載均衡 先利用ngx_http_upstream_module模組定義一個後端伺服器組 然後再用ngx_stream_proxy_module模組基於四層進行四層負載均衡 ngx_http_upstream_module模組相關配置可以參考下面文章 Nginx利用ng

記2017年年底,幾次Python面試

可惜了 項目 創業公司 由於 接口 現場 記得 搜狗 字符 前記:16年本科畢業,選了大公司的QA,工作一段時間後發現更喜歡做開發,遂走上了轉崗之路,在一家小公司的做了半年開發之後,由於公司原因,遂開始了艱難的投簡歷面試之路。臨近年底,工作機會不是很多,下面記錄了部分面試

處理高並發狀態的多次重復請求

由於 build 無限循環 目前 檢索 沒有 調用 body 通過   相信做Web的,都有可能遇到有多次重復請求發送到後端的情況。而這些重復請求,可能大都是由於在網絡較差的情況下,用戶多次連續點擊。最後導致後端面臨處理大量重復請求的境地。阻止這些情況發生的方法有很多。  

Nginx反向代理與服務采用連接池參數分析,長連接減少TIME_WAIT

數據 模型 業務需求 技術 nginx服務器 程序 創建 反向代理 還需 前面已經講過,在使用locust直連後端服務器時,可以通過設置HTTP頭部為keep-alive,並在客戶端斷開連接,減少服務器的連接壓力。因為由客戶端斷開連接,客戶端的連接會變為TIME_WAIT狀

python將svc檔案資料讀入資料庫具體實現

如何用python將svc檔案的資料讀入到MySQL資料庫裡,在此直接上程式碼了,感興趣的朋友可以貼程式碼測試: import pandas as pd import os from sqlalchemy import create_engine # 初始化資料庫連線,使用pymysql模組

python從資料庫請求資料給到前端的具體實現

先來貼一竄程式碼讓大家理解前端/後端/資料庫的工作原理, 首先簡要說明:前端向後端請求資料,後端根據前端請求資料的類別分析其需求,並連線到資料庫獲取相應資料: 來一段簡單的例項程式碼模擬淘寶商城: 前端程式碼: <!DOCTYPE html> <html> &

Nginx之九 Upstream伺服器組

後端伺服器組的配置 upstream指令是設定後端伺服器組的主要指令,如下所示,都是設定在upstream花括號內 指令 說明 upstream name {…} upstream指令是設

不使用框架下 python向前端返回html頁面(學習筆記1)

不使用框架下 python後端向前端返回html頁面(學習筆記1) python新手學習web伺服器原理的一些坑 本人正在嘗試開發一個倉庫管理系統的專案,為了能夠更深刻地理解後臺伺服器的開發原理,選擇儘量少地使用python現成框架,因此就無法避免各種不期而遇的大坑。現在跟大家一一分

nginx前端,tomcat伺服器獲取客戶的真實IP,包括tomcat訪問日誌獲取真實IP的配置

原文連結https://blog.csdn.net/teddy17/article/details/51744119 在安裝完以nginx+tomcat的WEB伺服器,使用預設的配置,會導致伺服器上的日誌檔案,只有nginx日誌能獲取到客戶的真實IP,而tomcat以及上面的JAVA WEB應用

Python相關技術/工具棧

平臺 環境 pow 性能 ive ont sent 工具 解釋 轉載http://python.jobbole.com/83486/ 整理下目前涉及到的python的技術棧和工具棧(用過或了解的, 其他的後續用到再補充) 編輯器 最常見: vim / SublimeTe

如何面試Python工程師?

吃午飯的時候我就一直在想這個問題,我覺得重點不是Python而是後端工程師,因為Python只是系統的一部分,linux基礎操作要熟吧,sql要懂吧,訊息佇列要知道吧,git要熟悉吧……木桶理論,每一環都不能落下,精通其中一兩環就更好了。基礎功紮實,新東西學得快

第一個SSM前端專案(六):完善註冊處理並設定郵箱啟用模式

一、註冊功能後端設計     二、根據設計可以看出我們需要redis來做啟用碼的儲存工作,因此需要在框架中繼承redis 1) 在linux伺服器中安裝redis(建議在伺服器中直接安裝,這樣正式執行的時候比較好操作),可以檢視此篇文章:騰訊雲CentOS 7.4 64

java處理XSS攻擊

解決方法新增三個類即可: XssFilter類如下: import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import or

NODE處理資料ejs 渲染到頁面(小白的筆記)

前一陣學過前端渲染和後端渲染 沒幾天就忘沒了 今天來複習一下後端渲染 記個筆記 1.安裝 首先需要express模組,fs模組,ejs模組 npm install ejs --save 2. .ejs檔案 這裡和.html一樣 所以我只粘了body裡面的程式碼

前端實時更新處理進度

1.互動邏輯: 點選頁面的“提交”button,向後臺傳送資料處理請求; 後臺處理資料; 前端根據後臺的處理進度實時更新進度條。 個人愚見:能在前端估計出進度的儘量在前端做偽實時的進度條(像傳送檔案那種),這才是上策;實在沒法估計後臺計算時間,又實在是等

如何面試Python 工程師(持續更新)

資料量和效能:當實體記憶體夠用的時候,redis>mongodb>mysql當實體記憶體不夠用的時候,redis和mongodb都會使用虛擬記憶體。實際上如果redis要開始虛擬記憶體,那很明顯要麼加記憶體條,要麼你換個資料庫了。但是,mongodb不一樣,只要,業務上能保證,冷熱資料的讀寫比,使

nginx upstream模組詳解(處理流程篇一 upstream處理

upstream 是nginx作為代理及快取的核心結構 並且請求上游  傳送至下游都能由相關聯的模組進行干預處理upstream 模組流程處理如下建立upstreamngx_int_t ngx_http_upstream_create(ngx_http_request_t *

Python架構演進

來騰訊之前在前公司做了3年的後端開發, 經歷一款SaaS產品從0到10(還沒有到100, 哈哈哈)的過程, 3年間後端的架構逐步演變, 在微服務的實踐過程中遇到的問題也越來越多, 在這裡總結下. 產品是一款服務於人力資源的SaaS線上服務, 面向HR有Web

python觀感

一定的 alt 技術 p s pycha 右移 格式 form 表單 ctrl (一) Pycharm 快捷操作 選中一行     Ctrl + c復制當前行      Ctrl + d顯示引用或調用的   Ctrl + b多行註釋         Ctrl + /刪