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  # 这个只针对python2

  pip install py3Fdfs

1.2 Win10中/python3

 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.虚拟机中测试代码

# fdfs_client
>>>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'}
# py3fdfs
from fdfs_client.client import Fdfs_client, get_tracker_conf
tracker_path = get_tracker_conf('/etc/fdfs/client.conf')
client = Fdfs_client(tracker_path)
ret = client.upload_by_filename('./test')
print(ret)

 

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包完成文件的上传的封装

 

# 使用FastDFS的python包, 需要指定一个配置文件(tracker server的位置等信息), 和还有storage server的地址, 用于前端访问下载文件
# 这两个参数都放到了settings.py配置文件中配置, 这里导入settings即可使用
# settings.py加入以下配置项

# 设置FastDFS使用的client.conf文件路径
FDFS_CLIENT_CONF = './utils/fdfs/client.conf'
# FastDFS的storage server的地址(Nginx的ip和端口)
FDFS_URL = 'http://192.168.1.111:8888'

 

 

 

from django.core.files.storage import Storage
from django.conf import settings
from fdfs_client.client import Fdfs_client class FDFSStorage(Storage): """FastDFS文件存储类"""
def __init__(self, client_conf=None, base_url=None):
    """初始化"""
  if client_conf is None:
client_conf = settings.FDFS_CLIENT_CONF
  self.client_conf = client_conf

  if base_url is None:
   base_url = settings.FDFS_URL
  self.base_url = base_url

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(self.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 self.base_url + name

 

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

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

3.4 到这里,Django自带的后台管理页面上传文件就会使用FastDFS上传文件,前端显示图片记得字段跟上url: 如"goods.image.url",

goods.image  # /group1/M00/00/00/wKgBb14O4iuAEQoAAADN85_Jt5s945.jpg

goods.image.url  # http://192.168.1.111:8888/group1/M00/00/00/wKgBb14O4iuAEQoAAADN85_Jt5s945.jpg 即nginx配合FastDFS的文件下载地址

posted @ 2020-01-03 14:50  Sylas  阅读(675)  评论(0)    收藏  举报