天天看點

線上果蔬商城(四):配置Nginx與fastDFS存取網站圖檔一. 配置FastDFS與nginx二. Django二次開發對接FastDFS

文章目錄

  • 一. 配置FastDFS與nginx
    • 1. 什麼是FastDFS
    • 2. 檔案上傳流程
    • 3. 檔案下載下傳流程
    • 4. FastDFS安裝
    • 5. 測試是否安裝成功
    • 6. 安裝nginx及fastdfs-nginx-module web伺服器 epoll
  • 二. Django二次開發對接FastDFS
開發環境

伺服器端:阿裡雲centos7,FastDFS-v6.06,nginx-1.16.1

本地端:win7-64位,Django2.2,python3.7,pycharm2018.3

一. 配置FastDFS與nginx

1. 什麼是FastDFS

FastDFS 是用 c 語言編寫的一款開源的分布式檔案系統。FastDFS 為網際網路量身定制, 充分考慮了備援備份、負載均衡、線性擴容等機制,并注重高可用、高性能等名額,使用 FastDFS 很容易搭建一套高性能的檔案伺服器叢集提供檔案上傳、下載下傳等服務。

FastDFS 架構包括 Tracker server 和 Storage server。用戶端請求 Tracker server 進行文 件上傳、下載下傳,通過 Tracker server 排程最終由 Storage server 完成檔案上傳和下載下傳。

Tracker server 作用是載均衡和排程,通過 Tracker server 在檔案上傳時可以根據一些政策找到Storage server 提供檔案上傳服務。可以将 tracker 稱為追蹤伺服器或排程伺服器。

Storage server 作用是檔案存儲,用戶端上傳的檔案最終存儲在 Storage 伺服器上, Storageserver 沒有實作自己的檔案系統而是利用作業系統 的檔案系統來管理檔案。可以将 storage 稱為存儲伺服器。

線上果蔬商城(四):配置Nginx與fastDFS存取網站圖檔一. 配置FastDFS與nginx二. Django二次開發對接FastDFS

服務端兩個角色:

Tracker:管理叢集,tracker 也可以實作叢集。每個 tracker 節點地位平等。收集 Storage 叢集的狀态。

Storage:實際儲存檔案 Storage 分為多個組,每個組之間儲存的檔案是不同的。每 個組内部可以有多個成員,組成員内部儲存的内容是一樣的,組成員的地位是一緻的,沒有 主從的概念。

2. 檔案上傳流程

線上果蔬商城(四):配置Nginx與fastDFS存取網站圖檔一. 配置FastDFS與nginx二. Django二次開發對接FastDFS

用戶端上傳檔案後存儲伺服器将檔案 ID 傳回給用戶端,此檔案 ID 用于以後通路該檔案的索引資訊。檔案索引資訊包括:組名,虛拟磁盤路徑,資料兩級目錄,檔案名。

線上果蔬商城(四):配置Nginx與fastDFS存取網站圖檔一. 配置FastDFS與nginx二. Django二次開發對接FastDFS

組名:檔案上傳後所在的 storage 組名稱,在檔案上傳成功後有 storage 伺服器傳回, 需要用戶端自行儲存。

虛拟磁盤路徑:storage 配置的虛拟路徑,與磁盤選項 store_path*對應。如果配置了 store_path0 則是 M00,如果配置了 store_path1 則是 M01,以此類推。

資料兩級目錄:storage 伺服器在每個虛拟磁盤路徑下建立的兩級目錄,用于存儲資料 檔案。

檔案名:與檔案上傳時不同。是由存儲伺服器根據特定資訊生成,檔案名包含:源存儲 伺服器 IP 位址、檔案建立時間戳、檔案大小、随機數和檔案拓展名等資訊。

3. 檔案下載下傳流程

線上果蔬商城(四):配置Nginx與fastDFS存取網站圖檔一. 配置FastDFS與nginx二. Django二次開發對接FastDFS

