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 ../
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
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'