一、FastDFS安装
安装包网盘链接
提取码:pg0a
1、安装fastdfs依赖包
1. 解压缩libfastcommon-master.zip
2. unzip libfastcommon-master.zip
3. 进入到libfastcommon-master的目录中
4. 执行 ./make.sh
5. 执行 sudo ./make.sh install
2、 安装fastdfs
1. 解压缩fastdfs-master.zip
2. unzip fastdfs-master.zip
3. 进入到 fastdfs-master目录中
4. 执行 ./make.sh
5. 执行 sudo ./make.sh install
3、配置跟踪服务器tracker
sudo cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
# 在 /home/python(这个是用户目录)/ 目录中创建目录 fastdfs/tracker
mkdir -p /home/python/fastdfs/tracker
# 编辑/etc/fdfs/tracker.conf配置文件
sudo vim /etc/fdfs/tracker.conf
--------------------------------------------------------------
base_path=/home/python/fastdfs/tracker # 修改 base_path
empty for bind all addresses of this host # 为空的话默认本机ip
bind_addr=
the tracker server port # 默认端口号
port=22122
--------------------------------------------------------------
4、配置存储服务器storage
sudo cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
# 在/home/python/fastdfs/ 目录中创建目录 storage
mkdir -p /home/python/fastdfs/storage
# 编辑/etc/fdfs/storage.conf配置文件
sudo vim /etc/fdfs/storage.conf
# 修改内容
--------------------------------------------------------------
base_path=/home/python/fastdfs/storage
store_path0=/home/python/fastdfs/storage
tracker_server=自己ubuntu虚拟机的ip地址:22122
--------------------------------------------------------------
5、启动tracker 和 storage
sudo service fdfs_trackerd start
或
sudo /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
sudo service fdfs_storaged start
或
sudo /usr/bin/fdfs_storaged /etc/fdfs/storage.conf
6、测试是否安装成功
1、首先配置client客户端
把/etc/fdfs/的client.conf.sample文件复制一份为client.conf
sudo cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
编辑/etc/fdfs/client.conf配置文件
sudo vim /etc/fdfs/client.conf
# 修改内容
base_path=/home/python/fastdfs/tracker
tracker_server=自己ubuntu虚拟机的ip地址:22122
2、上传文件测试否安装成功:
fdfs_upload_file /etc/fdfs/client.conf 要上传的图片文件路径
如果返回类似 group1/M00/00/00/wKiZg1zdFK2AHczeAADR6vRXv_Q539.png
的文件id则说明文件上传成功
二、安装nginx及配置fastdfs-nginx-module web服务器 epoll
1、安装nginx时需要先安装依赖包,不然在后面的安装过程可能会报错,首先查看是否安装依赖包
# dpkg查询,可以官网下载安装
dpkg -l | grep zlib
(下载: http://www.zlib.net/ ) zlib-1.2.8.tar.gz
dpkg -l | grep pcre
(下载: http://www.pcre.org/ ) pcre-8.21.tar.gz
dpkg -l | grep openssl
( 下载: http://www.openssl.org/ ) openssl-1.0.1.tar.gz
# 也可以终端apt安装
sudo apt-get install zlib1g-dev
sudo apt-get install libpcre3 libpcre3-dev
sudo apt-get install openssl libssl-dev
2、安装Nginx 和 fastdfs-nginx-module
-
把 fastdfs-nginx-module-master.zip 拷贝到 /usr/local 目录下解压
sudo cp ./fastdfs-nginx-module-master.zip /usr/local sudo unzip fastdfs-nginx-module-master.zip
-
在 /usr/local 下新建一个nginx目录,把 nginx-1.8.1.tar.gz拷贝到 /usr/local/nginx 目录下解压
sudo mkdir -p /usr/local/nginx sudo cp ./nginx-1.8.1.tar.gz /usr/local/nginx sudo tar -zxvf nginx-1.8.1.tar.gz
-
进入nginx-1.8.1的目录执行以下命令
sudo ./configure --prefix=/usr/local/nginx/ --add-module=../../fastdfs-nginx-module-master/src sudo ./make 或者 sudo make sudo ./make install 或者 sudo make install
注意:若在执行sudo ./make 或者 sudo make时报错,就将对应的Makefile文件夹中(在 /nginx/nginx-1.8.1/objs) 找到
-Werror
(在第二行) 删去, 重新make即可。 -
把 fastdfs-nginx-module-master解压后的目录中src下的 mod_fastdfs.conf 拷贝一份到 /etc/fdfs 中
sudo cp /usr/local/fastdfs-nginx-module-master/src/mod_fastdfs.conf /etc/fdfs/mod_fastdfs.conf
-
修改/etc/fdfs/mod_fastdfs.conf 里面的配置
sudo vim /etc/fdfs/mod_fastdfs.conf # 修改内容 connect_timeout=10 tracker_server=自己ubuntu虚拟机的ip地址:22122 url_have_group_name=true store_path0=/home/python/fastdfs/storage
-
把解压缩的 fastdfs-master/conf 目录中的http.conf 和 mime.types 各拷贝一份到/etc/fdfs 中
sudo cp /home/cfl/Desktop/fastdfs-master/conf/http.conf /etc/fdfs/http.conf sudo cp /home/cfl/Desktop/fastdfsmaster/conf/mime.types /etc/fdfs/mime.types
-
修改 /usr/local/nginx/conf 下 nginx.conf 中的配置 每个server相当于一个服务对象
sudo vim /usr/local/nginx/conf/nginx.conf # 在http部分中添加配置信息如下: server { listen 8888; server_name localhost; location ~/group[0-9]/ { ngx_fastdfs_module; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
3、启动 nginx,进入到 /usr/local/nginx/sbin
# 启动
sudo ./nginx
# 重启
sudo ./nginx -s reload
# 停止
sudo ./nginx -s stop
此时在浏览器中通过 127.0.0.1:8888/id号
可以访问到刚刚上传的图片:
通过fdfs_upload_file上传,要注意后面的id和 storage 组里保存图片的id一致!
-
update df_goods_sku set image=‘group1/M00/00/00/wKi2hF_M5lyAOsIfAAAX1PFRdzg496.jpg’ where id=3; 向数据库变更图片的id:
http://192.168.182.132:8888/group1/M00/00/00/wKi2hF_M5lyAOsIfAAAX1PFRdzg496.jpg
-
注意 : django admin后台管理上传图片 会把图片变成jpeg格式保存,访问时是这样的:
输入下面url是直接下载这个图片
http://192.168.182.132:8888/group1/M00/00/00/wKi2hF_MvteACT-fAAAmv27pX4k1648199
我们也可以创建一个html文件访问图片url解析出来
三、使用python客户端上传测试
1、进入虚拟环境:workon 虚拟环境名称
2、进入fdfs_client-py-master.zip所在目录,用下面命令安装fdfs客户端
pip install fdfs_client-py-master.zip
注意:Windows环境下安装fdfs_client-py-master.zip需要修改里面的配置
1) 修改 fdfs_client-py-master/fdfs_client 目录下的storage_client.py
2)修改 fdfs_client-py-master 目录下的setup.py
导入模块测试:
>>> 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/
wKjzh0_xaR63RExnAAAaDqbNk5E1398.py','Uploaded size':'6.0KB','Local file name':'test'
, 'Storage IP':'192.168.243.133'}
>>> from fdfs_client.client import *
>>> client = get_tracker_conf('/etc/fdfs/client.conf')
四、特别注意
0、fdfs服务器部署时出错:Failed to start fdfs_trackerd.service: Unit fdfs_trackerd.service not found
1、fdfs踩坑全记录
简述主要报错分析:
0)调取的不是这个在venv下面的client.py文件,而是在python3.5下面的dist-packages下面的client.py文件。
错误代码:configparser.NoOptionError:No option ‘connect_timeout’ in section: ‘config’
1)创建client实例对象的时候不能直接传入配置文件的地址字符串,否则报错.
错误代码:TypeError: type object argument after ** must be a mapping, not str
解析:通过模块内get_tracker_conf函数, 获取配置文件后传入
-
我们传入的文件有没有被读取出来?
我们传入的是
一个字符串
,而且使用的是python3解释器,在执行if isinstance(filenams, basestring)这一行肯定是不满足的,甚至会报错,即使它不报错,往下继续执行,到了for filename in filenames
这一行也会报错,因为我们传入的filenames是str类型的
,不是list类型,无法便历,于是在try这里就报错,直接跳到了else,把filename添加到read_ok = []这个空列表中,因此我们最后得到的就是[’/etc/fdfs/client.conf’]。 -
看下basestring是什么类型的数据?
basestring是str和unicode的超类(父类),也是抽象类,因此不能被调用和实例化,但可以被用来判断一个对象是否为str或者unicode的实例,isinstance(obj, basestring)等价于isinstance(obj, (str, unicode)); -
在python2解释器下,得到了true的结果,说明这个basetring的类型是仅存在python 2以前的版本的,在python 3 环境下用它判断,就会报错
2)上传成功后返回的字典内, 其中'Remote file_id'
键对应的值由旧版模块string类型更改为byte类型
.
则, 返回的文件id是byte类型
如果项目中有自定义上传类, 需要解码返回的文件id为字符串,否则服务器报错
.
错误代码:a bytes-like object is required, not 'str'
2、Python3与FastDFS交互(py3Fdfs)
-
现有的FastDFS数据库与python交互, 多是通过下载fdfs-client-py,pip本地安装.
不过该模块只适用于Python2, 且适配FastDFS版本较为古老,可能py3不兼容。所以可能会导致fdfs-client-py安装虽然成功,但是交互时导入失败。
-
在Python3中, 有相对应的py3fdfs模块