FastDFS+nginx+php的完整应用[转储]
FastDFS功能简介:
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
主页地址:http://code.google.com/p/fastdfs/ #目前据说这上面已停止更新
FastDFS特点:
FastDFS主要解决了大容量的文件(主要是图片、视频、音频等小文件)存储和高并发访问的问题,并在文件存取时实现了负载均衡。与其它类GFS系统相比,FastDFS最大的特点在于它是一个轻量级的系统,体现在以下几个方面。
首先,FastDFS的结构比较简单,主要由Client、Tracker server和Storage server三部分组成。Client通过Tracker server得到Storage server的信息,然后直接与Storage server通信访问文件,避免了Tracker server成为瓶颈。
第二,FastDFS不对文件进行分块存储,与支持文件分块存储的DFS相比,更加简洁高效。
第三,FastDFS中的文件ID是由Storage server生成后返回给客户端的。文件ID中包含了组号、文件相对路径和文件名等(文件ID中还包含文件大小、时间戳、源Storage server IP地址、文件内容校验码、随机数等),client可以根据文件ID直接定位到文件所在的组(但具体通过哪个Storage server下载需要询问Tracker server根据负载均衡原则指定)。因此FastDFS不需要存储文件索引信息。而其他文件系统则通常需要由NameServer存储文件索引信息,如mogileFS采用MySQL数据库来存储文件索引以及系统相关的信息,而MySQL很容易成为系统瓶颈。
FastDFS特性:
文件不分块存储,上传的文件和OS文件系统中的文件一一对应
支持相同内容的文件只保存一份,节约磁盘空间
下载文件支持HTTP协议,可以使用内置Web Server,也可以和其他Web Server配合使用
支持在线扩容
支持主从文件
存储服务器上可以保存文件属性(meta-data)V2.0网络通信采用libevent,支持大并发访问,整体性能更好
FastDFS架构示意图:

文件上传流程:

1. Client询问Tracker server应上传到哪个Storage server;
2. Tracker server返回一台可用的Storage server,返回的数据为该Storage server的IP地址和端口;
3. Client直接和该Storage server建立连接,进行文件上传。
4. Storage server返回新生成的文件ID,文件上传结束。
5. 连接关闭。
文件下载流程:

1. client询问tracker可以下载指定文件的storage,参数为文件ID(组名和文件名);
2. tracker返回一台可用的storage;
3. client直接和storage通信完成文件下载。
4. 连接关闭。
FastDFS论坛:http://bbs.chinaunix.net/forum-240-1.html
FastDFS google code:http://code.google.com/p/fastdfs/
关于tracker server 和 storage server之间是如何交互的,请看我在附件中的PPT、以及PDF格式的电子书,还有一个是关于配置文件的参数以及fastdfs各项参数是如何调优的,都有详细的说明,下面就让我们开始配置过程吧!
配置环境:
CentOS 5.8 x 64
tracker server: 192.168.25.204
storage server: 192.168.25.207
php 客户端 :192.168.25.205
一、安装部署
1、配置tracker server
解决依赖关系
1.[root@varnish ~]# tar xf libevent-2.0.21-stable.tar.gz2.[root@varnish ~]# cd libevent-2.0.21-stable3.[root@varnish libevent-2.0.21-stable]# ./configure --prefix=/usr/local/libevent4.[root@varnish libevent-2.0.21-stable]# make5.[root@varnish libevent-2.0.21-stable]# make install6.[root@varnish libevent-2.0.21-stable]# echo '/usr/local/libevent/include/' >> /etc/ld.so.conf7.[root@varnish libevent-2.0.21-stable]# echo '/usr/local/libevent/lib/' >> /etc/ld.so.conf8.[root@varnish libevent-2.0.21-stable]# ldconfig安装fastdfs
注意:我们这里使用的是最新版本的fastdfs,由于最新版的fastdfs取消了自带的http功能,所以这里我们就不对make.sh做修改。
1.[root@varnish ~]# tar xf FastDFS_v4.07.tar.gz2.[root@varnish ~]# cd FastDFS3.[root@varnish FastDFS]# ./make.sh C_INCLUDE_PATH=/usr/local/libevent/include/ LIBRARY_PATH=/usr/local/libevent/lib/4.[root@varnish FastDFS]# ./make.sh install5.[root@varnish FastDFS]# ls /etc/fdfs/6.client.conf http.conf mime.types storage.conf tracker.conf配置文件解释:
tracker.conf //负责均衡调度服务器配置文件
client.conf //客户端上传配置文件
http.conf //http服务器配置文件
storage.conf//文件存储服务器配置文件
mime.types //文件类型配置文件
修改tracker server的配置文件
1.[root@varnish ~]# vim /etc/fdfs/tracker.conf2.bind_addr= 改为 bind_addr=192.168.25.2043.base_path=/home/yuqing/fastdfs 改为 base_path=/data/fastdfs4.http.server_port=8080 改为 http.server_port=80创建/data/fastdfs,用于存放tracker日志、storage server等信息
1.[root@varnish ~]# mkdir -p /data/fastdfs2.启动tracker server3.[root@varnish ~]# /usr/local/bin/fdfs_trackerd /etc/fdfs/tracker.conf
2、配置storage server
上述安装过程是一样的这里就不在进行演示,请大家见谅!
1.修改storage server的配置文件:2.[root@web2 ~]# vim /etc/fdfs/storage.conf3.bind_addr= 改为 bind_addr=192.168.25.2074.base_path=/home/yuqing/fastdfs 改为 base_path=/data/fastdfs5.store_path0=/home/yuqing/fastdfs 改为 store_path0=/data/fastdfs6.tracker_server=192.168.209.121:22122 改为 tracker_server=192.168.25.204:221227.http.server_port=8888 改为 http.server_port=80创建数据目录,并启动storage server(有刷屏的感觉)


