FastDFS 是一个轻量级的开源分布式文件系统;FastDFS 主要解决了大容量的文件存储和高并发访问的问题,文件存取时实现均衡负载;FastDFS 实现了软件方式的 RAID,可以使用廉价的 IDE 硬盘进行存储;支持存储服务器在线扩容;支持相同内容的文件只保存一份,节约磁盘空间;FastDFS 特别适合大中型网站使用,用来存储资源文件(如:图片、文档、音频、视频等等);FastDFS 是一个开源的轻量级分布式文件系统,由跟踪服务器、存储服务器和客户端三个部分组成,主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size < 500MB)为载体的在线服务。
一、 安装 FastDFS
① 下载地址
https://github.com/happyfish100/fastdfs/releases
② 解压 FastDFS
# cd /usr/local/src/
# tar -zxvf FastDFS_v5.05.tar.gz
# cd FastDFS
③ 下载 libfastcommon
下载地址
https://github.com/happyfish100/libfastcommon
④ 解压 libfastcommon
# cd /usr/local/src/
# unzip libfastcommon-master.zip
⑤ 编译、安装
(编译前要确保已经成功安装了 libfastcommon)
# cd FastDFS
# ./make.sh
# ./make.sh install
采用默认安装的方式安装,安装后的相应文件与目录
因为FastDFS服务脚本设置的bin目录是 /usr/local/bin,但实际命令安装在 /usr/bin,可以进入 /user/bin 目录使用以下命令查看fdfs的相关命令:
# cd /usr/bin/
# ls | grep fdfs
二、django 集成 FastDFS
pip install fdfs_client-py==1.2.6
① fastdfs存储工具类
from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client
from django.conf import settings
class FastDFSStorage(Storage):
"""fastdfs存储工具类, 提供给django使用"""
def __init__(self, client_conf=None, fastdfs_url=None):
"""初始化,设置参数"""
if client_conf is None:
client_conf = settings.FASTDFS_CLIENT
self.client_conf = client_conf
if fastdfs_url is None:
fastdfs_url = settings.FASTDFS_URL
self.fastdfs_url = fastdfs_url
def _open(self, name, mode='rb'):
"""打开文件时使用"""
pass
def _save(self, name, content):
"""保存文件时使用"""
# content是用户上传过来的文件对象, 如果想获取文件的内容,使用read方法读取
# 创建fastdfs客户端的工具对象
client = Fdfs_client(self.client_conf)
# 借助client客户端,向fastdfs发送文件
file_data = content.read() # 读取文件内容
try:
ret = client.upload_by_buffer(file_data)
except Exception as e:
print(e)
raise
# {'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.243.133'}
# 根据返回值进行判断
if ret.get("Status") == "Upload successed.":
# 表示上传到fastdfs服务器成功
file_id = ret.get("Remote file_id")
# 将文件名返回,django会保存到数据库中
return file_id
else:
# 表示上传到fastdfs服务器时出现了问题
raise Exception("上传FastDFS服务器出现问题")
def exists(self, name):
"""django用来判断文件是否存在"""
return False
def url(self, name):
"""返回文件的完整路径名,django会调用"""
return self.fastdfs_url + name
② fastdfs 参数配置
在项目的 settings.py 文件中配置
# 使用的文件存储工具
DEFAULT_FILE_STORAGE = "utils.fastdfs.storage.FastDFSStorage"
# FastDFS使用的配置信息
FASTDFS_CLIENT = os.path.join(BASE_DIR, "utils/fastdfs/client.conf")
FASTDFS_URL = "http://192.168.108.57:8888/"
③ 配置 Nginx
# connect timeout in seconds
# default value is 30s
connect_timeout=30
network_timeout=60
base_path=/Users/delron/Desktop
tracker_server=192.168.108.57:22122
log_level=info
use_connection_pool = false
connection_pool_max_idle_time = 3600
load_fdfs_parameters_from_tracker=false
use_storage_id = false
storage_ids_filename = storage_ids.conf
#HTTP settings
http.tracker_server_port=80
#use "#include" directive to include HTTP other settiongs
##include http.conf