基于C语言开发的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
第六步,配置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 要上传的文件路径
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服务器的文件
下载用于交互的第三方库
链接: 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’}
相关中文文档: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’
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