django框架,nginx, fdfs模块的整合使用
首先声明以下,这里没有那种照抄的代码,都是需要理解结合自己的实际情况操作的,文中只是自己对一些错误和难点的整理,不是整体。
步骤一:fdfs的安装配置
一般选择在/usr/local/src下操作
一 安装依赖包libfastcommon
wget https://github.com/happyfish100/libfastcommon/archive/V1.0.38.tar.gz
tar xvf V1.0.38.tar.gz
cd libfastcommon-1.0.38
./make.sh
./make.sh install
二 安装fastdfs
wget https://github.com/happyfish100/fastdfs/archive/V5.11.tar.gz
tar xvf V5.11.tar.gz -C /usr/local/src/
cd /usr/local/src/fastdfs-5.11
./make.sh
./make.sh install
三 配置Tracker服务
cd /etc/fdfs/
cp tracker.conf.sample tracker.conf
vim tracker.conf
bind_addr = 192.168.152.156 绑定地址,如果为空,绑定主机所有地址
port = 22122
base_path = /data/fastdfs/tracker 保存数据和日志文件的路径
tracker.conf中的bind_addr绑定的地址必须是内网地址,否则无法启动服务。
在本篇结尾会总结,如果是外网服务器,各个配置文件的IP地址的配置情况。
四 配置Storage服务
cd /etc/fsfs
cp storage.conf.sample storage.conf
vim storage.conf
bind_addr = 192.168.152.156
port =23000
base_path = /data/fastdfs/storage
store_path0 = /data/fastdfs/storage 保存文件的路径
tracker_server = 192.168.152.156:22122 管理tracker
storage.conf中的bind_addr,如果是用在服务器,需要使用外网IP绑定,否则客户端无法访问获取图片。
tracker_server要和tracker绑定IP一致
五 启动服务
fdfs_trackerd /etc/fdfs/tracker.conf start
fdfs_storaged /etc/fdfs/storage.conf start
六 客户端配置
cd /etc/fdfs
cp client.conf.sample /etc/fdfs/client.conf
vim client.conf
base_path = /data/fastdfs/tracker
tracker_server = 192.168.152.156:22122
tarcker_server与tracker的绑定地址一致
七 上传文件测试
fdfs_upload_file /etc/fdfs/client.conf 需要上传文件名
当出现 group1/… 就说明上传成功
于是可以通过 http:src=“HTTP://192.168.152.156:8888/group1/…”>访问(需要配置完nginx才能访问)
步骤二:nginx和fastfds-nginx-module的结合
一 因为yum装nginx真的方便很多,这里,吴某人就是直接使用的yum安装nginx,再进行重新编译nginx添加对应fdfs模块。
我们在/usr/local/src目录下载对应的nginx版本以及对应的module
wget https://github.com/happyfish100/fastdfs-nginx-module/archive/V1.20.tar.gz
tar xvf V1.20.tar.gz -C /usr/local/src/
nginx -V // 查看我们yum安装的nginx版本(我们这里是1.16.1),下边一串儿就是我们所需要编译的部分。 图在下面
wget http://nginx.org/download/nginx-1.16.1.tar.gz
tar xvf nginx-1.16.1.tar.gz
cd nginx-1.16.1
./configure .....(那一大串编译配置) --add-module=/usr/local/src/fastds-nginx-module-1.20/src (这个是你解压候后的mfdfs-module下的/src目录)
make & make install
nginx -V // 可以看到我们编译完成的配置项
当make发生错误时,需要修改模块的配置(根据实际情况选择是否包含…/local/…这层目录)
vim /usr/local/src/fastfds-nginx-module-……/src/configngx_module_incs="/usr/local/include/fastdfs /usr/include/fastcommon/”
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"接着重新./configure … ; make ; make install
因为我们是根据yum安装的编译,所以不需要重新拷贝执行命令。
二 模块配置文件
cp /usr/local/src/fast……1.20/src/mod_fastdfs.conf 文件到/etc/fdfs/ 并修改
connect_timeout = 10
tracker_server = 192.168.152.156:22122
url_have_group_name = true
store_path0 = /home/wsx/fdfs/storage //对应存储位置
cd /usr/local/src/fastdfs-5.11/conf
cp http.conf mime.types /etc/fdfs/
tarcker_server配置对应的tracker绑定地址
三 nginx配置
vim /etc/nginx/nginx.conf
server { listen 8888; server_name 192.168.152.156; location ~/group[0-9]/ { ngx_fastdfs_module; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
启动nginx服务即可访问对应文件
步骤三: django和fdfs的交互
一 首先需要自定义一个存储类 项目/utils/fdfs/storage.py
from django.core.files.storage import Storage
from django.conf import settings
from fdfs_client.client import Fdfs_client, get_tracker_conf
class FDFSStorage(Storage):
# 自定义文件存储类
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, max_length=None):
# 保存文件使用的方法。 name为文件名, content为上传文件内容的File对象。
# save函数的返回值,就是表中image的内容
# 1. 创建一个Fdfs_client对象,连接fastdfs数据库
tracker_path = get_tracker_conf(self.client_conf)
client = Fdfs_client(tracker_path)
# 2. 根据内容上传文件
res = client.upload_by_buffer(content.read())
# res格式:
# dict {
# 'Group name': group_name,
# 'Remote file_id': remote_file_id,
# 'Status': 'Upload successed.', 上传成功时的状态码
# 'Local file name': '',
# 'Uploaded size': upload_size,
# 'Stroage IP': stroage_ip
# }
if res.get('Status') != 'Upload successed.':
# 上传失败
raise Exception('上传文件到fast dfs 失败')
# 获取返回文件id
filename = res.get('Remote file_id')
return filename.decode()
def exists(self, name):
# 判断文件名name是否存在,存在返回True,不存在返回False
# 因为我们使用文件内容存放在fastdfs的,直接返回False即可
return False
def url(self, name):
# 返回访问文件的url
return self.base_url+name
二 客户端配置文件
在 项目/utils/fdfs/ 下直接拷贝一个客户端文件,就是上边我们修改过的client.conf
cp /etc/fdfs/client.conf 项目/utils/fdfs/
三 修改django的settings.py
添加默认存储类
# 自定义默认文件存储类
DEFAULT_FILE_STORAGE = 'utils.fdfs.storage.FDFSStorage'
# 设置FDFS使用的客户端文件
FDFS_CLIENT_CONF = './utils/fdfs/client.conf'
# 设置FastDFS存储服务器上的nginx的地址端口
FDFS_URL = 'HTTP://192.168.152.156:8888/'
下面是本人操作中遇到的一些错误,以及解决办法,仅供参考
1 在ngingx程序能启动,但是无法访问网站
ps aux | grep nginx
发现只有一个master,没有worker进程
cat /var/log/nginx/error.log
查看日志,说是Permission denied
然后把fdfs文件存储的目录权限设置成777,就可以了,如果有多层目录,上层目录也要可以访问,这里偷懒了,设置的777,你也可以单独设置setfacl保证安全。
2. 在服务器环境,内网网址的绑定,这里做一下总结
需要使用内网地址绑定的有:
/etc/fdfs/tracker.conf
/etc/fdfs/storage.conf 中的 tracker_addr
/etc/fdfs/mod_fastdfs.conf
…项目目录/utils/fdfs/client.conf
需要使用外网地址的有:
/etc/fdfs/storage.conf 中的bind_addr
// 这里强调说明以下,本人绑定外网地址的时候,无法保存数据,所以在这里没有绑定地址,意指绑定本机所有地址。
/etc/nginx/nginx.conf
…/settings.py