23-fastDFS+nginx的安装、配置、使用步骤及报错解决

一、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模块

3、这里[py3fdfs]直接pip install py3fdfs安装

py3fdfs

4、fastdfs中tracker、storage、client的理解与学习

猜你喜欢

转载自blog.csdn.net/mmmmmCJP/article/details/113140013