簡易FastDFS架構

線上果蔬商城(四):配置Nginx與fastDFS存取網站圖檔一. 配置FastDFS與nginx二. Django二次開發對接FastDFS

4. FastDFS安裝

安裝fastdfs依賴包:下載下傳位址

  1. 解壓縮libfastcommon-master.zip
  2. 進入到libfastcommon-master的目錄中
  3. 執行 ./make.sh
  4. 執行 sudo ./make.sh install

安裝fastdfs:下載下傳位址

  1. 解壓縮fastdfs-master.zip
  2. 進入到 fastdfs-master目錄中
  3. 執行 ./make.sh
  4. 執行 sudo ./make.sh install

配置跟蹤伺服器tracker:

  1. sudo cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
  2. 在/home/python/目錄中建立目錄 fastdfs/tracker mkdir –p /home/python/fastdfs/tracker
  3. 編輯/etc/fdfs/tracker.conf配置檔案 sudo vim /etc/fdfs/tracker.conf修改 base_path=/home/python/fastdfs/tracker

配置存儲伺服器storage:

  1. sudo cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
  2. 在/home/python/fastdfs/ 目錄中建立目錄 storage

    mkdir –p /home/python/fastdfs/storage

  3. 編輯/etc/fdfs/storage.conf配置檔案 sudo vim /etc/fdfs/storage.conf

    修改内容:

    base_path=/home/python/fastdfs/storage

    store_path0=/home/python/fastdfs/storage

    tracker_server=自己伺服器的ip位址:22122

啟動tracker 和 storage

sudo service fdfs_trackerd start

sudo service fdfs_storaged start

線上果蔬商城(四):配置Nginx與fastDFS存取網站圖檔一. 配置FastDFS與nginx二. Django二次開發對接FastDFS

重新開機:

sudo /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart

sudo /usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart

終止:

sudo /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf stop

sudo /usr/bin/fdfs_storaged /etc/fdfs/storage.conf stop

5. 測試是否安裝成功

  1. sudo cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
  2. 編輯/etc/fdfs/client.conf配置檔案 sudo vim /etc/fdfs/client.conf

    修改内容:

    base_path=/home/python/fastdfs/tracker

    tracker_server=自己ubuntu虛拟機的ip位址:22122

  3. 上傳檔案測試:

    fdfs_upload_file /etc/fdfs/client.conf 要上傳的圖檔檔案

    如果傳回類似group1/M00/00/00/rBIK6VcaP0aARXXvAAHrUgHEviQ394.jpg的檔案id則說明檔案上傳成功

    線上果蔬商城(四):配置Nginx與fastDFS存取網站圖檔一. 配置FastDFS與nginx二. Django二次開發對接FastDFS

6. 安裝nginx及fastdfs-nginx-module web伺服器 epoll

  1. 解壓縮 nginx-1.16.1.tar.gz
  2. 解壓縮 fastdfs-nginx-module-master.zip
  3. 進入nginx-1.16.1目錄中
  4. 執行

    sudo ./configure --prefix=/usr/local/nginx/ --add-module=fastdfs-nginx-module-master解壓後的目錄的絕對路徑/src

    sudo ./make

    sudo ./make install

  5. sudo cp fastdfs-nginx-module-master解壓後的目錄中src下的mod_fastdfs.conf /etc/fdfs/mod_fastdfs.conf
  6. sudo vim /etc/fdfs/mod_fastdfs.conf

    修改内容:

    connect_timeout=10

    tracker_server=自己伺服器的ip位址:22122

    url_have_group_name=true

    store_path0=/home/python/fastdfs/storage

  7. sudo cp 解壓縮的fastdfs-master目錄conf目錄中的http.conf /etc/fdfs/http.conf
  8. sudo cp 解壓縮的fastdfs-master目錄conf目錄中的mime.types /etc/fdfs/mime.types
  9. sudo vim /usr/local/nginx/conf/nginx.conf

    在http部分中添加配置資訊如下:

    server {

    listen 8888;

    server_name localhost;

    location ~/group[0-9]/ {

    ngx_fastdfs_module;

    }

    error_page 500 502 503 504 /50x.html;

    location = /50x.html {

    root html;

    }

    }

