CentOS7中安装使用FastDFS上传文件并配合nginx下载文件&与python交互

1.先安装libfastcommon, 它里面包含了FastDFS以来的一些包, 在安装FastDFS

找到libfastcommon的git地址, 复制下载链接, 在centos上下载压缩包

wget https://github.com/happyfish100/libfastcommon/archive/master.zi

 

2.解压到当前目录, 可以使用-d 参数指定目录

unzip master.zip.1  # 因为先下载了FastDFS压缩包的名称也是master.zip,所以下载libfastcommon压缩包的名称多了".1"

 

3.安装libfastcommon

cd libfastcommon  # 进入解压后的文件夹
.
/make.sh # 编译
sudo ./make.sh install # 安装

 

4.安装后, libfastcommon(.so)默认安装到了/usr/lib64/ 和 /usr/lib/ 位置(CentOS7), 同样的方法继续安装FastDFS

# GitHub上获取源码压缩包下载地址, 然后下载
wget https://github.com/happyfish100/fastdfs/archive/master.zip
# 解压到 /usr/local/fastdfs/ 目录 unzip master.zip
# 进入解压后的文件 cd fastdfs-master/

# 编译 ./make.sh # 安装 sudo ./make.sh install

 

5.FastDFS 配置跟踪服务器tracker

# 复制一份模板配置文件 作为配置文件
sudo cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf

# 在家目录中创建目录 ~/fastdfs/tracker
mkdir -p ~/fastdfs/tracker

# 打开配置文件
sudo vim /etc/fdfs/tracker.conf

# 修改 base_path 的值为刚刚在家目录中创建的目录, 指定基本配置文件等保存的位置
base_path
=/home/Sylas/fastdfs/tracker

配置文件参数说明:

  # 值为空, 会绑定本机所有地址

  bind_addr=

  # track server 监听端口

  port=22122

 

6.FastDFS 配置存储服务器 storage

# 复制一份模板配置文件 作为配置文件
sudo cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf

# 创建storage目录, 路径: ~/fastdfs/storage
mkdir -p ~/fastdfs/storage

# 打开配置文件
sudo vim /etc/fdfs/storage.conf

# 修改 base_path 的值为刚刚在家目录中创建的目录 
  base_path=/home/Sylas/fastdfs/storage
# 修改store_path0, tracker_server
  store_path0=/home/Sylas/fastdfs/storage # 指定上传文件保存的位置
  track_server=自己的CentOS虚拟机的 ip地址:2212 # 指定管理此storage server的tracker server的ip地址, 如: 192.168.1.111:22122

 

7.启动tracker server 和 storage server

 

# 启动track server
sudo /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf

# 启动storage_server
sudo /usr/bin/fdfs_storaged /etc/fdfs/storage.conf

8.配置FastDFS客户端,测试是否安装成功

 

# 配置文件
sudo cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf

# 编辑 /etc/fdfs/client.conf配置文件
sudo vim /etc/fdfs/client.conf

# 修改内容: 
    base_path=/home/Sylas/fastdfs/tracker
    tracker_server=自己的CentOS的 IP地址:22122

fdfs_upload_file 命令 测试上传文件, "fdfs_upload_file client配置文件 上传的文件"

fdfs_upload_file /etc/fdfs/client.conf /home/Sylas/python/webprojects/hello_python/dailyfresh/static/images/goods02.jpg 
group1/M00/00/00/wKgBb14O4iuAEQoAAADN85_Jt5s945.jpg  # 返回文件id, 包含服务器存储此文件的实际文件名, 说明上传文件成功!

9.安装nginx并安装nginx的fastdfs-nginx-module,配合完成下载功能

# 从官网拷贝要下载版本的下载地址, 进入 ~/download/ 目录下载
wget http://nginx.org/download/nginx-1.16.1.tar.gz

# 从GitHub上拷贝fastdfs-nginx-module的源码包, 并下载(指定保存的文件名)
wget -O fastdfs-nginx-module.zip https://github.com/happyfish100/fastdfs-nginx-module/archive/master.zip

# 解压nginx包
tar zxvf nginx-1.16.1.tar.gz

# 解压nginx即将要安装的 fastdfs-nginx-module, 解压后的目录: fastdfs-nginx-module-master/
unzip fastdfs-nginx-module.zip

# 进入nginx解压后的目录
cd nginx-1.16.1/

# 创建nginx的安装目录
sudo mkdir /usr/local/nginx