查看tracker和storage的链接情况:

3、测试上传文件
我们这里在tracker server上配置客户端上传文件
1.[root@varnish ~]# vim /etc/fdfs/client.conf2.base_path=/home/yuqing/fastdfs 改为 base_path=/data/fastdfs3.tracker_server=192.168.0.197:221224.改为5.tracker_server=192.168.25.204:22122上传个文件,如果上传成功,会返回一个url,我们记住这个url,等下要用到

http://192.168.25.207/group1/M00/00/00/wKgZz1IEYnSASqs2AAAGgpr6pLY3507236_big
二、在storage server上安装nginx
1、安装nginx关于fastdfs集合的扩展模块,注意这个模块nginx默认的编译模块中没有,需手动下载安装
1.[root@web2 ~]# tar xf fastdfs-nginx-module_v1.15.tar.gz2.[root@web2 ~]# cd fastdfs-nginx-module只需解压开就可,这里我们再解释一下,好些朋友,在加载这个模块的时候,会报一些很莫名其妙的错,这个本人在编译的时候也是亲身体会,百思不得其解,后来经过点播才发现,版本不匹配,这里fastdfs官网给有详细说明,请看模块解压目录下的HISTORY、INSTALL问件,这里面很详细的安装和版本匹配说明(吃一堑一定要长一智)
安装nginx之前需要解决很多依赖关系的,这里不做说明,我这里是安装过得了,就不贴出来了,请大家按照网上的教程,解决依赖关系!
01.[root@web2 ~]# tar xf nginx-1.4.1.tar.gz02.[root@web2 ~]# cd nginx-1.4.103.[root@web2 nginx-1.4.1]# ./configure \04.> --prefix=/usr \05.> --sbin-path=/usr/sbin/nginx \06.> --conf-path=/etc/nginx/nginx.conf \07.> --error-log-path=/var/log/nginx/error.log \08.> --http-log-path=/var/log/nginx/access.log \09.> --pid-path=/var/run/nginx/nginx.pid \10.> --lock-path=/var/lock/nginx.lock \11.> --user=nginx \12.> --group=nginx \13.> --with-http_ssl_module \14.> --with-http_flv_module \15.> --with-http_stub_status_module \16.> --with-http_gzip_static_module \17.> --http-client-body-temp-path=/var/tmp/nginx/client/ \18.> --http-proxy-temp-path=/var/tmp/nginx/proxy/ \19.> --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \20.> --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \21.> --http-scgi-temp-path=/var/tmp/nginx/scgi \22.> --with-pcre \23.> --add-module=/root/fastdfs-nginx-module/src24.[root@web2 nginx-1.4.1]# make25.[root@web2 nginx-1.4.1]# make install1.[root@web2 ~]# cp /root/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/2.[root@web2 ~]# vim /etc/fdfs/mod_fastdfs.conf3.base_path=/tmp 改为 base_path=/data/fastdfs4.tracker_server=tracker:22122 改为 tracker_server=192.168.25.204:221225.store_path0=/home/yuqing/fastdfs 改为 store_path0=/data/fastdfs[root@web2 ~]# ln -s /data/fastdfs/data /data/fastdfs/data/M00
修改nginx的配置文件
01.[root@web2 ~]# vim /etc/nginx/nginx.conf02.在server段添加如下内容:03.location /group1/M00{04.alias /data/fastdfs/data;05.ngx_fastdfs_module;06.}07.[root@web2 ~]# /usr/sbin/nginx -t08.ngx_http_fastdfs_set pid=2814509.nginx: the configuration file /etc/nginx/nginx.conf syntax is ok10.nginx: configuration file /etc/nginx/nginx.conf test is successful11.[root@web2 ~]# /usr/sbin/nginx12.ngx_http_fastdfs_set pid=28148然后我们在浏览器中输入上边上传的url,访问一下:

