使用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:端口;
posted @ 2020-12-25 16:14  smomop  阅读(290)  评论(0)    收藏  举报