python开发之FastDFS分布式存储系统整合Nginx部署重写Django项目文件传输行为

目录

  • FastDFS业务场景概述
  • 部署FastDFS
  • 整合FastDFS和Nginx
  • FastDFS与Python交互
  • 重写Django项目文件传输行为

FastDFS业务场景概述

基于C语言开发的FastDFS是一项开源轻量级分布式文件系统,主要用于海量数据存储,有方便的可拓展性,记录文件指纹防止重复文件上传占用容量,主要用于电商平台等文件数据量大的系统

部署FastDFS

第一步,安装FastDFS依赖包

#下载依赖包
wget https://github.com/happyfish100/libfastcommon/archive/V1.0.7.tar.gz

#解压
tar -zxvf  V1.0.7.tar.gz

#进入目录后编译
./make.sh

#安装
./make.sh install

#设置软链接
ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so
ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so
ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so
ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so

第二步,安装FastDFS服务(安装完成后的配置目录:/etc/fdfs/…)

#下载fastDFS安装包
wget https://github.com/happyfish100/fastdfs/archive/V5.05.tar.gz

#解压
tar -zxvf  V5.05.tar.gz

#进入目录后编译
./make.sh

#安装
./make.sh install

第三步,在FastDFS服务配置目录下配置tracker服务器,指定tracker服务器基本目录路径

#创建基本目录存储data和logs文件(该目录可自定义)
mkdir -p /var/chenchong/fdfs/tracker

#将配置目录中的tracker服务器配置样例文件拷贝一份,做真正的tracker配置文件
cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf

#编辑tracker.conf配置文件,指定tracker服务器基本目录路径
base_path=/var/chenchong/fdfs/tracker

#启动 tracker 服务
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf

#退出 tracker 服务
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf stop

#重启 tracker 服务
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart

#查看是否有 tracker 进程
ps aux | grep tracker

第四步,配置storage服务器

#创建基本目录存储data和logs文件(该目录可自定义)
mkdir -p /var/chenchong/fdfs/storage

#将配置目录中的storage服务器配置样例文件拷贝一份,做真正的storage配置文件
cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf

#编辑storage.conf配置文件,指定storage服务器基本目录路径
base_path=/var/chenchong/fdfs/storage

#指定storage服务器文件存储路径(图片实际存放路径,如果有多个,这里可以有多行"base_path1=/var/chenchong/fdfs/storage1")
base_path0=/var/chenchong/fdfs/storage

#指定调度服务器tracker的IP地址和端口
tracker_server=tracker服务器IP:端口

#启动 storage服务
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf

#退出 storage服务
/usr/bin/fdfs_storaged /etc/fdfs/tracker.conf stop

#重启 storage服务
/usr/bin/fdfs_storaged /etc/fdfs/tracker.conf restart

#查看是否有 storage进程
ps aux | grep storaged

第五步,检测tracker和storage是否能联通

fdfs_monitor /etc/fdfs/storage.conf
python开发之FastDFS分布式存储系统整合Nginx部署重写Django项目文件传输行为_第1张图片

第六步,配置client客户端

#将配置目录中的client客户端配置样例文件拷贝一份,做真正的client配置文件
cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf

#编辑client.conf客户端配置文件,修改基本目录路径为调度服务器tracker的基本路径
base_path=/var/chenchong/fdfs/tracker

#指定调度服务器tracker的IP地址和端口(本机也可以使用0.0.0.0,切记不可使用127.0.0.1)
tracker_server=tracker服务器IP:端口

第七步,客户端使用

#使用fdfs_upload_file 命令指定文件上传到存储服务器
#如果返回类似group1/M00/00/00/wKj-iV6ESVqAeBq7AAAAAAAAAAA524.txt的文件id则说明文件上传成功
fdfs_upload_file /etc/fdfs/client.conf 要上传的文件路径

整合FastDFS和Nginx

nginx和nginx插件下载与解压

#下载nginx
wget http://nginx.org/download/nginx-1.11.8.tar.gz

#下载nginx插件,用于连接FastDFS服务
wget http://jaist.dl.sourceforge.NET/project/fastdfs/FastDFS%20Nginx%20Module%20Source%20Code/fastdfs-nginx-module_v1.16.tar.gz

#解压 Nginx到opt目录下(随意)
tar zxvf nginx-1.11.8.tar.gz -C /opt

#解压 Nginx 模块插件到opt目录下(随意)
tar zxvf fastdfs-nginx-module_v1.16.tar.gz -C /opt

nginx插件配置

#进入nginx插件解压后的目录编辑配置文件修改nginx插件的fdfs配置路径为正确路径
vim src/config

#去掉路径中的local,因为实际安装fastdfs时、是放到了/usr/include下
将 CORE_INCS="$CORE_INCS /usr/local/include/fastdfs /usr/local/include/fastcommon/"
修改为CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"

将 CORE_LIBS="$CORE_LIBS -L/usr/local/lib -lfastcommon -lfdfsclient"
修改为 CORE_LIBS="$CORE_LIBS -L/usr/lib -lfastcommon -lfdfsclient"

nginx安装


#进入解压的nginx目录下配置nginx安装后文件路径(最后的 --add-module参数后填fastdfs-nginx-module插件目录中的src目录的绝对路径,表示将插件安装到nginx)
#--sbin-path指定sbin目录路径,默认是/usr/local/nginx/sbin/nginx,用于启动服务
#--conf-path指定nginx.conf路径,默认是/usr/local/nginx/conf/nginx.conf,用于修改nginxWeb规则
sudo ./configure  --prefix=/usr/local/nginx --sbin-path=/usr/local/bin/nginx --conf-path=/usr/local/etc/nginx/nginx.conf --pid-path=/usr/local/var/run/nginx.pid --lock-path=/usr/local/var/run/nginx.lock --error-log-path=/usr/local/var/log/nginx/^Cror.log --http-log-path=/usr/local/var/log/nginx/access.log --with-http_gzip_static_module --with-http_stub_status_module --with-http_ssl_module --with-file-aio --add-module=/opt/fastdfs-nginx-module/src

