DJANGO-天天生鲜项目从0到1-005-FastDFS与Nginx打造自定义文件存储系统
本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习
https://www.bilibili.com/video/BV1vt41147K8?p=1
FastDFS
FastDFS 是用 c 语言编写的一款开源的分布式文件系统。FastDFS 为互联网量身定制, 充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用 FastDFS 很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
FastDFS 架构包括 Tracker server 和 Storage server。客户端请求 Tracker server 进行文 件上传、下载,通过 Tracker server 调度最终由 Storage server 完成文件上传和下载。
Tracker server 作用是负载均衡和调度,通过 Tracker server 在文件上传时可以根据一些 策略找到 Storage server 提供文件上传服务。可以将 tracker 称为追踪服务器或调度服务 器。
Storage server 作用是文件存储,客户端上传的文件最终存储在 Storage 服务器上, Storageserver 没有实现自己的文件系统而是利用操作系统 的文件系统来管理文件。可以将 storage 称为存储服务器。
文件上传流程:

文件下载流程:

FastDFS安装
可自行查找下载,这里提供一个网盘链接,包括了几个需要用到的包,将其都下载至/usr/local目录下(或自己想要的目录)
链接:https://pan.baidu.com/s/1TjHyZ9hf2VEywNCCrR08VA
提取码:8zks
安装fastdfs依赖包
1. 解压缩libfastcommon-master.zip
2. 进入到libfastcommon-master的目录中
3. 执行 ./make.sh
4. 执行 ./make.sh install
安装fastdfs
1. 解压缩fastdfs-master.zip
2. 进入到 fastdfs-master目录中
3. 执行 ./make.sh
4. 执行 ./make.sh install
配置跟踪服务器tracker
创建配置文件
cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
在/home/python/目录中创建目录 fastdfs/tracker
mkdir -p /home/python/fastdfs/tracker
编辑/etc/fdfs/tracker.conf配置文件
vim /etc/fdfs/tracker.conf
修改内容,base_path存放了tracker的数据文件和日志文件
base_path=/home/python/fastdfs/tracker
配置存储服务器storage
创建配置文件
/etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
在/home/python/fastdfs/ 目录中创建目录 storage
mkdir -p /home/python/fastdfs/storage
编辑/etc/fdfs/storage.conf配置文件
vim /etc/fdfs/storage.conf
修改内容,base_path存放了tracker的数据文件和日志文件,注意tracker_server的ip我开始用的localhost,但是发现storage启动不起来,后面启动起来了也会报错,所以建议写成IP地址
base_path=/home/python/fastdfs/storage
store_path0=/home/python/fastdfs/storage
tracker_server=安装机器的ip地址:22122
启动tracker 和 storage
启动:
service fdfs_trackerd start
service fdfs_storaged start
或者
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf
重启:
service fdfs_trackerd restart
service fdfs_storaged restart
或者
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
查看启动是否成功
ps -ef | grep fdfs
配置本地客户端测试安装是否成功
创建配置文件
cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
编辑/etc/fdfs/client.conf配置文件
vim /etc/fdfs/client.conf
修改内容:base_path存放了tracker的数据文件和日志文件,tracker_server的ip可以写成localhost
base_path=/home/python/fastdfs/tracker
tracker_server=安装机器的ip地址:22122
上传文件测试:
fdfs_upload_file /etc/fdfs/client.conf 要上传的图片文件路径
如果返回类似group1/M00/00/00/rBIK6VcaP0aARXXvAAHrUgHEviQ394.jpg的文件id则说明文件上传成功