我们可以很清楚的看到400,Bad Request,那么我们换种访问方式试试
1.修改nginx的配置文件2.[root@web2 ~]# vim /etc/nginx/nginx.conf3.location /M00{4.alias /data/fastdfs/data;5.ngx_fastdfs_module;6.}1.之后重启服务2.[root@web2 ~]# /usr/sbin/nginx -s stop3.ngx_http_fastdfs_set pid=289474.[root@web2 ~]# /usr/sbin/nginx5.ngx_http_fastdfs_set pid=28948然后我们把url中的group1手动去掉,访问一下:

很明显可以访问,我在配置的时候也是百思不得其解,网上也有此类问题,无意间打开了一个相关的帖子,终于让我找到了答案。
1.我们把nginx的配置文件修改回来2.location /group1/M00{3.alias /data/fastdfs/data;4.ngx_fastdfs_module;5.}修改fastdfs的模块配置文件
1.[root@web2 ~]# vim /etc/fdfs/mod_fastdfs.conf2.url_have_group_name = false 改为 true #关于啥意思,配置文件中有解释然后我们再来访问一下:

如上图所示,ok了,加上组名可以访问,到这里基本上已经配置完成了
但是我在网上搜解决上述解决方法时,看到了一篇博文,结合了php,我觉得有必要分享一下,那好继续我们苦逼的配置吧!
三、PHP客户端配置
因为php的客户端安装也会依赖fastdfs本身的一些库文件,所以请保证已经安装了fastdfs
安装过程和上边一样,这里参考上边安装过程!
这个php客户端所在的测试机本来我就在上边搭建好了LNMP,所以只需参考上述过程安装fastdfs即可!
01.[root@web1 ~]# cd /root/FastDFS/php_client02.[root@web1 php_client]# /usr/local/php/bin/phpize03.Configuring for:04.PHP Api Version: 2009062605.Zend Module Api No: 2009062606.Zend Extension Api No: 22009062607.[root@web1 php_client]# ./configure --with-php-config=/usr/local/php/bin/php-config08.[root@web1 php_client]# make && make install09.[root@web1 php_client]# cat fastdfs_client.ini >> /usr/local/php/etc/p10.pear.conf php-fpm.conf php-fpm.conf.default11.[root@web1 php_client]# cat fastdfs_client.ini >> /etc/php.ini验证模块是否被正常加载
1.[root@web1 php_client]# /usr/local/php/bin/php -m | grep fastdfs_client2.fastdfs_client #说明模块已加载 www.it165.net3. 4.重新加载php5.[root@web1 php_client]# service php-fpm reload修改为如下配置:
1.tracker_server=192.168.25.204:221222.http.tracker_server_port=803. 4.重新加载php5.[root@web1 php_client]# service php-fpm reload然后我们写个小页面,写个php脚本上传
1.[root@web1 ~]# echo "php client is here." > /opt/upload.txt2.[root@web1 ~]# vim test.php3.<?php4.var_dump(function_exists('fastdfs_storage_upload_by_filename'));5.$ret = fastdfs_storage_upload_by_filename('/opt/upload.txt');6.var_dump($ret);7.?>执行php脚本
[root@web1 ~]# /usr/local/php/bin/php test.php
结果如下图所示:

我们来访问下试试;