#编译
make

#安装
make install

整合nginx和fastdfs插件

#copy fastdfs-nginx-module(nginx插件)的配置文件到 /etc/fdfs下
cp /opt/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/mod_fastdfs.conf

#编辑mod_fdfs.conf
vim /etc/fdfs/mod_fastdfs.conf

#编辑内容如下,连接超时时间,tracker服务器地址和端口,存储服务器基本目录路径
connect_timeout=10
base_path=/var/chenchong/fdfs
tracker_server=192.168.254.139:22122
url_have_group_name = true
store_path0=/var/chenchong/fdfs/storage

#复制之前解压的fastdfs安装目录下的http.conf和mime.types文件到/etc/fdfs目录下
cp mime.types http.conf /etc/fdfs/

配置nginx的web服务
根据安装nginx时所指定的路径编辑nginxWeb服务器配置文件
vim /usr/local/etc/nginx/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服务
按照之前配置的路径启动nginx服务
/usr/local/bin/nginx

相关命令:
// 重启
/usr/local/bin/nginx -s reload
// 停止
/usr/local/bin/nginx -s stop
浏览器中输入127.0.0.1:8888/group1/M00/00/00/wKj-iV6ESVqAeBq7AAAAAAAAAAA524.txt即可访问之前上传到storage服务器的文件

FastDFS与Python交互

下载用于交互的第三方库
链接: https://pan.baidu.com/s/1pYO7kuoDDarYhgC1DFvcHw
提取码: gb9y

pip install fdfs_client-py-master.zip
pip install mutagen
pip install requests

使用
from fdfs_client.client import Fdfs_client
client = Fdfs_client(’/etc/fdfs/client.conf’)
ret = client.upload_by_filename(‘test’)

返回值ret变量是一个字典(根据返回值判断上传状态):
{‘Group name’:‘group1’,‘Status’:‘Upload successed.’, ‘Remote file_id’:‘group1/M00/00/00/
wKjzh0_xaR63RExnAAAaDqbNk5E1398.py’,‘Uploaded size’:‘6.0KB’,‘Local file name’:‘test’
, ‘Storage IP’:‘192.168.254.139’}

重写Django项目文件传输行为

相关中文文档:https://yiyibooks.cn/xx/django_182/howto/custom-file-storage.html
django的 文件存储路径一般是static/media,默认的文件存储FileSystemStorage类基于Storage类实现,主要是将文件保存到设置文件中指定的MEDIA_ROOT路径下,我们可以自定义FDFSStorage存储类连接远程存储服务器,并且将其设置为默认的文件存储类
示例:DEFAULT_FILE_STORAGE=‘utils.fdfs.storage.FDFSStorage’
python开发之FastDFS分布式存储系统整合Nginx部署重写Django项目文件传输行为_第2张图片

根据所示目录结构创建目录及文件存放文件存储类
python开发之FastDFS分布式存储系统整合Nginx部署重写Django项目文件传输行为_第3张图片

settings.py文件配置

# 设置Django的默认文件存储类为我们自定义的文件存储类
DEFAULT_FILE_STORAGE = 'utils.fdfs.storage.FDFSStorage'

# 设置fdfs使用的client.conf文件路径
FDFS_CLIENT_CONF = './utils/fdfs/client.conf'

# 设置fdfs存储服务器上nginx的IP和端口号
FDFS_URL = 'http://192.168.20.100:8888/'

重写Storage类

from django.core.files.storage import Storage
from django.conf import settings
from fdfs_client.client import Fdfs_client

class FDFSStorage(Storage):
    '''fast dfs文件存储类'''
    def __init__(self, client_conf=None, base_url=None):
        '''初始化,调用时可指定客客户端配置文件和nginx反向代理地址'''
        if client_conf is None:
            client_conf = settings.FDFS_CLIENT_CONF
        self.client_conf = client_conf

        if base_url is None:
            base_url = settings.FDFS_URL
        self.base_url = base_url

    def _open(self, name, mode='rb'):
        '''打开文件时使用'''
        pass

    def _save(self, name, content):
        '''保存文件时使用'''
        # name:你选择上传文件的名字
        # content:包含你上传文件内容的File对象

        # 创建一个Fdfs_client对象
        client = Fdfs_client(self.client_conf)

        # 上传文件到fast dfs系统中
        res = client.upload_by_buffer(content.read())

        # 返回的dict示例
        # {
        #     'Group name': group_name,
        #     'Remote file_id': remote_file_id,
        #     'Status': 'Upload successed.',
        #     'Local file name': '',
        #     'Uploaded size': upload_size,
        #     'Storage IP': storage_ip
        # }
        if res.get('Status') != 'Upload successed.':
            # 上传失败
            raise Exception('上传文件到fast dfs失败')

        # 获取返回的文件ID
        filename = res.get('Remote file_id')

        return filename

    def exists(self, name):
        '''Django判断文件名是否可用'''
        return False

    def url(self, name):
        '''返回访问文件的url路径'''
        # 返回值示例:192.168.20.100:8888/group1/M00/00/00/wKjzh0_xaR63RExnCCCaDqbNk5E1398.png
        return self.base_url+name

Django访问远程存储服务器资源
在这里插入图片描述

你可能感兴趣的:(unix运维,WEB后端开发,分布式,nginx,linux,centos,python)