使用Docker搭建FastDFS+FastDHT+Django单机版文件服务器
使用Docker搭建FastDFS+FastDHT+Django单机版文件服务器
1、下载镜像
docker pull qbanxiaoli/fastdfs
2、创建容器
docker run -d --restart=always --net=host --name=fastdfs -e IP=宿主机内网ip(不是127.0.0.1) -v /var/local:/var/local qbanxiaoli/fastdfs
参数-d:后台运行
--net:宿主机模式
--name:容器名称
-e:指定容器内的环境变量
-v:映射路径、宿主机路径:容器路径
3、测试fastdfs是否搭建成功
docker exec -it fastdfs /bin/bash
echo "Hello FastDFS!">index.html
fdfs_test /etc/fdfs/client.conf upload index.html
4、配置client.conf文件
# connect timeout in seconds
# default value is 30s
connect_timeout=30
# network timeout in seconds
# default value is 30s
network_timeout=60
# the base path to store log files
base_path=/home/fdfs
# tracker_server can ocur more than once, and tracker_server format is
# "host:port", host can be hostname or ip address
#ip为自己服务器ip
tracker_server=ip:22122
#standard log level as syslog, case insensitive, value list:
### emerg for emergency
### alert
### crit for critical
### error
### warn for warning
### notice
### info
### debug
log_level=info
# if use connection pool
# default value is false
# since V4.05
use_connection_pool = false
# connections whose the idle time exceeds this time will be closed
# unit: second
# default value is 3600
# since V4.05
connection_pool_max_idle_time = 3600
# if load FastDFS parameters from tracker server
# since V4.05
# default value is false
load_fdfs_parameters_from_tracker=false
# if use storage ID instead of IP address
# same as tracker.conf
# valid only when load_fdfs_parameters_from_tracker is false
# default value is false
# since V4.05
use_storage_id = false
# specify storage ids filename, can use relative or absolute path
# same as tracker.conf
# valid only when load_fdfs_parameters_from_tracker is false
# since V4.05
storage_ids_filename = storage_ids.conf
#HTTP settings
http.tracker_server_port=80
#use "#include" directive to include HTTP other settiongs
##include http.conf
5、重写Django存储类fastdfs_storage.py
"""
自定义文件存储后端,使得我们的image.url得出的结果前面拼接完整的fdfs请求url前缀
"""
# Storage:存储后端基类
from django.core.files.storage import Storage
from django.conf import settings
from rest_framework.serializers import ValidationError
from fdfs_client.client import Fdfs_client
class FastDFSStorage(Storage):
def open(self, name, mode='rb'):
# 如果需要把上传的文件存储django本地,则需要在本地打开一个文件
return None # 把图片上传fdfs,不是保存本地
# 文件后缀判断
def suffix(self, name):
if len(name.split('.')) == 2:
return name.split('.')[1]
return None
def save(self, name, content, max_length=None):
# 保存文件逻辑:把文件上传到fdfs服务器上
# name是文件名
# content是上传的文件被封装成的文件对象
# 调用fdfs客户端接口实现文件上传到fdfs
conn = Fdfs_client(r'C:\Users\A-z\Desktop\合并\shop\libs\fastdfs\client.conf')
# 调用接口上传
res = conn.upload_by_buffer(content.read(), file_ext_name=self.suffix(name))
# res类型是dict
if res['Status'] != 'Upload successed.':
# 说明上传失败!
raise ValidationError("上传文件失败!")
# fdfs文件标识,需要存储到mysql
file_id = res['Remote file_id']
return file_id # 文件存储后端save方法返回的结果就是存储到mysql中的数据
def url(self, name):
# 该函数决定了,ImageField.url的结果
# name: 当前字段在数据库中存储的值
# name = group1/M00/00/02/CtM3BVrPB4GAWkTlAAGuN6wB9fU4220429
return settings.FDFS_URL + name
def exists(self, name):
# 用于判断文件是否重复保存
# return True # 文件已经存在
# 当前业务返回False,表示"文件不保存本地,直接调用后续的save方法实现上传fdfs"
return False # 文件不存在
6、settings.py
#修改默认存储
DEFAULT_FILE_STORAGE = 'libs.fastdfs.fastdfs_storage.FastDFSStorage'
FDFS_URL = '自己的域名或者ip'
7、配置nginx转发
#服务部署完成的情况https不能显示http链接的图片,在nginx默认80端口添加路径转发规则
docker exec -it fastdfs /bin/bash #进入到容器内部,修改nginx配置
vi /usr/local/nginx/conf/
# events {
# worker_connections 1024;
# }
# http {
# include mime.types;
# default_type application/octet-stream;
# server {
# listen 9999; #修改为自己想用的端口号
# server_name localhost;
# location ~ /group[0-9]/M00 {
# ngx_fastdfs_module;
# }
# }
# }
#进入服务器nginx配置目录,复制location ~ /group[0-9]/M00 { 这段,复制到服务器的默认nginx配置里
# location ~ /group[0-9]/M00 {
# proxy_pass ip:端口;

浙公网安备 33010602011771号