安装nginx及fastdfs-nginx-module
1. 解压缩 nginx-1.8.1.tar.gz
2. 解压缩 fastdfs-nginx-module-master.zip
3. 进入nginx-1.8.1目录中
4. 安装:
./configure --prefix=/usr/local/nginx/ --add-module=fastdfs-nginx-module-master解压后的目录的绝对路径/src
编辑和安装:
make & make install
5. 复制mod_fastdfs配置文件:
cp fastdfs-nginx-module-master解压后的目录中src下的mod_fastdfs.conf /etc/fdfs/mod_fastdfs.conf
6. 编辑配置文件
vim /etc/fdfs/mod_fastdfs.conf
修改内容:tracker_server可以写成localhost
connect_timeout=10
tracker_server=安装机器的ip地址:22122
url_have_group_name=true
store_path0=/home/python/fastdfs/storage
7. 复制文件
cp 解压缩的fastdfs-master目录下conf中的http.conf /etc/fdfs/http.conf
cp 解压缩的fastdfs-master目录下conf中的mime.types /etc/fdfs/mime.types
8. 编辑Nginx配置文件
vim /usr/local/nginx/conf/nginx.conf
在http部分中添加配置信息如下:注意不是修改原有的端口为80的server信息,而是新加一个server信息
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;
}
}
9. 启动Nginx
/usr/local/nginx/sbin/nginx
将上面上传返回的值(group1/M00/00/00/wKi3gV6o8TGAb-PoAAA2pLUeB60896.jpg)拼接在Nginx服务url后面,即http://192.168.183.129:8888/group1/M00/00/00/wKi3gV6o8TGAb-PoAAA2pLUeB60896.jpg
可以访问到那个文件

使用python客户端上传测试
进入虚拟环境,进入fdfs_client-py-master.zip所在目录,进行.zip源码安装
pip install fdfs_client-py-master.zip
>>> 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.243.133'}
自定义文件存储系统
创建目录文件
django默认的文件存储类使用的是 FileSystemStorage,它是Storage的子类,我们想自定义文件存储类的话不能直接修改原FileSystemStorage类,而是新建一个同样继承Storage的类
在项目根目录下新建utils包,再其中新建fasfdfs包,在包中创建文件storage.py,同时把上面修改后的/etc/fdsf/client.conf文件放至该包中

编辑storage.py
from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client
from django.conf import settings class FdfsStorage(Storage): def __init__(self, client_conf=settings.FDFS_CLIENT_CONF,
base_url=settings.NGINX_URL):
'''新增属性client_conf和base_url'''
self.client_conf = client_conf
self.base_url = base_url '''自定义存储类'''
def _open(self, name, mode='rb'):
'''文件打开'''
passdef _save(self, name, content):
'''文件保存, name为上传文件名,content为文件内容'''
# name:选择上传文件的名字
# content:包含上传文件内容的File对象 # 创建client对象
client = Fdfs_client(self.client_conf)
# 上传文件,获取返回信息
res = client.upload_by_buffer(content.read())
# {'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'}
# 判断是否上传成功
print(res)
print(res['Status'])
if res['Status'] != 'Upload successed.':
raise Exception('上传失败!')
filename = res['Remote file_id']
# 即返回的文件名为:group1/M00/00/00/wKi3gV6pIcWACYB-AAA3sZPrVzQ3331212
return filename def exists(self, name):
'''判断文件名是否已存在'''
return False def url(self, name):
'''返回访问文件的url路径'''
# name为group1/M00/00/00/wKi3gV6pIcWACYB-AAA3sZPrVzQ3331212
# url应该为Nginx地址/group1/M00/00/00/wKi3gV6pIcWACYB-AAA3sZPrVzQ3331212
return self.base_url+name
注意:
1. 定义的类需要继承Storage类
2. 子类必须重写_open(self, name, mode='rb')、_save(self, name, content)方法,而exists(self, name)、url(self, name)方法也必须重写,不然后续操作会报错
3. 这里用不到_open方法,所以直接写pass就好了
4. _save中传入的content参数为包含上传文件内容的File对象,通过content.read()读取里面的内容,并通过client.upload_by_buffer方法上传
5. 上传返回的信息中,Status为上传状态,Remote file_id为上传成功后fdsf返回的文件名
6. url(self, name)方法返回的url是指上传成功后,访问文件时在Nginx上请求的地址,在后台管理界面,点击新上传的文件后就会调用该方法,并且在模板文件中,img标签的src属性应该写成"模型.字段名.url"的形式,这样也会调用该url()方法,将文件的url返回给模板
<img src="{{ goods.image.url }}">
7. 因为该自定的文件存储类需要用到client.conf文件和Nginx地址,不想把值直接写死在类中,但是重写的方法中的参数是固定的,所以重写了__init__方法,将这两个参数设为该类的两个属性
编辑settings.py文件
# Fastdfs的客户端配置文件路径
FDFS_CLIENT_CONF = 'utils/fastdfs/client.conf'
# 让Django上传文件时调用自定义的文件存储类
DEFAULT_FILE_STORAGE = 'utils.fastdfs.storage.FdfsStorage'
# nginx服务器url路径,LOCAL_IP为定义的变量,值为本机ip地址
NGINX_URL = 'http://%s:8888/'%(LOCAL_IP)
进入后台管理面页面测试
添加商品种类

