什么是FastDFS?
fastDFS 是以C语言开发的一项 《开源》 轻量级分布式文件系统,他对文件进行管理,主要功能有:文件存储,文件同步,文件访问(文件上传/下载),特别适合以文件为载体的在线服务,如图片网站,视频网站等!
分布式文件系统:
基于客户端/服务器的文件存储系统
对等特性允许一些系统扮演客户端和服务器的双重角色,可供多个用户访问的服务器,比如,用户可以“发表”一个允许其他客户机访问的目录,一旦被访问,这个目录对客户机来说就像使用本地驱动器一样
FastDFS由跟踪服务器(Tracker Server)、存储服务器(Storage Server)和客户端(Client)构成。
由于本人没画《流程图》所以我在 ONE 作者那里偷了张图
简单介绍就到这里了下面开始安装:
1. 安装CentOS服务器
1.1CentOS配置IP
安装好后注意要配置静态IP 这样不容易断连
1. 使用 ip addr 查看配置eno 文件
2. 使用 vi /etc/sysconfig/network-scripts/ifcfg-eno16777736 编辑网卡文件
bootproto=dhcp 默认是动态获取IP
onboot=yes 默认是开机关闭网卡
这里我们全部修改掉,然后加上自己的IP 和网关还有DNS ,子掩码
IPADDRO=192.168.234.xxx
NETMASK=255.255.255.0
GATEWAYO=192.168.234.x
DNS1=8.8.8.8
DNS2=114.114.114.114
然后重启网卡,但是重启前要记得先关闭NetworkManager管理套件 它会和网卡冲突
1.先执行:systemctl stop NetworkManager
2.在执行:systemctl disable NetworkManager 不让开机启动
3.最后执行: systemctl restart network
1.2 关闭防火墙
查看防火墙状态: firewall-cmd --state
关闭防火墙:systemctl stop firewalld.service
不让开机启动:systemctl disable firewalld.service
当然:也可以开放防火墙端口 我这里默认开放80端口
开端口命令:firewall-cmd --zone=public --add-port=80/tcp --permanent
--zone #作用域
--add-port=80/tcp #添加端口,格式为:端口/通讯协议
--permanent #永久生效,没有此参数重启后失效
2 开始安装
首先:我们先创建一个目录 我在/usr/local/ 下创建FDS (ps:这里建议在/usr/local/ 目录下 因为听说 其他目录容易出问题,而且有个FDS的服务默认也是在/usr/local/目录下)
cd /usr/local/
mkdir FDS
我学习乐优商城 是创建的是/usr/local/leyou/
FastDFS运行需要一些依赖:
GCC用来对C语言代码进行编译运行,使用yum命令安装:
sudo yum -y install gcc
1.2.2 安装unzip工具
unzip工具可以帮我们对压缩包进行解压
sudo yum install -y unzip zip
1.2.3 安装libevent
sudo yum -y install libevent
接下来 我们将上传一些压缩文件 我一般会在服务器上安装《宝塔面板工具》
宝塔官网
这个Linux 服务面板工具挺好用的 还可以使用ssh终端 和上下传文件
当然FinalShell 工具也可以 也挺好用的
依赖压缩文件下载地址:FastDFS文件一些和Nginx的依赖文件
下载好后解压 将解压后的5个压缩文件直接上传到服务器上
1.2.5 安装libfastcommon-master
这个没有yum包,只能通过编译安装:
-
解压刚刚上传的
libfastcommon-master.zip
unzip libfastcommon-master.zip
-
进入解压完成的目录:
cd libfastcommon-master
-
编译并且安装:
sudo ./make.sh sudo ./make.sh install
到这里为止,所有依赖都已经安装完毕,接下来我们安装FastDFS:
3 安装FastDFS
这里我们也采用编译安装,步骤与刚才的编译安装方式一样:
- 解压
tar -zxvf FastDFS_v5.08.tar.gz
-
进入目录
cd FastDFS
-
编译并安装
sudo ./make.sh sudo ./make.sh install
-
校验安装结果
ll /etc/init.d/ | grep fdfs
其中:
fdfs_trackerd
是tracker启动脚本fdfs_storaged
是storage启动脚本
我们可以在 /etc/fdfs
目录,通过命令查看到以下配置文件模板:
tarcker.conf.sample
是tracker的配置文件模板storage.conf.sample
是storage的配置文件模板client.conf.sample
是客户端的配置文件模板- XXX.conf 文件是我已经安装好的 文件
1.3.2 启动tracker
FastDFS的tracker(踪迹服务器)和storage(文件服务器)在刚刚的安装过程中,都已经被安装了,因此我们安装这两种角色的方式是一样的。不同的是,两种需要不同的配置文件。
我们要启动tracker,就修改刚刚看到的tarcker.conf
,并且启动fdfs_trackerd
脚本即可。
- 编辑tracker配置
首先我们将模板文件进行赋值和重命名:
sudo cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
sudo vim /etc/fdfs/tracker.conf
打开tracker.conf
,修改base_path
配置:
base_path=/DFS/fdfs/tracker # tracker的数据和日志存放目录
- 关闭防火墙
sudo chkconfig iptables off
- 创建目录
刚刚配置的目录可能不存在,我们创建出来
sudo mkdir -p /DFS/fdfs/tracker
-
启动tracker
我们可以使用
sh /etc/init.d/fdfs_trackerd
启动,不过安装过程中,fdfs已经被设置为系统服务,我们可以采用熟悉的服务启动方式:
sudo service fdfs_trackerd start # 启动fdfs_trackerd服务,停止用stop
- 查看tracker是否启动成功
sudo ps -ef | grep fdfs_trackerd
另外,我们可以通过以下命令,设置tracker开机启动:
sudo chkconfig fdfs_trackerd on
1.3.3 启动storage
我们要启动tracker,就修改刚刚看到的tarcker.conf
,并且启动fdfs_trackerd
脚本即可。
- 编辑storage配置
首先我们将模板文件进行赋值和重命名:
sudo cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
sudo vim /etc/fdfs/storage.conf
打开storage.conf
,修改base_path
配置:
base_path=/FDS/fdfs/storage # storage的数据和日志存放目录
store_path0=/FDS/fdfs/storage # storage的上传文件存放路径
tracker_server=192.168.56.XXX:22122 # tracker的地址 (ps:这里的地址需要和虚拟机的服务器地址相对应)
- 创建目录
刚刚配置的目录可能不存在,我们创建出来
sudo mkdir -p /FDS/fdfs/storage
-
启动storage
我们可以使用
sh /etc/init.d/fdfs_storaged
启动,同样我们可以用服务启动方式:
sudo service fdfs_storaged start # 启动fdfs_storaged服务,停止用stop
另外,我们可以通过以下命令,设置tracker开机启动:
sudo chkconfig fdfs_storaged on
最后,通过ps -ef | grep fdfs
查看进程:
1.4 安装Nginx及FastDFS模块
先回到上级目录 注意要回到FDS目录下 能看到nginx压缩文件
cd ..
1.4.1 FastDFS的Nginx模块
-
解压
tar -zxvf fastdfs-nginx-module_v1.16.tar.gz
-
配置config文件
# 进入配置目录 cd /usr/local/FDS/fdfs/fastdfs-nginx-module/src/ # 修改配置 vim config # 执行下面命令(将配置中的/usr/local改为/usr): :%s+/usr/local/+/usr/+g
-
配置mod_fastdfs.conf
# 将src目录下的mod_fastdfs.conf复制到 /etc/fdfs目录: sudo cp /usr/local/FDS/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/ # 编辑该文件 sudo vim /etc/fdfs/mod_fastdfs.conf
-
修改一下配置
connect_timeout=15 # 客户端访问文件连接超时时长(单位:秒)
将tracker_server=tracker:22122 修改为
tracker_server=192.168.56.XXX:22122 # tracker服务IP和端口 (需要和tracker服务器 的配置的IP相同)
url_have_group_name=true # 访问链接前缀加上组名
store_path0=/FDS/fdfs/storage # 文件存储路径(可以存储多个:例如store_path1 ,store_path2 。。。)
-
复制 FastDFS的部分配置文件到/etc/fdfs目录
cd /usr/local/FDS/FastDFS/conf/ cp http.conf mime.types /etc/fdfs/
1.4.2 安装Nginx
-安装nginx的依赖库
sudo yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
- ps:切换到 压缩包目录
cd /usr/local/FDS/
-
解压
tar -zxvf nginx-1.10.0.tar.gz
-打开nginx目录
cd nginx-1.10.0
-
配置
sudo ./configure --prefix=/opt/nginx --sbin-path=/usr/bin/nginx --add-module=/usr/local/FDS/fastdfs-nginx-module/src
-
编译安装
sudo make && sudo make install
-
配置nginx整合fastdfs-module模块
我们需要修改nginx配置文件,在/opt/nginx/config/nginx.conf文件中:
sudo vim /opt/nginx/conf/nginx.conf
将文件中,原来的
server 80{ ...}
部分代码替换为如下代码:server { listen 80; server_name image.XXX(自己的域名).com; # 监听域名中带有group的,交给FastDFS模块处理 location ~/group([0-9])/ { ngx_fastdfs_module; } location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
-
启动
nginx # 启动 nginx -s stop # 停止 nginx -s reload # 重新加载配置
-
设置nginx开机启动
创建一个开机启动的脚本:
vim /etc/init.d/nginx
添加以下内容:
#!/bin/sh # # nginx - this script starts and stops the nginx daemon # # chkconfig: - 85 15 # description: NGINX is an HTTP(S) server, HTTP(S) reverse \ # proxy and IMAP/POP3 proxy server # processname: nginx # config: /etc/nginx/nginx.conf # config: /etc/sysconfig/nginx # pidfile: /var/run/nginx.pid # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ "$NETWORKING" = "no" ] && exit 0 nginx="/usr/bin/nginx" prog=$(basename $nginx) NGINX_CONF_FILE="/opt/nginx/conf/nginx.conf" [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx lockfile=/var/lock/subsys/nginx make_dirs() { # make required directories user=`$nginx -V 2>&1 | grep "configure arguments:.*--user=" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -` if [ -n "$user" ]; then if [ -z "`grep $user /etc/passwd`" ]; then useradd -M -s /bin/nologin $user fi options=`$nginx -V 2>&1 | grep 'configure arguments:'` for opt in $options; do if [ `echo $opt | grep '.*-temp-path'` ]; then value=`echo $opt | cut -d "=" -f 2` if [ ! -d "$value" ]; then # echo "creating" $value mkdir -p $value && chown -R $user $value fi fi done fi } start() { [ -x $nginx ] || exit 5 [ -f $NGINX_CONF_FILE ] || exit 6 make_dirs echo -n $"Starting $prog: " daemon $nginx -c $NGINX_CONF_FILE retval=$? echo [ $retval -eq 0 ] && touch $lockfile return $retval } stop() { echo -n $"Stopping $prog: " killproc $prog -QUIT retval=$? echo [ $retval -eq 0 ] && rm -f $lockfile return $retval } restart() { configtest || return $? stop sleep 1 start } reload() { configtest || return $? echo -n $"Reloading $prog: " killproc $nginx -HUP RETVAL=$? echo } force_reload() { restart } configtest() { $nginx -t -c $NGINX_CONF_FILE } rh_status() { status $prog } rh_status_q() { rh_status >/dev/null 2>&1 } case "$1" in start) rh_status_q && exit 0 $1 ;; stop) rh_status_q || exit 0 $1 ;; restart|configtest) $1 ;; reload) rh_status_q || exit 7 $1 ;; force-reload) force_reload ;; status) rh_status ;; condrestart|try-restart) rh_status_q || exit 0 ;; *) echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}" exit 2 esac
-
修改文件权限,并加入服务列表
# 修改权限 chmod 777 /etc/init.d/nginx # 添加到服务列表 chkconfig --add /etc/init.d/nginx
-
设置开机启动
chkconfig nginx on
当然你也可以自己百度一些开机自动启动的脚本(例如:nginx的开机启动脚本)不过我建议你们用我的,这样比较兼容,不容易出错!
以上就是安装搭建FastDFS 的全部过程!
接下来编写测试用例
import com.github.tobato.fastdfs.domain.StorePath;
import com.github.tobato.fastdfs.domain.ThumbImageConfig;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
@SpringBootTest
@RunWith(SpringRunner.class)
public class FastDFSTest {
// 存储服务器客户端里带跟踪服务器 fdstDFS会先去找跟踪服务器后再找存储服务器
@Autowired
private FastFileStorageClient storageClient;
@Autowired
private ThumbImageConfig thumbImageConfig;
@Test
public void testUpload() throws FileNotFoundException {
//要上传的文件
File file = new File("C:\\Users\\Mi\\Desktop\\2.jpg");
/* 上传并保存图片 参数:1-上传的文件流 null
2- 文件的大小 3-文件的后缀 4-可以不管
*/
StorePath storePath = this.storageClient.uploadFile(new FileInputStream(file),file.length(),"jpg",null);
//带分组的路劲
System.out.println(storePath.getFullPath());
//不带分组的路径
System.out.println(storePath.getPath());
}
@Test
public void testUploadAndCreateThumb() throws FileNotFoundException {
//要上传的文件
File file = new File("C:\\Users\\Mi\\Desktop\\2.jpg");
/* 上传并保存图片 参数:1-上传的文件流 null
2- 文件的大小 3-文件的后缀 4-可以不管
*/
StorePath storePath = this.storageClient.uploadFile(new FileInputStream(file),file.length(),"jpg",null);
//带分组的路劲
System.out.println(storePath.getFullPath());
//不带分组的路径
System.out.println(storePath.getPath());
// 获取缩略图路径
String path = thumbImageConfig.getThumbImagePath(storePath.getPath());
System.out.println(path);
}
}
以下我来说下我搭建遇到的坑、
1。nginx,tracker,storaged,等服务端口被占用
解决:重启
pkill -9 nginx
./nginx -s reload 或者 nginx
sudo /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
sudo /usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
一般我建议安装好后都从新启动一下服务,以防测试代码报错
2。常见错误:
错误一: 无法获取服务端连接资源:can’t create connection to/192.168.245.122:22122
错误二: com.github.tobato.fastdfs.exception.FdfsServerException: 错误码:2,错误信息:找不到节点或文件
解决:
1.关闭防火墙 (注意:centOS6和centOS7不一样)
centOS6:
关闭防火墙: chkconfig iptables off
centOS7:
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
2.检查nginx是否连通
在虚拟机linux检查: 在浏览器输入localhost 或者 你本机IP地址
例如:192.168.53 xxx:80 查看Welcome to nginx!
3.出现上述第二个错误原因可能是:storage.conf配置文件IP地址不对
打开 > vim /etc/fdfs/storage.conf
修改的内容如下:
tracker_server=192.168.56.101:22122 # tracker服务器IP和端口
注意: 192.168.245.128: 也就是我的linux服务器的IP地址 22122 :tracker服务器默认端口号 (前面在安装的时候我已经说过了)
这里的IP一定要改成你自己Linux服务器的IP,否则可能出现错误二
4.重启tracker,storaged,和nginx.在进行测试,问题就解决啦!
希望我的错误经验能够对你有帮助! 有兴趣的朋友可以加我的免费死人交流群:947405150 一起学习交流