啟動nginx

sudo /usr/local/nginx/sbin/nginx

線上果蔬商城(四):配置Nginx與fastDFS存取網站圖檔一. 配置FastDFS與nginx二. Django二次開發對接FastDFS

在本地浏覽器進行通路剛才在伺服器上傳的檔案:ip位址:8888/檔案id,圖檔加載成功

線上果蔬商城(四):配置Nginx與fastDFS存取網站圖檔一. 配置FastDFS與nginx二. Django二次開發對接FastDFS

使用python用戶端上傳

pip install py3Fdfs

線上果蔬商城(四):配置Nginx與fastDFS存取網站圖檔一. 配置FastDFS與nginx二. Django二次開發對接FastDFS

項目上傳圖檔和使用圖檔流程

線上果蔬商城(四):配置Nginx與fastDFS存取網站圖檔一. 配置FastDFS與nginx二. Django二次開發對接FastDFS

二. Django二次開發對接FastDFS

https://docs.djangoproject.com/en/2.2/ref/files/storage/

https://docs.djangoproject.com/en/2.2/howto/custom-file-storage/.

之前踩過的坑,參考部落格

配置檔案settings中加入如下配置

# 設定Django的檔案存儲類
DEFAULT_FILE_STORAGE='utils.fdfs.storage.FDFSStorage'

# Fdfs存儲參數 用戶端配置檔案同伺服器端,伺服器位址
SERVER_IP = 'http://xxxxxxxx'
CUSTOM_STORAGE_OPTIONS = {
    'CLIENT_CONF': './utils/fdfs/client.conf',
    'BASE_URL': SERVER_IP + ':8888/',
}
           

建立utils/fdfs 目錄

線上果蔬商城(四):配置Nginx與fastDFS存取網站圖檔一. 配置FastDFS與nginx二. Django二次開發對接FastDFS

storage.py檔案中自定義檔案存儲類

from django.core.files.storage import Storage
from django.conf import settings
from fdfs_client.client import Fdfs_client, get_tracker_conf
from django.utils.deconstruct import deconstructible

@deconstructible
class FDFSStorage(Storage):
    """fast dfs檔案存儲類"""
    def __init__(self, option=None):
        if not option:
            self.option = settings.CUSTOM_STORAGE_OPTIONS
        else:
            self.option = option

    def _open(self, name, mode='rb'):
        '''打開檔案時使用'''
        pass

    def _save(self, name, content):
        """
        在FastDFS中儲存檔案
        :param name: 傳入的檔案名
        :param content: 檔案内容
        :return: 儲存到資料庫中的FastDFS的檔案名
        """
        client_conf_obj = get_tracker_conf(self.option.get('CLIENT_CONF'))
        client = Fdfs_client(client_conf_obj)
        ret = client.upload_by_buffer(content.read())
        if ret.get("Status") != "Upload successed.":
            raise Exception("upload file failed")
        file_name = ret.get("Remote file_id")

        # file_name為bytes類型,隻能傳回str類型,不然會報錯
        return file_name.decode()

    def exists(self, name):
        '''Django判斷檔案名是否可用'''
        return False

    def url(self, name):
        '''傳回通路檔案的url路徑'''
        return self.option.get('BASE_URL') + name
           
線上果蔬商城(四):配置Nginx與fastDFS存取網站圖檔一. 配置FastDFS與nginx二. Django二次開發對接FastDFS
核心知識點

fastDFS:

海量存儲,容量拓展友善

去重

結合nginx,提高網站提供圖檔的效率

流程:上傳 使用 在Django上自定義檔案存儲類的編寫

繼續閱讀