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/+文件存储的唯一标志。