点击保存

点击进入刚添加的商品种类

DJANGO-天天生鲜项目从0到1-005-FastDFS与Nginx打造自定义文件存储系统的更多相关文章
- django天天生鲜项目
.后台admin管理天天生鲜商品信息 models里 from django.db import modelsfrom tinymce.models import HTMLField #需要pip安装 ...
- DJANGO-天天生鲜项目从0到1-007-首页静态化与缓存
本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...
- python 天天生鲜项目
python 天天生鲜项目 django版:https://github.com/Ivy-1996/fresh flask版:https://github.com/Ivy-1996/flask-fre ...
- Django之天天生鲜项目
准备工作 1.配置settings.py内置文件 注意: AUTH_USER_MODEL配置参数要在第一次迁移数据库之前配置,否则可能django的认证系统工作不正常 2.创建应用 3.配置主路由 一 ...
- DJANGO-天天生鲜项目从0到1-012-订单-用户订单页面
本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...
- DJANGO-天天生鲜项目从0到1-011-订单-订单提交和创建
本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...
- DJANGO-天天生鲜项目从0到1-010-购物车-购物车操作页面(勾选+删改)
本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...
- DJANGO-天天生鲜项目从0到1-009-购物车-Ajax实现添加至购物车功能
本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...
- DJANGO-天天生鲜项目从0到1-009-搜索功能实现(django-haystack+whoosh+jieba)
本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...
随机推荐
- 网络编程 套接字socket TCP UDP
网络编程与套接字 网络编程 网络编程是什么: 网络通常指的是计算机中的互联网,是由多台计算机通过网线或其他媒介相互链接组成的 编写基于网络的应用程序的过程序称之为网络编程. 网络编程最主要的工 ...
- 暑假集训Day2 状压dp 特殊方格棋盘
首先声明 : 这是个很easy的题 可这和我会做有什么关系 题目大意: 在n*n的方格棋盘上放置n个车,某些格子不能放,求使它们不能互相攻击的方案总数. 注意:同一行或同一列只能有一个车,否则会相互攻 ...
- SpringBoot项目部署到tomcat
SpringBoot部署到tomcat 一.修改maven.xml 1.添加<.packaging>war</.packaging>,打包为war包 <packaging ...
- [USACO11JAN]Roads and Planes G【缩点+Dij+拓补排序】
题目 Farmer John正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到T个城镇 (1 <= T <= 25,000),编号为1T.这些城镇之间通过R条道路 (1 < ...
- 一张PDF了解JDK9 GC调优秘籍-附PDF下载
目录 简介 Oracle中的文档 JDK9中JVM参数的变化 废弃的JVM选项 不推荐(Deprecated)的JVM选项 被删除的JVM参数 JDK9的新特性Application Class Da ...
- JavaScript基础函数的属性:记忆模式(019)
函数在Javascript里是有属性的,因为它们是一种特殊对象.事实上,就算是没有明确声明,函数在最初就已经包含了一些固有的属性,比如所有函数都length这个属性,它可以指出函数声明了多少个参数: ...
- 小师妹学JVM之:逃逸分析和TLAB
目录 简介 逃逸分析和栈上分配 TLAB简介 TLAB详解 设置TLAB空间的大小 TLAB中大对象的分配 TLAB空间中的浪费 总结 简介 逃逸分析我们在JDK14中JVM的性能优化一文中已经讲过了 ...
- 08 . Kubernetes之 ingress及Ingress Controller
Ingress简介 ingress是什么? 上篇文章介绍service时有说了暴露了service的三种方式ClusterIP.NodePort与LoadBalance,这几种方式都是在service ...
- 【git】配置git命令行别名
引言:由于有些git命令较长,记起来比较麻烦,为了git工具使用的方便,为命令行取别名有很大的必要. 1.在家目录添加.gitconfig文件. 此文件在创建git仓库时,一般是没有的,需要手动添加. ...
- .NET程序运行原理及基本概念详解
一.引言 我们知道在Java中有虚拟机,代码运行时虚拟机把Java语言编译成与机器无关的字节码,然后再把字节码编译成机器指令执行,那么在.NET中程序是如何运行的呢?其实运行原理是一样的,.NET中的 ...