到此为止我们关于fastdfs的完整应用就介绍到此了,希望大家都动手做一下!还有关于fastdfs php插件的使用方法和函数调用方法,可以看/root/FastDFS/php_client/README,里面有详细介绍!此篇博文过程中如果有什么不对的地方,还请朋友们们指正,大家一起进步!
http://blog.chinaunix.net/uid-27003384-id-4059897.html
FastDFS+nginx+php的完整应用[转储]的更多相关文章
- 简单的 FastDFS + Nginx 应用实例
版权声明:本文为GitChat作者的原创文章,未经 GitChat 同意不得转载. https://blog.csdn.net/GitChat/article/details/79479148 wx_ ...
- Ansible + shell 实现部署fastdfs+nginx 实现图片服务器并提供动态缩放功能;
因为公司阿里服务器变动几次,手动部署了好几次fastdfs+nginx,于是就想到了自动化部署,以下为脚本内容,由于只是想把着功能实现,并未有完完整的判断逻辑: 以下为ansible-playbook ...
- 在虚拟机中配置FastDFS+Nginx模块
先上部署图 提示一下, ip 192.168.72.138 上面部署了两个group, 分别为 group1和g2. 另外, 同组之内的 port 要保持一致. 一.安装准备 1. #每台机器都添加两 ...
- FastDFS + Nginx代理方式访问
FastDFS + Nginx代理方式访问 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.在storage上安装nginx 1>.下载nginx软件(http://ngi ...
- FastDFS+Nginx+fastdfs-nginx-module集群搭建
一.实验环境说明 操作系统: Centos 6.6 x64 FastDFS 相关版本: fastdfs-5.05 fastdfs-nginx-module-v1.16 libfastcommon-v1 ...
- miya--图片上传--搭建分布式文件服务器(FastDFS+Nginx)
资料获取(FastDFS+Nginx): 链接:https://pan.baidu.com/s/1kUI5WH5 密码:kzfd 安装rz,sz功能: yum install lrzsz 主攻: 利用 ...
- 分布式FastDfs+nginx缓存高可用集群构建
介绍: FastDFS:开源的高性能分布式文件系统:主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡 FastDFS:角色:跟踪服务器(Tracker Server).存储服务器(St ...
- 虚拟机上图片服务器搭建(FastDFS+nginx)
文件服务器 0.提前建好需要的文件夹(/home/fastdfs) /home/fastdfs/tracker /home/fastdfs/storage /home/fastdfs/storage/ ...
- SpringBoot集成FastDFS+Nginx整合基于Token的防盗链
为什么要用SpringBoot? SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人 ...
随机推荐
- 一个简单的139邮箱登录脚本--->java-selenium
import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebE ...
- linux_2
mac和linux上默认安装着SSH客户端,Windows上需要自己安装个软件. Windows下SSH客户端的安装:建议从官方网站下载正式程序安装(免费) Putty:https://www.chi ...
- 【转】解决WPF图片模糊最佳方法(绑定PixelWidth与PixelHeight)
解决WPF图片模糊最佳方法(绑定PixelWidth与PixelHeight) 转载自:http://www.360doc.com/content/13/1126/09/10504424_332211 ...
- BZOJ2120 数颜色(树套树)
B. 数颜色 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令:1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色 ...
- 【简●解】[AHOI2009]中国象棋
[题目大意] 叫你在\(n×m\)的棋盘上放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,问有多少种放置方法. [关键词] \(DP\) 分类讨论 乘法和加法原理 [分析] 仔细观察就会发 ...
- 利用RestTemplate进行http调用
在对接API的时候,会涉及调用第三方的服务,这时候可以利用RestTemplate进行调用,下面给大家展示一个简单的调用demo. package com.tanlu.user.api.control ...
- 文本三剑客之grep
接受正则表达式,按行匹配,将会过滤出匹配的所有行 格式: grep [OPTION]... PATTERN [FILE]... 可以看出,grep后可以同时接多个文件 选项OPTIO ...
- 【集合遍历-Java】
遍历List集合的三种方法 1.增强for循环 for(String str : list) {//其内部实质上还是调用了迭代器遍历方式,这种循环方式还有其他限制,不建议使用. System.out. ...
- Django框架基础知识13-auth系统
我们昨天登录admin时创建的用户信息是存放在哪里了呢? auth系统的数据表: 从表的名称我们就能看出, auth_user,auth_group,auth_permission分别存放了用户,用户 ...
- shell for mysql backup in linux
今天上班只有一台linux系统,就学着在linux上写了个脚本,没啥技术含量 省得每天敲代码备份 没有设置自动备份时间,这里可以参照 http://www.th7.cn/db/mysql/201305 ...