# 预编译nginx, 指定nginx的安装位置, 以及要安装模块fastdfs-nginx-module-master的/src/ 目录, 这里需要绝对路径,不能使用"~"代替根目录!
sudo ./configure --prefix=/usr/local/nginx/ --add-module=/home/Sylas/download/fastdfs-nginx-module-master/src

# 编译并安装nginx
sudo make &&  sudo make install

# 回到~/download/目录
cd ../
View Code

10.一些配置文件的相关操

# 复制一份配置文件, 到fastdfs配置文件目录下
sudo cp fastdfs-nginx-module-master/src/mod_fastdfs.conf /etc/fdfs/mod_fastdfs.conf

# 修改配置文件
sudo vim /etc/fdfs/mod_fastdfs.conf
修改内容:
    connect_timeout=10
    tracker_server=CentOS虚拟机IP:22122
    url_have_group_name=true
    store_path0=/home/Sylas/fastdfs/storage

# 拷贝fastdfs解压后的文件夹下的conf/下的http.conf 和 mime.types文件 到 /etc/fdfs/ 目录下
sudo cp fastdfs-master/conf/http.conf /etc/fdfs/http.conf
sudo cp fastdfs-master/conf/mime.types /etc/fdfs/mime.types

# 修改nginx配置文件
sudo vim /usr/local/nginx/conf/nginx.conf
    server {
         listen           8888;
         server_name localhost;
         # 如果nginx服务器接收的请求路径中包含了 /group[0-9] , 就请求fastdfs模块
         location ~/group[0-9]/ {
             ngx_fastdfs_module;
         }

         error_page    500 502 503 504    /50x.html;

         location = /50x.html {
             root    html;
         }
    }

# 启动nginx
sudo /usr/local/nginx/sbin/nginx

 

11.测试下载

之前上传文件返回的文件id是"group1/M00/00/00/wKgBb14O4iuAEQoAAADN85_Jt5s945.jpg", nginx刚刚配置的监听的是8888端口, 所以这里我们下载要访问的路径是:

http://192.168.1.111:8888/group1/M00/00/00/wKgBb14O4iuAEQoAAADN85_Jt5s945.jpg

 

当然,CentOS防火墙默认关闭了Nginx监听的8888端口, 还有FastDFS的tracker和storage监听的22122端口, 23000端口, 需要开启端口再测试

sudo firewall-cmd --zone=public --add-port=8888/tcp --permanent

sudo firewall-cmd --zone=public --add-port=22122/tcp --permanent

sudo firewall-cmd --zone=public --add-port=23000/tcp --permanent

开放端口后,记得要重启防火墙: sudo firewall-cmd --reload

 

在浏览器地址栏输入地址 http://192.168.1.111:8888/group1/M00/00/00/wKgBb14O4iuAEQoAAADN85_Jt5s945.jpg 测试

浏览器报404, 查看nginx日志得知是权限问题, 修改nginx配置文件, 添加用户user项, sudo vim /usr/local/nginx/conf/nginx.conf

1
2
#user nobody; 3 user Sylas; 4 worker_process 1;
..

再次访问正常显示图片!

 

与python交互

1.安装python包fdfs_client-py

1.1 Linux中

 pip install fdfs_client-py

