在django项目中搭建分布式图片服务器fastdfs

FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。跟踪器主要做调度工作,在访问上起负载均衡的作用。
搭建流程:

一,安装

安装libfastcommon:

 wget https://github.com/happyfish100/libfastcommon/archive/V1.0.38.tar.gz

安装FastDFS

wget https://github.com/happyfish100/fastdfs/archive/V5.11.tar.gz

安装Nginx

wget http://nginx.org/download/nginx-1.15.2.tar.gz

安装fastdfs-nginx-module

wget https://github.com/happyfish100/fastdfs-nginx-module/archive/V1.20.tar.gz

解压后,先配置libfastcommon和FastDFS
文件是用C语言写的,所以我们还需要cd到解压后的文件目录中执行

./make.sh
./make.sh install

二,配置tracker

编译成功后, cd 进入/etc/fdfs目录中,可以看到3个带.sample后缀的模板配置文件,我们先修改tracker.conf.sample 为tracker.conf
里面进行如下修改:

base_path=/home/xx/fdfs/tarcher   #tracker存储data和log的跟路径,必须事前存在
port=23000  #tracker默认23000
http.server_port=80 #使用http服务器的端口。

三,配置Storage

同上,修改storage.conf.sample为storage.conf。
里面进行如下修改:

base_path=/home/xx/fdfs/storage   #storage存储data和log的跟路径,必须提前创建好
port=23000  #storge默认23000,同一个组的storage端口号必须一致
group_name=group1  #默认组名,根据实际情况修改
store_path_count=1  #存储路径个数,需要和store_path个数匹配
store_path0=/home/xx/fdfs/storage  #配置存储路径,若有多个存储节点可继续配置store_path1.。。
tracker_server=192.168.8.33:22122 #配置本storage监听的tracker的机器的ip和port

配置完后启动:
最好写绝对路径,不然会出现找不到文件的错误
fdfs_storaged /etc/fdfs/tracker.conf start
fdfs_storaged /etc/fdfs/storage.conf start

四,配置nignx

进入nginx目录

配置加载fastdfs-nginx-module模块

–prefix=/usr/local/nginx指的是指定安装nginx后的文件路径,
add-module=/home/fastdfs-nginx-module-1.20/src/指的是fastdfs-nginx-module的src子文件夹的路径。

./configure --prefix=/usr/local/nginx --add-module=/home/fastdfs-nginx-module-1.20/src/

由于版本问题会出现的错误:

XXXXX......error: common_define.h: No such file or directory

需vi fastdfs-nginx-module-1.20/src/config
修改下面两行代码,然后再进行配置:

ngx_module_incs="/usr/include/fastdfs /usr/include/fastcommon/"
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"

配置完后进行编译:

make
make install

出现Leaving directory ‘/home/python/nginx-1.15.2’ 可以忽略。

配置mod-fastdfs.conf:

把 fastdfs-nginx-module-1.20/src/下的mod_fastdfs.conf 文件放到fdfs目录下。

cd fastdfs-nginx-module-1.20/src/
cp mod_fastdfs.conf /etc/fdfs

进行如下修改:

base_path=/home/xx/fdfs
tracker_server=192.168.8.33:22122 #tracker的地址
url_have_group_name=true #url是否包含group名称
storage_server_port=23000 #需要和storage配置的相同
store_path_count=1  #存储路径个数,需要和store_path个数匹配
store_path0=/home/xx/fdfs/storage #文件存储的位置

配置nginx

cd /usr/local/nginx/conf/
vi nginx.conf

server {
    listen       80;
    server_name  localhost;
    location ~/group[0-9]/{
        ngx_fastdfs_module;
    }
    location / {
        root   html;
        index  index.html index.htm;
    }
     error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }

拷贝相关依赖

cd /usr/local/src/fastdfs-5.11/conf
cp mime.types http.conf /etc/fdfs/

五,配置FastDFS启动客户端

cd /etc/fdfs
cp client.conf.sample client.conf

修改如下:

base_path=/home/xx/fdfs/tracker  //tracker服务器文件路径
tracker_server=192.168.8.33:22122 //tracker服务器IP地址和端口号
http.tracker_server_port=80 # tracker服务器的http端口号,必须和tracker的设置对应起来

六,植入django项目中

安装依赖
下载路径:https://github.com/jefforeilly/fdfs_client-py
pip install fdfs_client-py-master.zip
配置参数django的setting.py

#设置Django的文件存储类
DEFAULT_FILE_STORAGE='utils.fdfs.storage.FDFSStorage'
#设置fdfs使用的client.conf文件路径(把fdfs文件目录下的client.conf文件拷贝到项目中)
FDFS_CLIENT_CONF='./fdfs/client.conf'
#设置fdfs存储服务器上ngix的IP和端口号
FDFS_URL='http://192.168.8.33:80/'

封装存储文件到fdfs行为(修改django文件上传行为):
torage.py

from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client
from django.conf import settings
class FDFSStorage(Storage):
    def _open(self,name,mode='rb'):
        pass
def _save(self,name,content):
    #创建一个Fdfs_client对象
    client=Fdfs_client(settings.FDFS_CLIENT_CONF)
    #上传文件到fast dfs系统中
    res=client.upload_by_buffer(content.read())
    if res == None:
        raise Exception('上传 失败')
    filename = res.get('Remote file_id')
    return filename
def exists(self, name):
    '''django判断文件名是否可用'''
    return False
def url(self, name):
    '''返回访问文件的url路径'''
    return settings.FDFS_URL+name

至此服务器fastdfs的植入完成。
在前端获取图片的时候则直接使用
例:

<img src="{{ books.image.url }}"></a>

{{ books.image.url }} =http://192.168.8.33:80/+文件存储的唯一标志。

参考自:
https://www.cnblogs.com/handsomeye/p/9451568.html

猜你喜欢

转载自blog.csdn.net/weixin_43778491/article/details/87966849