1.2 Win10中

 a. 从github下载好包(https://github.com/JaceHo/fdfs_client-py)解压到虚拟环境中, 我的路径是"F:\python3_virtualenv\python3_django2_virtualenv\Lib\site-packages\fdfs_client-py-master"; 打开"F:\python3_virtualenv\python3_django2_virtualenv\Lib\site-packages\fdfs_client-py-master\fdfs_client\storage_client.py", 屏蔽第12行: 第12行  # from fdfs_client.sendfile import *;

 

 b. 打开"F:\python3_virtualenv\python3_django2_virtualenv\Lib\site-packages\fdfs_client-py-master\setup.py"文件, 屏蔽sdict字典中的'ext_modules'
...

...
# 'ext_modules': [Extension('fdfs_client.sendfile',                  屏蔽我~      
#                           sources=['fdfs_client/sendfilemodule.c'])],    屏蔽我~

 

 c. 安装 pip install mutagen  和 pip install requests

 d. 进入目录"F:\python3_virtualenv\python3_django2_virtualenv\Lib\site-packages\fdfs_client-py-master", 输入命令 "activate" 进入python虚拟环境, 最后python setup.py install ,成功!

 

2.虚拟机中测试代码

 

>>>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/wKgBb14P6GaAaa4qAADN85_Jt5s331.py', 'Upload size': '6.0kb', 'Local file name': 'test', 'Storage IP': '192.168.1.111'}

 

 

 

3.Django中怎么使用FastDFS

在django中,存储文件使用的默认类是继承自Storage类的FileSystemStorage类, 这个类会将直接将文件存储在默认的位置, 如果我们需要使用FastDFS存储文件, 需要自定义文件存储类, 让这个类继承自Storage类, 并重写它的_open()和_save()方法, 在重写方法中我们就可以使用FastDFS了

3.1 创建一个FastDFS的python包配置文件: /utils/fdfs/client.conf, 修改django服务器存放FastDFS包的日志等文件路径 base_path=.., 还有FastDFS的tracker server的IP地址 tracker_server=..

 

# 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=F:\User\Fdfs

# tracker_server can ocur more than once, and tracker_server format is
#  "host:port", host can be hostname or ip address
tracker_server=192.168.1.111: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
View Code

 

3.2 创建一个python包: /utils/fdfs/, 在创建一个python模块: /utils/fdfs/storage.py, 写一个继承自Storage的类, 重写父类_save()方法, 使用fdfs_client-py包完成文件的上传的封装

from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client

class FDFSStorage(Storage):
    """FastDFS文件存储类"""
    def _open(self, name, mode='rb'):
        """打开文件时使用"""
        pass

    def _save(self, name, content):
        """保存文件时使用"""
        # name: 上传文件的名字
        # content: 包含需要上传文件的File类的一个对象

        # 创建一个Fdfs_client对象, 程序通过client.conf文件去找FastDFS的tracker server
        client = Fdfs_client('./utils/fdfs/client.conf')

        # 上传文件到FastDFS系统中
        res = client.upload_by_buffer(content.read())
        # res
        # {
        #     '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('上传文件到FastDFS失败')

        # 获取返回的文件id
        filename = res.get('Remote file_id')

        return filename

    def exists(self, name):
        """Django判断文件名是否可用, True表示文件已经存在, 就不会上传, 由于我们这里会将文件叫由FastDFS管理,
        FastDFS会处理文件名重复等问题, 所以此方法返回False即可"""
        return F
from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client

class FDFSStorage(Storage):
    """FastDFS文件存储类"""
    def _open(self, name, mode='rb'):
        """打开文件时使用"""
        pass

    def _save(self, name, content):
        """保存文件时使用"""
        # name: 上传文件的名字
        # content: 包含需要上传文件的File类的一个对象

        # 创建一个Fdfs_client对象, 程序通过client.conf文件去找FastDFS的tracker server
        client = Fdfs_client('./utils/fdfs/client.conf')

        # 上传文件到FastDFS系统中
        res = client.upload_by_buffer(content.read())
        # res
        # {
        #     '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('上传文件到FastDFS失败')

        # 获取返回的文件id
        filename = res.get('Remote file_id')

        return filename

    def exists(self, name):
        """Django判断文件名是否可用, True表示文件已经存在, 就不会上传, 由于我们这里会将文件叫由FastDFS管理,
        FastDFS会处理文件名重复等问题, 所以此方法返回False即可"""
        return False

    # 使用Django默认的后台管理系统上传图片就可以正常的使用FastDFS保存文件了,保存一个文件后,
    # Django将会拿到文件的id(类似"/group1/M00/00/00/wKgBb14O4iuAEQoAAADN85_Jt5s945.jpg")存储到数据库中商品表的image字段,
    # 所以前端显示图片的时候图片地址直接填 "goods.image"是不对的, 如果填 "goods.image.url" 就会调用此函数, 在此函数中做好
    # 图片正确地址的拼接返回即可
    def url(self, name):
        """返回访问文件的url路径, name就是文件保存到storage server里面的文件id(文件名)"""
        return 'http://192.168.1.111:8888/' + name

 

3.3 Django的默认文件存储类是FileSystemStorage, 在settings.py中添加配置项, 将Django的文件存储类设置为刚刚封装的类

# 设置Django的文件存储类
DEFAULT_FILE_STORAGE='utils.fdfs.storage.FDFSStorage'

3.4 前端显示图片记得字段跟上url: 如"goods.image.url"

你可能感兴趣的:(CentOS7中安装使用FastDFS上传文件并配合nginx下载文件&与python交互)